आपसी बहिष्कार

From alpha
Jump to navigation Jump to search

दो नोड्स, i और i + 1, एक साथ हटाए जाने पर नोड बनता है i + 1हटाया नहीं जा रहा.

कंप्यूटर विज्ञान में, पारस्परिक बहिष्कार समवर्ती नियंत्रण की एक संपत्ति है, जिसे दौड़ की स्थिति को रोकने के उद्देश्य से स्थापित किया गया है। यह आवश्यकता है कि एक थ्रेड (कंप्यूटिंग) कभी भी एक महत्वपूर्ण अनुभाग में प्रवेश नहीं करता है, जबकि निष्पादन का एक समवर्ती कंप्यूटिंग थ्रेड पहले से ही उक्त महत्वपूर्ण अनुभाग तक पहुंच रहा है, जो समय के अंतराल को संदर्भित करता है जिसके दौरान निष्पादन का एक थ्रेड एक साझा संसाधन या साझा मेमोरी तक पहुंचता है।

साझा संसाधन एक डेटा ऑब्जेक्ट है, जिसे दो या दो से अधिक समवर्ती थ्रेड संशोधित करने का प्रयास कर रहे हैं (जहां दो समवर्ती पढ़ने के संचालन की अनुमति है लेकिन, दो समवर्ती लेखन संचालन या एक पढ़ने और एक लिखने की अनुमति नहीं है, क्योंकि इससे डेटा असंगतता होती है)। पारस्परिक बहिष्करण एल्गोरिदम यह सुनिश्चित करते हैं कि यदि कोई प्रक्रिया पहले से ही डेटा ऑब्जेक्ट [क्रिटिकल सेक्शन] पर लेखन कार्य कर रही है, तो किसी अन्य प्रक्रिया/थ्रेड को उसी ऑब्जेक्ट तक पहुंचने/संशोधित करने की अनुमति नहीं है, जब तक कि पहली प्रक्रिया डेटा ऑब्जेक्ट [क्रिटिकल सेक्शन] पर लिखना समाप्त न कर ले। और ऑब्जेक्ट को पढ़ने और लिखने के लिए अन्य प्रक्रियाओं के लिए जारी किया।

आपसी बहिष्करण की आवश्यकता को सबसे पहले एडस्गर डब्ल्यू डिज्क्स्ट्रा ने अपने मौलिक 1965 के पेपर सॉल्यूशन ऑफ ए प्रॉब्लम इन समवर्ती प्रोग्रामिंग कंट्रोल में पहचाना और हल किया था।[1][2] जिसे समवर्ती एल्गोरिदम के अध्ययन में पहले विषय के रूप में श्रेय दिया जाता है।[3] व्यवहार में पारस्परिक बहिष्कार क्यों महत्वपूर्ण है इसका एक सरल उदाहरण चार वस्तुओं की एकल लिंक की गई सूची का उपयोग करके देखा जा सकता है, जहां दूसरे और तीसरे को हटाया जाना है। दो अन्य नोड्स के बीच स्थित एक नोड को हटाने का कार्य पिछले नोड के अगले पॉइंटर (कंप्यूटर प्रोग्रामिंग) को अगले नोड को इंगित करने के लिए बदलकर किया जाता है (दूसरे शब्दों में, यदि नोड i को हटाया जा रहा है, फिर नोड का अगला सूचक i – 1 को पॉइंट टू नोड में बदल दिया गया है i + 1, जिससे लिंक की गई सूची से नोड का कोई भी संदर्भ हट जाएगा i). जब ऐसी लिंक की गई सूची को निष्पादन के कई धागों के बीच साझा किया जा रहा है, तो निष्पादन के दो धागे एक साथ दो अलग-अलग नोड्स को हटाने का प्रयास कर सकते हैं, निष्पादन का एक धागा नोड के अगले सूचक को बदल देता है i – 1 नोड को इंगित करने के लिए i + 1, जबकि निष्पादन का एक अन्य थ्रेड नोड के अगले सूचक को बदल देता है i नोड को इंगित करने के लिए i + 2. हालाँकि दोनों निष्कासन ऑपरेशन सफलतापूर्वक पूरे हो गए, लेकिन लिंक की गई सूची की वांछित स्थिति प्राप्त नहीं हुई: node i + 1 सूची में रहता है, क्योंकि नोड का अगला सूचक i – 1 नोड को इंगित करता है i + 1.

यह सुनिश्चित करने के लिए कि सूची के एक ही हिस्से में एक साथ अपडेट नहीं हो सकते, पारस्परिक बहिष्करण की आवश्यकता का उपयोग करके इस समस्या (जिसे दौड़ की स्थिति कहा जाता है) से बचा जा सकता है।

पारस्परिक बहिष्करण शब्द का उपयोग एक थ्रेड द्वारा मेमोरी एड्रेस को एक साथ लिखने के संदर्भ में भी किया जाता है, जबकि उपरोक्त मेमोरी एड्रेस को एक या अधिक अन्य थ्रेड्स द्वारा हेरफेर या पढ़ा जा रहा है।

समस्या विवरण

जिस समस्या को परस्पर बहिष्करण संबोधित करता है वह संसाधन साझा करने की समस्या है: एक सॉफ्टवेयर सिस्टम एक साझा संसाधन तक कई प्रक्रियाओं की पहुंच को कैसे नियंत्रित कर सकता है, जब प्रत्येक प्रक्रिया को अपना काम करते समय उस संसाधन के विशेष नियंत्रण की आवश्यकता होती है? इसका पारस्परिक-बहिष्करण समाधान साझा संसाधन को केवल तभी उपलब्ध कराता है जब प्रक्रिया एक विशिष्ट कोड खंड में होती है जिसे महत्वपूर्ण खंड कहा जाता है। यह अपने प्रोग्राम के उस हिस्से के प्रत्येक पारस्परिक निष्पादन को नियंत्रित करके साझा संसाधन तक पहुंच को नियंत्रित करता है जहां संसाधन का उपयोग किया जाएगा।

इस समस्या के सफल समाधान में कम से कम ये दो गुण होने चाहिए:

  • इसे पारस्परिक बहिष्करण लागू करना होगा: एक समय में केवल एक ही प्रक्रिया महत्वपूर्ण अनुभाग में हो सकती है।
  • इसे गतिरोधों से मुक्त होना चाहिए: यदि प्रक्रियाएँ महत्वपूर्ण अनुभाग में प्रवेश करने का प्रयास कर रही हैं, तो उनमें से एक को अंततः सफलतापूर्वक ऐसा करने में सक्षम होना चाहिए, बशर्ते कोई प्रक्रिया स्थायी रूप से महत्वपूर्ण अनुभाग में न रहे।

इनमें से एक या दोनों संपत्तियों को लागू करने के लिए गतिरोध स्वतंत्रता का विस्तार किया जा सकता है:

  • तालाबंदी-स्वतंत्रता गारंटी देती है कि महत्वपूर्ण अनुभाग में प्रवेश करने की इच्छुक कोई भी प्रक्रिया अंततः ऐसा करने में सक्षम होगी। यह गतिरोध से बचने से अलग है, जिसके लिए आवश्यक है कि कुछ प्रतीक्षा प्रक्रिया महत्वपूर्ण अनुभाग तक पहुंच प्राप्त करने में सक्षम हो, लेकिन यह आवश्यक नहीं है कि प्रत्येक प्रक्रिया को एक मोड़ मिले। यदि दो प्रक्रियाएं लगातार अपने बीच एक संसाधन का व्यापार करती हैं, तो तीसरी प्रक्रिया बंद हो सकती है और भुखमरी (कंप्यूटर विज्ञान) का अनुभव हो सकता है, भले ही सिस्टम गतिरोध में न हो। यदि कोई सिस्टम लॉकआउट से मुक्त है, तो यह सुनिश्चित करता है कि प्रत्येक प्रक्रिया को भविष्य में किसी बिंदु पर मोड़ मिल सकता है।
  • के-बाउंड वेटिंग प्रॉपर्टी लॉकआउट-स्वतंत्रता की तुलना में अधिक सटीक प्रतिबद्धता देती है। लॉकआउट-स्वतंत्रता सुनिश्चित करती है कि प्रत्येक प्रक्रिया अंततः महत्वपूर्ण अनुभाग तक पहुंच सकती है: यह इस बात की कोई गारंटी नहीं देती है कि प्रतीक्षा कितनी लंबी होगी। व्यवहार में, एक प्रक्रिया को अपनी बारी आने से पहले अन्य उच्च-प्राथमिकता वाली प्रक्रियाओं द्वारा मनमाने ढंग से या असीमित संख्या में आगे बढ़ाया जा सकता है। के-बाउंडेड वेटिंग प्रॉपर्टी के तहत, प्रत्येक प्रक्रिया में एक सीमित अधिकतम प्रतीक्षा समय होता है। यह अन्य प्रक्रियाओं द्वारा लाइन में कटौती करने की संख्या की सीमा निर्धारित करके काम करता है, ताकि कोई भी प्रक्रिया k बार से अधिक महत्वपूर्ण अनुभाग में प्रवेश न कर सके जबकि कोई अन्य प्रतीक्षा कर रहा हो।[4]

प्रत्येक प्रक्रिया के प्रोग्राम को चार खंडों में विभाजित किया जा सकता है, जिसके परिणामस्वरूप चार अवस्थाएँ बनती हैं। इन चार राज्यों के माध्यम से कार्यक्रम निष्पादन चक्र क्रम में:[5]

एकल प्रक्रिया के अनुभागों का चक्र

;नॉन-क्रिटिकल सेक्शन: ऑपरेशन क्रिटिकल सेक्शन के बाहर है; प्रक्रिया साझा संसाधन का उपयोग या अनुरोध नहीं कर रही है।

प्रयास
प्रक्रिया महत्वपूर्ण अनुभाग में प्रवेश करने का प्रयास करती है।
महत्वपूर्ण अनुभाग
इस अनुभाग में प्रक्रिया को साझा संसाधन तक पहुंचने की अनुमति है।
बाहर निकलें
प्रक्रिया महत्वपूर्ण अनुभाग को छोड़ देती है और साझा संसाधन को अन्य प्रक्रियाओं के लिए उपलब्ध कराती है।

यदि कोई प्रक्रिया महत्वपूर्ण अनुभाग में प्रवेश करना चाहती है, तो उसे पहले प्रयास अनुभाग को निष्पादित करना होगा और तब तक इंतजार करना होगा जब तक कि वह महत्वपूर्ण अनुभाग तक पहुंच प्राप्त न कर ले। प्रक्रिया के महत्वपूर्ण अनुभाग को निष्पादित करने और साझा संसाधनों के साथ समाप्त होने के बाद, उन्हें अन्य प्रक्रियाओं के उपयोग के लिए जारी करने के लिए निकास अनुभाग को निष्पादित करने की आवश्यकता होती है। फिर प्रक्रिया अपने गैर-महत्वपूर्ण अनुभाग पर लौट आती है।

पारस्परिक बहिष्कार लागू करना

हार्डवेयर समाधान

यूनिप्रोसेसर प्रणाली|यूनी-प्रोसेसर सिस्टम पर, पारस्परिक बहिष्करण प्राप्त करने का सबसे सरल समाधान प्रक्रिया के महत्वपूर्ण खंड के दौरान व्यवधान को अक्षम करना है। यह किसी भी बाधित सेवा रूटीन को चलने से रोकेगा (किसी प्रक्रिया को प्रीएम्प्शन (कंप्यूटिंग) होने से प्रभावी ढंग से रोकेगा)। हालाँकि यह समाधान प्रभावी है, लेकिन यह कई समस्याओं का कारण बनता है। यदि कोई महत्वपूर्ण अनुभाग लंबा है, तो हर बार महत्वपूर्ण अनुभाग निष्पादित होने पर सिस्टम की घड़ी ड्रिफ्ट हो जाएगी क्योंकि टाइमर बाधा डालना अब सेवित नहीं है, इसलिए महत्वपूर्ण अनुभाग के दौरान समय को ट्रैक करना असंभव है। इसके अलावा, यदि कोई प्रक्रिया अपने महत्वपूर्ण खंड के दौरान रुक जाती है, तो नियंत्रण कभी भी दूसरी प्रक्रिया में वापस नहीं आएगा, जिससे संपूर्ण सिस्टम प्रभावी रूप से रुक जाएगा। पारस्परिक बहिष्कार को प्राप्त करने के लिए एक अधिक सुंदर तरीका व्यस्त-प्रतीक्षा है।

व्यस्त-प्रतीक्षा यूनिप्रोसेसर और मल्टीप्रोसेसर सिस्टम दोनों के लिए प्रभावी है। साझा मेमोरी का उपयोग और एक रैखिकता परीक्षण-और-सेट निर्देश पारस्परिक बहिष्करण प्रदान करते हैं। एक प्रक्रिया साझा मेमोरी में किसी स्थान पर परीक्षण और सेट कर सकती है, और चूंकि ऑपरेशन परमाणु है, एक समय में केवल एक प्रक्रिया ध्वज सेट कर सकती है। कोई भी प्रक्रिया जो ध्वज को सेट करने में असफल होती है, वह या तो अन्य कार्य कर सकती है और बाद में फिर से प्रयास कर सकती है, प्रोसेसर को किसी अन्य प्रक्रिया के लिए छोड़ सकती है और बाद में फिर से प्रयास कर सकती है, या ध्वज की जांच करते समय लूप करना जारी रख सकती है जब तक कि वह इसे प्राप्त करने में सफल न हो जाए। प्रीएम्पशन (कंप्यूटिंग) अभी भी संभव है, इसलिए यह विधि सिस्टम को कार्य करना जारी रखने की अनुमति देती है - भले ही कोई प्रक्रिया लॉक को पकड़कर रुक जाए।

डेटा संरचनाओं का पारस्परिक बहिष्करण प्रदान करने के लिए कई अन्य परमाणु परिचालनों का उपयोग किया जा सकता है; इनमें से सबसे उल्लेखनीय तुलना-और-स्वैप (सीएएस) है। CAS का उपयोग एक लिंक्ड सूची बनाकर किसी भी साझा डेटा संरचना के लिए प्रतीक्षा-मुक्त पारस्परिक बहिष्करण प्राप्त करने के लिए किया जा सकता है, जहां प्रत्येक नोड प्रदर्शन किए जाने वाले वांछित ऑपरेशन का प्रतिनिधित्व करता है। फिर CAS का उपयोग लिंक्ड सूची में पॉइंटर (कंप्यूटर प्रोग्रामिंग) को बदलने के लिए किया जाता है[6] नये नोड के सम्मिलन के दौरान. इसके CAS में केवल एक ही प्रक्रिया सफल हो सकती है; एक ही समय में नोड जोड़ने का प्रयास करने वाली अन्य सभी प्रक्रियाओं को फिर से प्रयास करना होगा। प्रत्येक प्रक्रिया तब डेटा संरचना की एक स्थानीय प्रतिलिपि रख सकती है, और लिंक की गई सूची को पार करने पर, सूची से प्रत्येक ऑपरेशन को उसकी स्थानीय प्रतिलिपि पर निष्पादित कर सकती है।

सॉफ़्टवेयर समाधान

हार्डवेयर-समर्थित समाधानों के अलावा, कुछ सॉफ़्टवेयर समाधान मौजूद हैं जो पारस्परिक बहिष्करण प्राप्त करने के लिए व्यस्त प्रतीक्षा का उपयोग करते हैं। उदाहरणों में शामिल:

  • डेकर का एल्गोरिदम
  • पीटरसन का एल्गोरिदम
  • लैमपोर्ट का बेकरी एल्गोरिदम[7]
  • स्ज़िमांस्की का एल्गोरिदम
  • तौबेनफेल्ड का श्वेत-श्याम बेकरी एल्गोरिदम[2]* माकावा का एल्गोरिदम

यदि इन्हें निष्पादित करने वाले प्लेटफ़ॉर्म पर आउट-ऑफ़-ऑर्डर निष्पादन का उपयोग किया जाता है तो ये एल्गोरिदम काम नहीं करते हैं। प्रोग्रामर्स को थ्रेड के भीतर मेमोरी ऑपरेशंस पर सख्त ऑर्डर निर्दिष्ट करना होता है।[8] ऑपरेटिंग सिस्टम की मल्टीथ्रेडिंग लाइब्रेरी द्वारा प्रदान की गई सिंक्रोनाइज़ेशन सुविधाओं का उपयोग करना अक्सर बेहतर होता है, जो यदि संभव हो तो हार्डवेयर समाधानों का लाभ उठाएगा लेकिन यदि कोई हार्डवेयर समाधान मौजूद नहीं है तो सॉफ़्टवेयर समाधानों का उपयोग करेगा। उदाहरण के लिए, जब ऑपरेटिंग सिस्टम की लॉक (कंप्यूटर विज्ञान) लाइब्रेरी का उपयोग किया जाता है और एक थ्रेड पहले से प्राप्त लॉक को प्राप्त करने का प्रयास करता है, तो ऑपरेटिंग सिस्टम एक संदर्भ स्विच का उपयोग करके थ्रेड को निलंबित कर सकता है और इसे दूसरे थ्रेड के साथ स्वैप कर सकता है जो चलने के लिए तैयार है , या यदि कोई अन्य थ्रेड नहीं है जिसे चलाया जा सके तो उस प्रोसेसर को कम पावर स्थिति में रखा जा सकता है। इसलिए, अधिकांश आधुनिक पारस्परिक बहिष्करण विधियां कतार और संदर्भ स्विच का उपयोग करके विलंबता (इंजीनियरिंग) और व्यस्त-प्रतीक्षा को कम करने का प्रयास करती हैं। हालाँकि, यदि किसी थ्रेड को निलंबित करने और फिर उसे पुनर्स्थापित करने में लगने वाला समय हमेशा उस समय से अधिक साबित हो सकता है जिसे किसी विशेष स्थिति में अवरुद्ध होने के बाद थ्रेड को चलने के लिए तैयार होने के लिए इंतजार करना पड़ता है, तो स्पिनलॉक स्वीकार्य हैं समाधान (केवल उस स्थिति के लिए)।[citation needed]

पारस्परिक बहिष्करण समस्या पर बाध्य

एक बाइनरी टेस्ट-एंड-सेट|टेस्ट&सेट रजिस्टर पारस्परिक बहिष्करण समस्या का गतिरोध-मुक्त समाधान प्रदान करने के लिए पर्याप्त है। लेकिन परीक्षण और सेट रजिस्टर के साथ बनाया गया समाधान संभवतः कुछ प्रक्रियाओं की भुखमरी का कारण बन सकता है जो प्रयास अनुभाग में फंस जाते हैं।[4]वास्तव में, लॉकआउट से बचने के लिए अलग-अलग मेमोरी स्थितियों की आवश्यकता होती है। असीमित प्रतीक्षा से बचने के लिए, n विशिष्ट मेमोरी अवस्थाओं की आवश्यकता होती है।[9]


वसूलीयोग्य पारस्परिक बहिष्करण

पारस्परिक बहिष्करण के लिए अधिकांश एल्गोरिदम इस धारणा के साथ डिज़ाइन किए गए हैं कि जब कोई प्रक्रिया महत्वपूर्ण अनुभाग के अंदर चल रही हो तो कोई विफलता नहीं होती है। हालाँकि, वास्तव में ऐसी विफलताएँ आम हो सकती हैं। उदाहरण के लिए, बिजली की अचानक हानि या दोषपूर्ण इंटरकनेक्ट के कारण महत्वपूर्ण अनुभाग में एक प्रक्रिया में एक अप्राप्य त्रुटि का अनुभव हो सकता है या अन्यथा जारी रखने में असमर्थ हो सकता है। यदि ऐसी विफलता होती है, तो पारंपरिक, गैर-विफलता-सहिष्णु पारस्परिक बहिष्करण एल्गोरिदम प्रमुख जीवंतता गुणों को गतिरोध या अन्यथा विफल कर सकते हैं। इस समस्या से निपटने के लिए, क्रैश-रिकवरी तंत्र का उपयोग करके कई समाधान प्रस्तावित किए गए हैं।[10]


पारस्परिक बहिष्करण उपकरणों के प्रकार

ऊपर बताए गए समाधानों का उपयोग नीचे दिए गए सिंक्रनाइज़ेशन प्राइमेटिव्स के निर्माण के लिए किया जा सकता है:

पारस्परिक बहिष्कार के कई रूपों के दुष्प्रभाव होते हैं। उदाहरण के लिए, क्लासिक सेमाफोर (प्रोग्रामिंग) गतिरोध की अनुमति देता है, जिसमें एक प्रक्रिया को एक सेमाफोर मिलता है, दूसरी प्रक्रिया को दूसरा सेमाफोर मिलता है, और फिर दोनों दूसरे सेमाफोर के जारी होने तक इंतजार करते हैं। अन्य सामान्य दुष्प्रभावों में संसाधन की कमी शामिल है, जिसमें एक प्रक्रिया को पूरा होने तक चलने के लिए कभी भी पर्याप्त संसाधन नहीं मिलते हैं; प्राथमिकता व्युत्क्रमण, जिसमें उच्च-प्राथमिकता वाला धागा निम्न-प्राथमिकता वाले धागे की प्रतीक्षा करता है; और उच्च विलंबता, जिसमें रुकावटों पर प्रतिक्रिया शीघ्र नहीं होती है।

अधिकांश शोध का उद्देश्य उपरोक्त प्रभावों को खत्म करना है, अक्सर गैर-अवरुद्ध सिंक्रनाइज़ेशन | गैर-अवरुद्ध प्रगति की गारंटी देने के लक्ष्य के साथ। कोई सटीक योजना ज्ञात नहीं है. पूरी प्रक्रिया को निष्क्रिय करने के लिए सिस्टम कॉल को ब्लॉक किया जाता है। जब तक ऐसी कॉलें थ्रेड सुरक्षा नहीं बन गईं, तब तक एक प्रक्रिया के भीतर एक भी थ्रेड को स्लीप करने के लिए कोई उचित तंत्र नहीं था (पोलिंग (कंप्यूटर विज्ञान) देखें)।[citation needed]

यह भी देखें

संदर्भ

  1. Dijkstra, E. W. (1965). "समवर्ती प्रोग्रामिंग नियंत्रण में किसी समस्या का समाधान". Communications of the ACM. 8 (9): 569. doi:10.1145/365559.365617. S2CID 19357737.
  2. 2.0 2.1 Taubenfeld, "The Black-White Bakery Algorithm". In Proc. Distributed Computing, 18th international conference, DISC 2004. Vol 18, 56–70, 2004
  3. "PODC Influential Paper Award: 2002", ACM Symposium on Principles of Distributed Computing, retrieved 24 August 2009
  4. 4.0 4.1 Attiya, Hagit; Welch, Jennifer (25 March 2004). Distributed computing: fundamentals, simulations, and advanced topics. John Wiley & Sons, Inc. ISBN 978-0-471-45324-6.
  5. Lamport, Leslie (26 June 2000), "The Mutual Exclusion Problem Part II: Statement and Solutions" (PDF), Journal of the Association for Computing Machinery, 33 (2): 313–348, doi:10.1145/5383.5384, S2CID 12012739
  6. Harris, Timothy L. (2001). "गैर-अवरुद्ध लिंक्ड-सूचियों का व्यावहारिक कार्यान्वयन" (PDF). Distributed Computing. Lecture Notes in Computer Science. 2180: 300–314. doi:10.1007/3-540-45414-4_21. ISBN 978-3-540-42605-9. Retrieved 1 December 2022.
  7. Lamport, Leslie (August 1974). "दिज्क्स्ट्रा की समवर्ती प्रोग्रामिंग समस्या का एक नया समाधान". Communications of the ACM. 17 (8): 453–455. doi:10.1145/361082.361093. S2CID 8736023.
  8. Holzmann, Gerard J.; Bosnacki, Dragan (1 October 2007). "SPIN मॉडल चेकर के मल्टीकोर एक्सटेंशन का डिज़ाइन" (PDF). IEEE Transactions on Software Engineering. 33 (10): 659–674. doi:10.1109/TSE.2007.70724. S2CID 9080331. Archived (PDF) from the original on 9 October 2022.
  9. Burns, James E.; Paul Jackson, Nancy A. Lynch (January 1982), "Data Requirements for Implementation of N-Process Mutual Exclusion Using a Single Shared Variable" (PDF), Journal of the Association for Computing Machinery, 33 (2): 313–348
  10. Golab, Wojciech; Ramaraju, Aditya (July 2016), "Recoverable Mutual Exclusion", Proceedings of the 2016 ACM Symposium on Principles of Distributed Computing, pp. 65–74, doi:10.1145/2933057.2933087, ISBN 9781450339643, S2CID 8621532


अग्रिम पठन

  • Michel Raynal: Algorithms for Mutual Exclusion, MIT Press, ISBN 0-262-18119-3
  • Sunil R. Das, Pradip K. Srimani: Distributed Mutual Exclusion Algorithms, IEEE Computer Society, ISBN 0-8186-3380-8
  • Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java Platform Computing, Prentice Hall, ISBN 0-13-016164-0
  • Gadi Taubenfeld, Synchronization Algorithms and Concurrent Programming, Pearson/Prentice Hall, ISBN 0-13-197259-6


बाहरी संबंध