टेस्ट-एंड-सेट: Difference between revisions

From Vigyanwiki
(Created page with "{{short description|CPU instruction to set a memory location to 1 and return its prior value}} कंप्यूटर विज्ञान में, टेस्ट-...")
 
No edit summary
 
(8 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{short description|CPU instruction to set a memory location to 1 and return its prior value}}
{{short description|CPU instruction to set a memory location to 1 and return its prior value}}


[[कंप्यूटर विज्ञान]] में, टेस्ट-एंड-सेट [[ निर्देश सेट वास्तुकला ]] एक [[ स्मृति स्थान ]] पर 1 लिखने (सेट) करने के लिए उपयोग किया जाने वाला निर्देश है और इसके पुराने मान को एकल [[परमाणु (कंप्यूटर विज्ञान)]] (यानी, गैर-व्यवधान) ऑपरेशन के रूप में लौटाता है। कॉल करने वाला तब परिणाम का परीक्षण कर सकता है यह देखने के लिए कि क्या कॉल द्वारा राज्य को बदल दिया गया था। यदि एकाधिक प्रक्रियाएं एक ही मेमोरी स्थान तक पहुंच सकती हैं, और यदि कोई प्रक्रिया वर्तमान में टेस्ट-एंड-सेट कर रही है, तो पहली प्रक्रिया के टेस्ट-एंड-सेट समाप्त होने तक कोई अन्य प्रक्रिया एक और टेस्ट-एंड-सेट शुरू नहीं कर सकती है। एक [[सेंट्रल प्रोसेसिंग यूनिट]] (सीपीयू) एक अन्य इलेक्ट्रॉनिक घटक, जैसे [[डीपीआरएएम]] | डुअल-पोर्ट रैम द्वारा दिए गए टेस्ट-एंड-सेट निर्देश का उपयोग कर सकता है; एक सीपीयू स्वयं एक टेस्ट-एंड-सेट निर्देश भी दे सकता है।
[[कंप्यूटर विज्ञान]] में, '''टेस्ट-एंड-सेट''' निर्देश एक मेमोरी लोकेशन पर 1 लिखने (सेट) करने के लिए उपयोग किया जाने वाला एक निर्देश है और इसके पुराने मान को एकल [[परमाणु (कंप्यूटर विज्ञान)|परमाणु]] (यानी, गैर-रुकावट) ऑपरेशन के रूप में वापस कर देता है। कॉल करने वाला फिर यह देखने के लिए परिणाम का "परीक्षण" कर सकता है कि क्या कॉल द्वारा स्थिति बदली गई थी। यदि एकाधिक प्रक्रियाएं एक ही मेमोरी लोकेशन तक पहुंच सकती हैं, और यदि कोई प्रक्रिया वर्तमान में टेस्ट-एंड-सेट कर रही है, तो कोई अन्य प्रक्रिया दूसरी टेस्ट-एंड-सेट प्रारम्भ नहीं कर सकती है जब तक कि पहली प्रक्रिया का टेस्ट-एंड-सेट समाप्त नहीं हो जाता। [[सेंट्रल प्रोसेसिंग यूनिट]] (सीपीयू) एक अन्य इलेक्ट्रॉनिक घटक, जैसे कि डुअल-पोर्ट रैम द्वारा दिए गए टेस्ट-एंड-सेट निर्देश का उपयोग कर सकती है; सीपीयू स्वयं एक टेस्ट-एंड-सेट निर्देश भी प्रदान कर सकता है।


एक परमाणु परीक्षण और सेट का उपयोग करके एक [[ताला (कंप्यूटर विज्ञान)]] बनाया जा सकता है<ref>{{Cite journal|last=Anderson|first=T. E.|date=1990-01-01|title=शेयर्ड-मनी मल्टीप्रोसेसरों के लिए स्पिन लॉक विकल्पों का प्रदर्शन|journal=IEEE Transactions on Parallel and Distributed Systems|volume=1|issue=1|pages=6–16|doi=10.1109/71.80120|issn=1045-9219}}</ref> निर्देश इस प्रकार है:
परमाणु परीक्षण और टेस्ट-एंड-सेट का उपयोग करके एक लॉक बनाया जा सकता है:<ref>{{Cite journal|last=Anderson|first=T. E.|date=1990-01-01|title=शेयर्ड-मनी मल्टीप्रोसेसरों के लिए स्पिन लॉक विकल्पों का प्रदर्शन|journal=IEEE Transactions on Parallel and Distributed Systems|volume=1|issue=1|pages=6–16|doi=10.1109/71.80120|issn=1045-9219}}</ref>


यह कोड मानता है कि पहले टेस्ट-एंड-सेट से पहले किसी बिंदु पर स्मृति स्थान को 0 पर प्रारंभ किया गया था। कॉलिंग प्रक्रिया लॉक प्राप्त करती है यदि पुराना मान 0 था, अन्यथा लूप लॉक प्राप्त करने की प्रतीक्षा कर रहा है। इसे [[ spinlock ]] कहा जाता है। किसी भी बिंदु पर, लॉक का धारक किसी अन्य द्वारा अधिग्रहण के लिए लॉक को रिलीज़ करने के लिए मेमोरी लोकेशन को वापस 0 पर सेट कर सकता है - इसके लिए किसी विशेष हैंडलिंग की आवश्यकता नहीं होती है क्योंकि धारक इस मेमोरी लोकेशन का मालिक होता है। [[टेस्ट और टेस्ट-एंड-सेट]] एक और उदाहरण है।
यह कोड मानता है कि पहले टेस्ट-एंड-सेट से पहले किसी बिंदु पर मेमोरी लोकेशन को 0 से प्रारम्भ किया गया था। कॉलिंग प्रक्रिया लॉक प्राप्त करती है यदि पुराना मान 0 था, अन्यथा, जबकि-लूप लॉक प्राप्त करने की प्रतीक्षा में घूमता है। इसे स्पिन लॉक कहते हैं। किसी भी बिंदु पर, लॉक का धारक किसी अन्य द्वारा अधिग्रहण के लिए लॉक को प्रकाशन करने के लिए मेमोरी लोकेशन को वापस 0 पर सेट कर सकता है - इसके लिए किसी विशेष हैंडलिंग की आवश्यकता नहीं होती है क्योंकि धारक इस मेमोरी लोकेशन का "मालिक" होता है। "[[टेस्ट और टेस्ट-एंड-सेट]]" एक और उदाहरण है।


[[मौरिस हर्लिही]] (1991) ने साबित किया कि टेस्ट-एंड-सेट (1-बिट तुलना) में एक परिमित सहमति (कंप्यूटर विज्ञान) है और अधिकतम दो समवर्ती प्रक्रियाओं के लिए प्रतीक्षा-मुक्त सहमति (कंप्यूटर विज्ञान) को हल कर सकता है।<ref>{{cite journal|last=Herlihy|first=Maurice|date=January 1991|title=प्रतीक्षा-मुक्त तुल्यकालन|url=http://www.cs.brown.edu/~mph/Herlihy91/p124-herlihy.pdf|journal=ACM Trans. Program. Lang. Syst.|volume=13|issue=1|pages=124–149|doi=10.1145/114005.102808|access-date=2007-05-20|citeseerx=10.1.1.56.5659|s2cid=2181446 }}</ref> इसके विपरीत, तुलना-और-स्वैप (32-बिट तुलना) इस समस्या का अधिक सामान्य समाधान प्रदान करता है, और कुछ कार्यान्वयनों में विस्तारित उपयोगिता के लिए तुलना-दोहरा-और-स्वैप (64-बिट तुलना) भी उपलब्ध है।
[[मौरिस हर्लिही]] (1991) ने साबित किया कि टेस्ट-एंड-सेट (1-बिट तुलना) में एक सीमित साधारण सहमति संख्या होती है और अधिकतम दो समवर्ती प्रक्रियाओं के लिए प्रतीक्षा-मुक्त साधारण सहमति की समस्या को हल कर सकता है।<ref>{{cite journal|last=Herlihy|first=Maurice|date=January 1991|title=प्रतीक्षा-मुक्त तुल्यकालन|url=http://www.cs.brown.edu/~mph/Herlihy91/p124-herlihy.pdf|journal=ACM Trans. Program. Lang. Syst.|volume=13|issue=1|pages=124–149|doi=10.1145/114005.102808|access-date=2007-05-20|citeseerx=10.1.1.56.5659|s2cid=2181446 }}</ref> इसके विपरीत, तुलना-और-स्वैप (32-बिट तुलना) इस समस्या का अधिक सामान्य समाधान प्रदान करता है, और कुछ कार्यान्वयनों में, तुलना-दोहरा-और-स्वैप (64-बिट तुलना) विस्तारित उपयोगिता के लिए भी उपलब्ध है।


== टेस्ट-एंड-सेट == का हार्डवेयर कार्यान्वयन
== टेस्ट-एंड-सेट का हार्डवेयर कार्यान्वयन ==
DPRAM टेस्ट-एंड-सेट निर्देश कई तरह से काम कर सकते हैं। यहां दो भिन्नताएं हैं, जिनमें से दोनों डीपीआरएएम का वर्णन करती हैं जो वास्तव में 2 पोर्ट प्रदान करती हैं, जिससे 2 अलग-अलग इलेक्ट्रॉनिक घटकों (जैसे 2 सीपीयू) को डीपीआरएएम पर प्रत्येक मेमोरी स्थान तक पहुंच की अनुमति मिलती है।
डीपीआरएएम टेस्ट-एंड-सेट निर्देश कई तरीकों से काम कर सकते हैं। यहां दो भिन्नताएं हैं, जिनमें से दोनों डीपीआरएएम का वर्णन करती हैं जो वास्तव में 2 पोर्ट प्रदान करती हैं, जिससे 2 अलग-अलग इलेक्ट्रॉनिक घटकों (जैसे 2 सीपीयू) को डीपीआरएएम पर प्रत्येक मेमोरी लोकेशन तक पहुंच मिलती है।


=== रूपांतर 1 ===
=== रूपांतर 1 ===
जब CPU 1 एक टेस्ट-एंड-सेट निर्देश जारी करता है, तो DPRAM पहले एक विशेष स्थान पर स्मृति स्थान के पते को संग्रहीत करके इसका एक आंतरिक नोट बनाता है। यदि इस बिंदु पर, CPU 2 उसी स्मृति स्थान के लिए एक परीक्षण-और-सेट निर्देश जारी करता है, तो DPRAM पहले अपने आंतरिक नोट की जांच करता है, स्थिति को पहचानता है, और एक व्यस्त व्यवधान जारी करता है, जो CPU 2 को बताता है कि उसे प्रतीक्षा करनी होगी और पुन: प्रयास करें। यह इंटरप्ट मैकेनिज्म का उपयोग करके व्यस्त प्रतीक्षा या स्पिनलॉक का कार्यान्वयन है। चूंकि यह सब हार्डवेयर की गति पर होता है, स्पिन-लॉक से बाहर निकलने के लिए CPU 2 का इंतजार बहुत कम है।
जब सीपीयू 1 टेस्ट-एंड-सेट निर्देश जारी करता है, तो डीपीआरएएम सबसे पहले एक विशेष लोकेशन पर मेमोरी लोकेशन के एड्रेस को स्टोर करके इसका "आंतरिक नोट" बनाता है। यदि इस बिंदु पर, सीपीयू 2 समान मेमोरी लोकेशन के लिए टेस्ट-एंड-सेट निर्देश जारी करता है, डीपीआरएएम पहले अपने "आंतरिक नोट" की जांच करता है, स्थिति को पहचानता है, और व्यस्त बाधा जारी करता है, जो सीपीयू 2 को बताता है कि उसे प्रतीक्षा करनी होगी और पुनः प्रयास करना होगा। यह व्यस्त प्रतीक्षा या स्पिनलॉक का कार्यान्वयन है जो व्यवधान तंत्र का उपयोग करता है। चूँकि यह सब हार्डवेयर गति पर होता है, सीपीयू 2 का स्पिन-लॉक से बाहर निकलने का इंतजार बहुत कम है।


CPU 2 स्मृति स्थान तक पहुँचने का प्रयास कर रहा था या नहीं, DPRAM CPU 1 द्वारा दिया गया परीक्षण करता है। यदि परीक्षण सफल होता है, तो DPRAM स्मृति स्थान को CPU 1 द्वारा दिए गए मान पर सेट करता है। फिर DPRAM अपने आंतरिक नोट को मिटा देता है। वह सीपीयू 1 वहां लिख रहा था। इस बिंदु पर, CPU 2 एक टेस्ट-एंड-सेट जारी कर सकता है, जो सफल होगा।
सीपीयू 2 मेमोरी लोकेशन तक पहुँचने का प्रयास कर रहा था या नहीं, डीपीआरएएम सीपीयू 1 द्वारा दिए गए परीक्षण को करता है। यदि परीक्षण सफल होता है, तो डीपीआरएएम मेमोरी लोकेशन को सीपीयू 1 द्वारा दिए गए मान पर सेट करता है। फिर डीपीआरएएम अपने "आंतरिक नोट" को मिटा देता है जो कि सीपीयू 1 वहां लिख रहा था। इस बिंदु पर, सीपीयू 2 टेस्ट-एंड-सेट जारी कर सकता है, जो सफल होगा।


=== रूपांतर 2 ===
=== रूपांतर 2 ===
CPU 1 स्मृति स्थान A पर लिखने के लिए परीक्षण-और-सेट निर्देश जारी करता है। डीपीआरएएम स्मृति स्थान ए में मूल्य को तुरंत संग्रहीत नहीं करता है, बल्कि स्मृति स्थान ए की सामग्री को विशेष ध्वज मान पर सेट करते समय वर्तमान मूल्य को एक विशेष रजिस्टर में ले जाता है। यदि इस बिंदु पर, CPU 2 स्मृति स्थान A पर एक परीक्षण-और-सेट जारी करता है, DPRAM विशेष ध्वज मान का पता लगाता है, और भिन्नता 1 के रूप में, एक व्यस्त व्यवधान जारी करता है।
सीपीयू 1 "मेमोरी लोकेशन A" में लिखने के लिए टेस्ट-एंड-सेट निर्देश जारी करता है। डीपीआरएएम तुरंत मेमोरी लोकेशन A में मूल्य को संग्रहीत नहीं करता है, बल्कि मेमोरी लोकेशन A की सामग्री को विशेष "फ्लैग वैल्यू" पर सेट करते समय वर्तमान मान को विशेष रजिस्टर में ले जाता है। यदि इस बिंदु पर, CPU 2 मेमोरी लोकेशन A पर टेस्ट-एंड-सेट जारी करता है, डीपीआरएएम विशेष फ्लैग वैल्यू का पता लगाता है, और जैसा कि भिन्नता 1 में है, व्यस्त व्यवधान जारी करता है।


CPU 2 स्मृति स्थान तक पहुँचने का प्रयास कर रहा था या नहीं, DPRAM अब CPU 1 का परीक्षण करता है। यदि परीक्षण सफल होता है, तो DPRAM स्मृति स्थान A को CPU 1 द्वारा निर्दिष्ट मान पर सेट करता है। यदि परीक्षण विफल हो जाता है, तो DPRAM मान को विशेष रजिस्टर से वापस स्मृति स्थान A में कॉपी कर देता है। या तो ऑपरेशन विशेष ध्वज मान को मिटा देता है। यदि CPU 2 अब परीक्षण-और-सेट जारी करता है, तो यह सफल होगा।
चाहे सीपीयू 2 मेमोरी लोकेशन तक पहुँचने का प्रयास कर रहा था या नहीं, डीपीआरएएम अब सीपीयू 1 का परीक्षण करता है। यदि परीक्षण सफल हो जाता है, तो डीपीआरएएम मेमोरी लोकेशन A को सीपीयू 1 द्वारा निर्दिष्ट मान पर सेट करता है। यदि परीक्षण विफल हो जाता है, तो डीपीआरएएम मूल्य को विशेष रजिस्टर से मेमोरी लोकेशन A में वापस कॉपी करता है। कोई भी ऑपरेशन विशेष फ़्लैग मान मिटा देता है। यदि सीपीयू 2 अब टेस्ट-एंड-सेट जारी करता है, तो यह सफल होगा।


== टेस्ट-एंड-सेट == का सॉफ्टवेयर कार्यान्वयन
=== टेस्ट-एंड-सेट का सॉफ्टवेयर कार्यान्वयन ===
कुछ निर्देश सेटों में एक परमाणु परीक्षण और सेट मशीन भाषा निर्देश होता है। उदाहरणों में x[[86]] शामिल हैं<ref>{{Cite web|url=http://www.felixcloutier.com/x86/BTS.html|title=BTS—Bit Test and Set|website=www.felixcloutier.com|access-date=2016-11-21}}</ref> और आईबीएम सिस्टम/360 और इसके उत्तराधिकारी (जेड/आर्किटेक्चर सहित)<ref>{{Cite web|url=http://www.ibm.com/support/knowledgecenter/SSB23S_1.1.0.13/gtpc3/tasinst.html|title=आईबीएम ज्ञान केंद्र|website=www.ibm.com|access-date=2016-11-21}}</ref>
कुछ निर्देश सेट में परमाणु टेस्ट-एंड-सेट मशीन भाषा निर्देश होता है। उदाहरणों में x[[86]]<ref>{{Cite web|url=http://www.felixcloutier.com/x86/BTS.html|title=BTS—Bit Test and Set|website=www.felixcloutier.com|access-date=2016-11-21}}</ref> और आईबीएम सिस्टम/360 और इसके उत्तराधिकारी (जेड/आर्किटेक्चर सहित) सम्मिलित हैं।<ref>{{Cite web|url=http://www.ibm.com/support/knowledgecenter/SSB23S_1.1.0.13/gtpc3/tasinst.html|title=आईबीएम ज्ञान केंद्र|website=www.ibm.com|access-date=2016-11-21}}</ref> वे जो अभी भी पठन-संशोधित-लेखन या तुलना-और-स्वैप निर्देश का उपयोग करके परमाणु टेस्ट-एंड-सेट लागू नहीं कर सकते हैं।
जो अभी भी एक पठन-संशोधित-लेखन या तुलना-और-स्वैप निर्देश का उपयोग करके एक परमाणु परीक्षण-और-सेट को लागू नहीं कर सकते हैं।


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


  फ़ंक्शन टेस्ट एंडसेट (बूलियन_रेफ लॉक) {
  '''function''' TestAndSet(boolean_ref lock) {
     बूलियन इनिशियल = लॉक;
     boolean initial = lock;
     ताला = सच;
     lock = true;
     प्रारंभिक वापसी;
     '''return''' initial;
  }
  }


टेस्ट-एंड-सेट निर्देश के अर्थ में, न केवल कोड को परमाणु नहीं दिखाया गया है, बल्कि यह डीपीआरएएम हार्डवेयर टेस्ट-एंड-सेट के विवरण से भी अलग है। यहां, मूल्य निर्धारित किया जा रहा है और परीक्षण निश्चित और अपरिवर्तनीय है, और परीक्षण के परिणाम की परवाह किए बिना मूल्य को अद्यतन किया जाता है, जबकि डीपीआरएएम परीक्षण और सेट के लिए, स्मृति केवल तभी सेट की जाती है जब परीक्षण सफल होता है, और मूल्य सेट करने के लिए और परीक्षण की स्थिति सीपीयू द्वारा निर्दिष्ट की जाती है। यहां, सेट किया जाने वाला मान केवल 1 हो सकता है, लेकिन यदि 0 और 1 को स्मृति स्थान के लिए केवल मान्य मान माना जाता है, और मान गैर-शून्य है, केवल अनुमत परीक्षण है, तो यह डीपीआरएएम हार्डवेयर के लिए वर्णित मामले के बराबर है (या, अधिक विशेष रूप से, डीपीआरएएम मामला इन बाधाओं के तहत इसे कम कर देता है)। उस दृष्टिकोण से, यह सही ढंग से, उस शब्द के पूर्ण, पारंपरिक अर्थों में परीक्षण और सेट कहा जा सकता है। नोट करने के लिए आवश्यक बिंदु परीक्षण-और-सेट का सामान्य इरादा और सिद्धांत है: एक मूल्य दोनों का परीक्षण किया जाता है और एक परमाणु ऑपरेशन में सेट किया जाता है, जैसे कि कोई अन्य प्रोग्राम थ्रेड या प्रक्रिया परीक्षण के बाद लक्षित स्मृति स्थान को बदल नहीं सकती है लेकिन इससे पहले सेट है। (ऐसा इसलिए है क्योंकि स्थान को केवल तभी सेट किया जाना चाहिए यदि उसका वर्तमान में कोई निश्चित मान हो, न कि यदि वह मान कुछ समय पहले था।)
टेस्ट-एंड-सेट निर्देश के अर्थ में न केवल कोड को परमाणु नहीं दिखाया गया है, बल्कि यह डीपीआरएएम हार्डवेयर टेस्ट-एंड-सेट के ऊपर दिए गए विवरण से भी अलग है। यहां, मान सेट है और परीक्षण निश्चित और अपरिवर्तनीय है और परीक्षण के परिणाम की परवाह किए बिना मूल्य को अपडेट किया जाता है, जबकि डीपीआरएएम टेस्ट-एंड-सेट के लिए, मेमोरी तभी सेट की जाती है जब परीक्षण सफल होता है, और मूल्य सेट करने के लिए और परीक्षण की स्थिति सीपीयू द्वारा निर्दिष्ट की जाती है। यहां, सेट किया जाने वाला मान केवल 1 हो सकता है, लेकिन यदि 0 और 1 को मेमोरी स्थान के लिए केवल मान्य मान माना जाता है, और "मान शून्य नहीं है" केवल अनुमत परीक्षण है, तो यह डीपीआरएएम हार्डवेयर के लिए वर्णित मामले के बराबर है (या, अधिक विशेष रूप से, डीपीआरएएम मामला इन बाधाओं के तहत इसे कम कर देता है)। उस दृष्टिकोण से, यह सही ढंग से, उस शब्द के पूर्ण, पारंपरिक अर्थों में "टेस्ट-एंड-सेट" कहा जा सकता है। नोट करने के लिए आवश्यक बिंदु सामान्य आशय और टेस्ट-एंड-सेट का सिद्धांत है: मूल्य दोनों का परीक्षण किया जाता है और परमाणु ऑपरेशन में सेट किया जाता है जैसे कि कोई अन्य प्रोग्राम थ्रेड या प्रक्रिया परीक्षण के बाद लक्ष्य मेमोरी स्थान को बदल सकती है लेकिन इसे सेट करने से पहले। (ऐसा इसलिए है क्योंकि स्थान को केवल तभी सेट किया जाना चाहिए जब वर्तमान में उसका कोई निश्चित मान हो, न कि यदि वह मान कुछ समय पहले था।)


[[सी (प्रोग्रामिंग भाषा)]] में, कार्यान्वयन इस प्रकार होगा:
[[सी (प्रोग्रामिंग भाषा)]] में, कार्यान्वयन इस प्रकार होगा:<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
#define LOCKED 1
#define LOCKED 1


Line 55: Line 53:
}
}
</syntaxhighlight>
</syntaxhighlight>
कोड यह भी दर्शाता है कि वास्तव में दो ऑपरेशन हैं: एक परमाणु पठन-संशोधित-लिखना और एक परीक्षण। केवल पढ़ने-संशोधित-लिखने के लिए परमाणु होना चाहिए। (यह सच है क्योंकि मूल्य की तुलना में किसी भी समय की देरी से परीक्षण का मूल्य प्राप्त होने के बाद परीक्षण के परिणाम में बदलाव नहीं होगा। एक बार जब कोड प्रारंभिक मूल्य लिखता है, तो परीक्षण का परिणाम स्थापित हो गया है, भले ही इसकी गणना अभी तक नहीं की गई है - उदाहरण के लिए, == ऑपरेटर द्वारा।)
कोड यह भी दर्शाता है कि वास्तव में दो ऑपरेशन हैं: एटॉमिक रीड-मॉडिफाई-राइट और टेस्ट केवल पठन-संशोधित-लेखन परमाणु होना चाहिए। (यह सच है क्योंकि मूल्य की तुलना में किसी भी समय की देरी करने से परीक्षण का मूल्य प्राप्त होने के बाद परीक्षण का परिणाम नहीं बदलेगा। एक बार जब कोड प्रारंभिक मूल्य लिख देता है, तो परीक्षण का परिणाम स्थापित हो जाता है, भले ही इसकी गणना अभी तक की गई हो — उदाहरण के लिए, == ऑपरेटर द्वारा।)


== टेस्ट-एंड-सेट == का उपयोग करके पारस्परिक बहिष्करण
== टेस्ट-एंड-सेट का उपयोग करते हुए पारस्परिक बहिष्कार ==
आपसी बहिष्करण को लागू करने का एक तरीका टेस्ट-एंड-सेट आधारित लॉक का उपयोग करना है<ref>{{Cite book|title=Operating Systems: Three Easy Pieces|last=Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau|publisher=Arpaci-Dusseau Books|year=2015|edition=0.91|via=http://www.ostep.org/}}</ref><ref>{{Cite book|title=Fundamentals of parallel computer architecture : multichip and multicore systems|last=Solihin|first=Yan|year=2009|isbn=9780984163007|pages=252}}</ref> निम्नलिखित नुसार:
आपसी बहिष्करण को लागू करने का एक प्रणाली परीक्षण-और-सेट आधारित लॉक<ref>{{Cite book|title=Operating Systems: Three Easy Pieces|last=Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau|publisher=Arpaci-Dusseau Books|year=2015|edition=0.91|via=http://www.ostep.org/}}</ref><ref>{{Cite book|title=Fundamentals of parallel computer architecture : multichip and multicore systems|last=Solihin|first=Yan|year=2009|isbn=9780984163007|pages=252}}</ref> का उपयोग करना है:


=== एक स्पिन लॉक === का छद्म-सी कार्यान्वयन
=== स्पिन लॉक का स्यूडो-सी कार्यान्वयन ===
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
volatile int lock = 0;
volatile int lock = 0;
Line 78: Line 76:
}
}
</syntaxhighlight>
</syntaxhighlight>
लॉक वेरिएबल एक शेयर्ड वेरिएबल है यानी इसे सभी प्रोसेसर/थ्रेड्स द्वारा एक्सेस किया जा सकता है। [[अस्थिर चर]] कीवर्ड पर ध्यान दें। अस्थिरता की अनुपस्थिति में, संकलक और/या सीपीयू लॉक तक पहुंच को अनुकूलित कर सकते हैं और/या कैश्ड मानों का उपयोग कर सकते हैं, इस प्रकार उपरोक्त कोड को गलत बना सकते हैं। इसके विपरीत, और दुर्भाग्य से, अस्थिरता की उपस्थिति यह गारंटी नहीं देती है कि पढ़ने और लिखने के लिए स्मृति के लिए प्रतिबद्ध हैं। कुछ कंपाइलर यह सुनिश्चित करने के लिए [[ स्मृति बाधा ]] जारी करते हैं कि ऑपरेशन मेमोरी के लिए प्रतिबद्ध हैं, लेकिन चूंकि C/C++ में वोलेटाइल का शब्दार्थ काफी अस्पष्ट है, इसलिए सभी कंपाइलर ऐसा नहीं करेंगे। यह निर्धारित करने के लिए कि क्या यह करता है, अपने कंपाइलर के दस्तावेज़ीकरण से परामर्श लें।
लॉक वेरिएबल एक शेयर्ड वेरिएबल है यानी इसे सभी प्रोसेसर/थ्रेड्स द्वारा एक्सेस किया जा सकता है। वोलेटाइल कीवर्ड पर ध्यान दें। अस्थिरता की अनुपस्थिति में, संकलक और/या सीपीयू लॉक तक पहुंच को अनुकूलित कर सकते हैं और/या कैश्ड मानों का उपयोग कर सकते हैं, इस प्रकार उपरोक्त कोड को गलत बना सकते हैं।इसके विपरीत, और दुर्भाग्य से, वाष्पशील की उपस्थिति यह गारंटी नहीं देती है कि पढ़ने और लिखने के लिए मेमोरी के लिए प्रतिबद्ध हैं। कुछ कंपाइलर यह सुनिश्चित करने के लिए मेमोरी बैरियर जारी करते हैं कि ऑपरेशन मेमोरी के लिए प्रतिबद्ध हैं, लेकिन चूंकि C/C++ में वोलेटाइल का सिमेंटिक्स काफी अस्पष्ट है, इसलिए सभी कंपाइलर ऐसा नहीं करेंगे। यह निर्धारित करने के लिए कि क्या यह करता है, अपने कंपाइलर के दस्तावेज़ीकरण से निष्कर्ष लें।


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


=== विधानसभा कार्यान्वयन ===
=== असेंबली कार्यान्वयन ===
<syntaxhighlight lang="nasm">
<syntaxhighlight lang="nasm">
enter_region:        ; A "jump to" tag; function entry point.
enter_region:        ; A "jump to" tag; function entry point.
Line 107: Line 105:
   ret                ; return to caller
   ret                ; return to caller
</syntaxhighlight>
</syntaxhighlight>
यहाँ <code>tsl</code> एक परमाणु निर्देश है और <code>flag</code> ताला चर है। यह प्रक्रिया तब तक वापस नहीं आती जब तक कि यह लॉक प्राप्त नहीं कर लेती।
यहाँ <code>tsl</code> एटोमिक इंस्ट्रक्शन है और <code>flag</code>लॉक वैरिएबल है। प्रक्रिया तब तक वापस नहीं आती जब तक कि वह लॉक प्राप्त नहीं कर लेती।


== टेस्ट-एंड-सेट लॉक्स == का प्रदर्शन मूल्यांकन
=== टेस्ट-एंड-सेट लॉक का प्रदर्शन मूल्यांकन ===
ताले के लिए सामान्य रूप से चार प्रमुख मूल्यांकन मेट्रिक्स अनियंत्रित ताला-अधिग्रहण विलंबता, बस यातायात, निष्पक्षता और स्टोरेज हैं।<ref name="Solihin">{{cite book|last1=Solihin|first1=Yan|title=समानांतर वास्तुकला के मूल तत्व|date=2016|publisher=CRC Press|location=Boca Raton, FL|isbn=978-1-4822-1118-4}}</ref>


ताले के लिए सामान्य रूप से चार प्रमुख मूल्यांकन मेट्रिक्स अनियंत्रित लॉक-अधिग्रहण विलंबता, बस यातायात, निष्पक्षता और भंडारण हैं।<ref name="Solihin">{{cite book|last1=Solihin|first1=Yan|title=समानांतर वास्तुकला के मूल तत्व|date=2016|publisher=CRC Press|location=Boca Raton, FL|isbn=978-1-4822-1118-4}}</ref>
टेस्ट-एंड-सेट स्कोर उनमें से दो पर कम है, अर्थात् उच्च बस यातायात और अनुचितता।
उनमें से दो पर टेस्ट-एंड-सेट स्कोर कम है, अर्थात्, उच्च बस यातायात और अनुचितता।


जब प्रोसेसर P1 ने लॉक प्राप्त कर लिया है और प्रोसेसर P2 भी लॉक की प्रतीक्षा कर रहा है, P2 लॉक प्राप्त करने के प्रयासों में बस लेनदेन करता रहेगा। जब एक प्रोसेसर ने लॉक प्राप्त कर लिया है, तो अन्य सभी प्रोसेसर जो उसी लॉक को प्राप्त करना चाहते हैं, बार-बार बस लेन-देन शुरू करके लॉक प्राप्त करने का प्रयास करते रहते हैं जब तक कि वे लॉक को पकड़ नहीं लेते। यह टेस्ट-एंड-सेट की बस ट्रैफिक आवश्यकता को महत्वपूर्ण रूप से बढ़ाता है। यह [[कैश (कंप्यूटिंग)]] और [[कैश सुसंगतता]] से अन्य सभी ट्रैफ़िक को धीमा कर देता है। यह समग्र अनुभाग को धीमा कर देता है, क्योंकि ट्रैफ़िक असफल लॉक अधिग्रहण प्रयासों से संतृप्त होता है। टेस्ट और टेस्ट-एंड-सेट | टेस्ट-एंड-टेस्ट-एंड-सेट टीएसएल पर एक सुधार है क्योंकि यह लॉक अधिग्रहण अनुरोधों को लगातार शुरू नहीं करता है।
जब प्रोसेसर P1 ने लॉक प्राप्त कर लिया है और प्रोसेसर P2 भी लॉक की प्रतीक्षा कर रहा है, तो लॉक प्राप्त करने के प्रयासों में P2 बस लेन-देन करता रहेगा। जब प्रोसेसर ने लॉक प्राप्त कर लिया है, तो अन्य सभी प्रोसेसर जो उसी लॉक को प्राप्त करना चाहते हैं, बार-बार बस लेन-देन प्रारम्भ करके लॉक प्राप्त करने का प्रयास करते रहते हैं जब तक कि वे लॉक को पकड़ न लें। यह टेस्ट-एंड-सेट की बस यातायात आवश्यकता को काफी बढ़ा देता है। यह [[कैश (कंप्यूटिंग)|कैश]] और सुसंगतता चूक से अन्य सभी यातायात को धीमा कर देता है। यह पूरे खंड को धीमा कर देता है क्योंकि असफल ताला अधिग्रहण प्रयासों से यातायात संतृप्त होता है। टेस्ट-एंड-टेस्ट-एंड-सेट टीएसएल पर एक सुधार है क्योंकि यह लगातार लॉक अधिग्रहण अनुरोध प्रारम्भ नहीं करता है।


जब हम निष्पक्षता पर विचार करते हैं, तो हम विचार करते हैं कि क्या एक प्रोसेसर को लॉक प्राप्त करने का उचित मौका मिलता है जब वह मुक्त हो जाता है। एक चरम स्थिति में प्रोसेसर भूखा हो सकता है यानी यह उस समय के दौरान मुक्त होने के बावजूद विस्तारित अवधि के लिए लॉक प्राप्त करने में सक्षम नहीं हो सकता है।
जब हम निष्पक्षता पर विचार करते हैं, तो हम विचार करते हैं कि क्या एक प्रोसेसर को लॉक प्राप्त करने का उचित मौका मिलता है जब वह मुक्त हो। चरम स्थिति में, प्रोसेसर भूखा रह सकता है यानी यह उस समय के दौरान मुक्त होने के बावजूद विस्तारित अवधि के लिए लॉक हासिल करने में सक्षम नहीं हो सकता है।


TSL के लिए स्टोरेज ओवरहेड कुछ भी नहीं है क्योंकि केवल एक लॉक की आवश्यकता होती है। केवल एक परमाणु निर्देश और शाखा की आवश्यकता के बाद से अनियंत्रित विलंबता भी कम है।
टीएसएल के लिए संग्रहण ओवरहेड कुछ भी नहीं है क्योंकि केवल एक लॉक की आवश्यकता है। केवल परमाणु निर्देश और शाखा की आवश्यकता होने के बाद से अप्रतिबंधित विलंबता भी कम है।


== यह भी देखें ==
== यह भी देखें ==
* [[लायें और जोड़ें]]
* [[लायें और जोड़ें|फेच-एंड-ऐड]]
* टेस्ट और टेस्ट-एंड-सेट
* टेस्ट और टेस्ट-एंड-सेट
* लोड-लिंक/स्टोर-सशर्त
* लोड-लिंक/स्टोर-सशर्त
* तुलना करें और स्वैप करें
* कम्पेयर-एंड-स्वैप


== संदर्भ ==
== संदर्भ ==
<references />
<references />
== बाहरी संबंध ==
== बाहरी संबंध ==
* [http://edis.win.tue.nl/sys/test-and-set/ Description] from [[Encyclopaedia of Delay-Insensitive Systems]]
* [http://edis.win.tue.nl/sys/test-and-set/ Description] from [[Encyclopaedia of Delay-Insensitive Systems]]
Line 136: Line 132:
* [http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html Intel Developer Manual]
* [http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html Intel Developer Manual]


{{DEFAULTSORT:Test-And-Set}}[[Category: समरूपता नियंत्रण]] [[Category: कंप्यूटर अंकगणित]]
{{DEFAULTSORT:Test-And-Set}}
 
 


[[Category: Machine Translated Page]]
[[Category:CS1 errors]]
[[Category:Created On 26/05/2023]]
[[Category:Created On 26/05/2023|Test-And-Set]]
[[Category:Lua-based templates|Test-And-Set]]
[[Category:Machine Translated Page|Test-And-Set]]
[[Category:Pages with script errors|Test-And-Set]]
[[Category:Templates Vigyan Ready|Test-And-Set]]
[[Category:Templates that add a tracking category|Test-And-Set]]
[[Category:Templates that generate short descriptions|Test-And-Set]]
[[Category:Templates using TemplateData|Test-And-Set]]
[[Category:कंप्यूटर अंकगणित|Test-And-Set]]
[[Category:समरूपता नियंत्रण|Test-And-Set]]

Latest revision as of 15:26, 13 June 2023

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

परमाणु परीक्षण और टेस्ट-एंड-सेट का उपयोग करके एक लॉक बनाया जा सकता है:[1]

यह कोड मानता है कि पहले टेस्ट-एंड-सेट से पहले किसी बिंदु पर मेमोरी लोकेशन को 0 से प्रारम्भ किया गया था। कॉलिंग प्रक्रिया लॉक प्राप्त करती है यदि पुराना मान 0 था, अन्यथा, जबकि-लूप लॉक प्राप्त करने की प्रतीक्षा में घूमता है। इसे स्पिन लॉक कहते हैं। किसी भी बिंदु पर, लॉक का धारक किसी अन्य द्वारा अधिग्रहण के लिए लॉक को प्रकाशन करने के लिए मेमोरी लोकेशन को वापस 0 पर सेट कर सकता है - इसके लिए किसी विशेष हैंडलिंग की आवश्यकता नहीं होती है क्योंकि धारक इस मेमोरी लोकेशन का "मालिक" होता है। "टेस्ट और टेस्ट-एंड-सेट" एक और उदाहरण है।

मौरिस हर्लिही (1991) ने साबित किया कि टेस्ट-एंड-सेट (1-बिट तुलना) में एक सीमित साधारण सहमति संख्या होती है और अधिकतम दो समवर्ती प्रक्रियाओं के लिए प्रतीक्षा-मुक्त साधारण सहमति की समस्या को हल कर सकता है।[2] इसके विपरीत, तुलना-और-स्वैप (32-बिट तुलना) इस समस्या का अधिक सामान्य समाधान प्रदान करता है, और कुछ कार्यान्वयनों में, तुलना-दोहरा-और-स्वैप (64-बिट तुलना) विस्तारित उपयोगिता के लिए भी उपलब्ध है।

टेस्ट-एंड-सेट का हार्डवेयर कार्यान्वयन

डीपीआरएएम टेस्ट-एंड-सेट निर्देश कई तरीकों से काम कर सकते हैं। यहां दो भिन्नताएं हैं, जिनमें से दोनों डीपीआरएएम का वर्णन करती हैं जो वास्तव में 2 पोर्ट प्रदान करती हैं, जिससे 2 अलग-अलग इलेक्ट्रॉनिक घटकों (जैसे 2 सीपीयू) को डीपीआरएएम पर प्रत्येक मेमोरी लोकेशन तक पहुंच मिलती है।

रूपांतर 1

जब सीपीयू 1 टेस्ट-एंड-सेट निर्देश जारी करता है, तो डीपीआरएएम सबसे पहले एक विशेष लोकेशन पर मेमोरी लोकेशन के एड्रेस को स्टोर करके इसका "आंतरिक नोट" बनाता है। यदि इस बिंदु पर, सीपीयू 2 समान मेमोरी लोकेशन के लिए टेस्ट-एंड-सेट निर्देश जारी करता है, डीपीआरएएम पहले अपने "आंतरिक नोट" की जांच करता है, स्थिति को पहचानता है, और व्यस्त बाधा जारी करता है, जो सीपीयू 2 को बताता है कि उसे प्रतीक्षा करनी होगी और पुनः प्रयास करना होगा। यह व्यस्त प्रतीक्षा या स्पिनलॉक का कार्यान्वयन है जो व्यवधान तंत्र का उपयोग करता है। चूँकि यह सब हार्डवेयर गति पर होता है, सीपीयू 2 का स्पिन-लॉक से बाहर निकलने का इंतजार बहुत कम है।

सीपीयू 2 मेमोरी लोकेशन तक पहुँचने का प्रयास कर रहा था या नहीं, डीपीआरएएम सीपीयू 1 द्वारा दिए गए परीक्षण को करता है। यदि परीक्षण सफल होता है, तो डीपीआरएएम मेमोरी लोकेशन को सीपीयू 1 द्वारा दिए गए मान पर सेट करता है। फिर डीपीआरएएम अपने "आंतरिक नोट" को मिटा देता है जो कि सीपीयू 1 वहां लिख रहा था। इस बिंदु पर, सीपीयू 2 टेस्ट-एंड-सेट जारी कर सकता है, जो सफल होगा।

रूपांतर 2

सीपीयू 1 "मेमोरी लोकेशन A" में लिखने के लिए टेस्ट-एंड-सेट निर्देश जारी करता है। डीपीआरएएम तुरंत मेमोरी लोकेशन A में मूल्य को संग्रहीत नहीं करता है, बल्कि मेमोरी लोकेशन A की सामग्री को विशेष "फ्लैग वैल्यू" पर सेट करते समय वर्तमान मान को विशेष रजिस्टर में ले जाता है। यदि इस बिंदु पर, CPU 2 मेमोरी लोकेशन A पर टेस्ट-एंड-सेट जारी करता है, डीपीआरएएम विशेष फ्लैग वैल्यू का पता लगाता है, और जैसा कि भिन्नता 1 में है, व्यस्त व्यवधान जारी करता है।

चाहे सीपीयू 2 मेमोरी लोकेशन तक पहुँचने का प्रयास कर रहा था या नहीं, डीपीआरएएम अब सीपीयू 1 का परीक्षण करता है। यदि परीक्षण सफल हो जाता है, तो डीपीआरएएम मेमोरी लोकेशन A को सीपीयू 1 द्वारा निर्दिष्ट मान पर सेट करता है। यदि परीक्षण विफल हो जाता है, तो डीपीआरएएम मूल्य को विशेष रजिस्टर से मेमोरी लोकेशन A में वापस कॉपी करता है। कोई भी ऑपरेशन विशेष फ़्लैग मान मिटा देता है। यदि सीपीयू 2 अब टेस्ट-एंड-सेट जारी करता है, तो यह सफल होगा।

टेस्ट-एंड-सेट का सॉफ्टवेयर कार्यान्वयन

कुछ निर्देश सेट में परमाणु टेस्ट-एंड-सेट मशीन भाषा निर्देश होता है। उदाहरणों में x86[3] और आईबीएम सिस्टम/360 और इसके उत्तराधिकारी (जेड/आर्किटेक्चर सहित) सम्मिलित हैं।[4] वे जो अभी भी पठन-संशोधित-लेखन या तुलना-और-स्वैप निर्देश का उपयोग करके परमाणु टेस्ट-एंड-सेट लागू नहीं कर सकते हैं।

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

function TestAndSet(boolean_ref lock) {
    boolean initial = lock;
    lock = true;
    return initial;
}

टेस्ट-एंड-सेट निर्देश के अर्थ में न केवल कोड को परमाणु नहीं दिखाया गया है, बल्कि यह डीपीआरएएम हार्डवेयर टेस्ट-एंड-सेट के ऊपर दिए गए विवरण से भी अलग है। यहां, मान सेट है और परीक्षण निश्चित और अपरिवर्तनीय है और परीक्षण के परिणाम की परवाह किए बिना मूल्य को अपडेट किया जाता है, जबकि डीपीआरएएम टेस्ट-एंड-सेट के लिए, मेमोरी तभी सेट की जाती है जब परीक्षण सफल होता है, और मूल्य सेट करने के लिए और परीक्षण की स्थिति सीपीयू द्वारा निर्दिष्ट की जाती है। यहां, सेट किया जाने वाला मान केवल 1 हो सकता है, लेकिन यदि 0 और 1 को मेमोरी स्थान के लिए केवल मान्य मान माना जाता है, और "मान शून्य नहीं है" केवल अनुमत परीक्षण है, तो यह डीपीआरएएम हार्डवेयर के लिए वर्णित मामले के बराबर है (या, अधिक विशेष रूप से, डीपीआरएएम मामला इन बाधाओं के तहत इसे कम कर देता है)। उस दृष्टिकोण से, यह सही ढंग से, उस शब्द के पूर्ण, पारंपरिक अर्थों में "टेस्ट-एंड-सेट" कहा जा सकता है। नोट करने के लिए आवश्यक बिंदु सामान्य आशय और टेस्ट-एंड-सेट का सिद्धांत है: मूल्य दोनों का परीक्षण किया जाता है और परमाणु ऑपरेशन में सेट किया जाता है जैसे कि कोई अन्य प्रोग्राम थ्रेड या प्रक्रिया परीक्षण के बाद लक्ष्य मेमोरी स्थान को बदल सकती है लेकिन इसे सेट करने से पहले। (ऐसा इसलिए है क्योंकि स्थान को केवल तभी सेट किया जाना चाहिए जब वर्तमान में उसका कोई निश्चित मान हो, न कि यदि वह मान कुछ समय पहले था।)

सी (प्रोग्रामिंग भाषा) में, कार्यान्वयन इस प्रकार होगा:

#define LOCKED 1

int test_and_set(int* lockPtr) {
    int oldValue;

    // -- Start of atomic segment --
    // This should be interpreted as pseudocode for illustrative purposes only.
    // Traditional compilation of this code will not guarantee atomicity, the
    // use of shared memory (i.e., non-cached values), protection from compiler
    // optimizations, or other required properties.
    oldValue = *lockPtr;
    *lockPtr = LOCKED;
    // -- End of atomic segment --

    return oldValue;
}

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

टेस्ट-एंड-सेट का उपयोग करते हुए पारस्परिक बहिष्कार

आपसी बहिष्करण को लागू करने का एक प्रणाली परीक्षण-और-सेट आधारित लॉक[5][6] का उपयोग करना है:

स्पिन लॉक का स्यूडो-सी कार्यान्वयन

volatile int lock = 0;

void critical() {
    // Spin lock: loop forever until we get the lock; we know the lock was
    // successfully obtained after exiting this while loop because the 
    // test_and_set() function locks the lock and returns the previous lock 
    // value. If the previous lock value was 1 then the lock was **already**
    // locked by another thread or process. Once the previous lock value
    // was 0, however, then it indicates the lock was **not** locked before we
    // locked it, but now it **is** locked because we locked it, indicating
    // we own the lock.
    while (test_and_set(&lock) == 1);  
    critical section  // only one process can be in this section at a time
    lock = 0;  // release lock when finished with the critical section
}

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

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

असेंबली कार्यान्वयन

enter_region:        ; A "jump to" tag; function entry point.

  tsl reg, flag      ; Test and Set Lock; flag is the
                     ; shared variable; it is copied
                     ; into the register reg and flag
                     ; then atomically set to 1.

  cmp reg, #0        ; Was flag zero on entry_region?

  jnz enter_region   ; Jump to enter_region if
                     ; reg is non-zero; i.e.,
                     ; flag was non-zero on entry.

  ret                ; Exit; i.e., flag was zero on
                     ; entry. If we get here, tsl
                     ; will have set it non-zero; thus,
                     ; we have claimed the resource
                     ; associated with flag.

leave_region:
  move flag, #0      ; store 0 in flag
  ret                ; return to caller

यहाँ tsl एटोमिक इंस्ट्रक्शन है और flagलॉक वैरिएबल है। प्रक्रिया तब तक वापस नहीं आती जब तक कि वह लॉक प्राप्त नहीं कर लेती।

टेस्ट-एंड-सेट लॉक का प्रदर्शन मूल्यांकन

ताले के लिए सामान्य रूप से चार प्रमुख मूल्यांकन मेट्रिक्स अनियंत्रित ताला-अधिग्रहण विलंबता, बस यातायात, निष्पक्षता और स्टोरेज हैं।[7]

टेस्ट-एंड-सेट स्कोर उनमें से दो पर कम है, अर्थात् उच्च बस यातायात और अनुचितता।

जब प्रोसेसर P1 ने लॉक प्राप्त कर लिया है और प्रोसेसर P2 भी लॉक की प्रतीक्षा कर रहा है, तो लॉक प्राप्त करने के प्रयासों में P2 बस लेन-देन करता रहेगा। जब प्रोसेसर ने लॉक प्राप्त कर लिया है, तो अन्य सभी प्रोसेसर जो उसी लॉक को प्राप्त करना चाहते हैं, बार-बार बस लेन-देन प्रारम्भ करके लॉक प्राप्त करने का प्रयास करते रहते हैं जब तक कि वे लॉक को पकड़ न लें। यह टेस्ट-एंड-सेट की बस यातायात आवश्यकता को काफी बढ़ा देता है। यह कैश और सुसंगतता चूक से अन्य सभी यातायात को धीमा कर देता है। यह पूरे खंड को धीमा कर देता है क्योंकि असफल ताला अधिग्रहण प्रयासों से यातायात संतृप्त होता है। टेस्ट-एंड-टेस्ट-एंड-सेट टीएसएल पर एक सुधार है क्योंकि यह लगातार लॉक अधिग्रहण अनुरोध प्रारम्भ नहीं करता है।

जब हम निष्पक्षता पर विचार करते हैं, तो हम विचार करते हैं कि क्या एक प्रोसेसर को लॉक प्राप्त करने का उचित मौका मिलता है जब वह मुक्त हो। चरम स्थिति में, प्रोसेसर भूखा रह सकता है यानी यह उस समय के दौरान मुक्त होने के बावजूद विस्तारित अवधि के लिए लॉक हासिल करने में सक्षम नहीं हो सकता है।

टीएसएल के लिए संग्रहण ओवरहेड कुछ भी नहीं है क्योंकि केवल एक लॉक की आवश्यकता है। केवल परमाणु निर्देश और शाखा की आवश्यकता होने के बाद से अप्रतिबंधित विलंबता भी कम है।

यह भी देखें

  • फेच-एंड-ऐड
  • टेस्ट और टेस्ट-एंड-सेट
  • लोड-लिंक/स्टोर-सशर्त
  • कम्पेयर-एंड-स्वैप

संदर्भ

  1. Anderson, T. E. (1990-01-01). "शेयर्ड-मनी मल्टीप्रोसेसरों के लिए स्पिन लॉक विकल्पों का प्रदर्शन". IEEE Transactions on Parallel and Distributed Systems. 1 (1): 6–16. doi:10.1109/71.80120. ISSN 1045-9219.
  2. Herlihy, Maurice (January 1991). "प्रतीक्षा-मुक्त तुल्यकालन" (PDF). ACM Trans. Program. Lang. Syst. 13 (1): 124–149. CiteSeerX 10.1.1.56.5659. doi:10.1145/114005.102808. S2CID 2181446. Retrieved 2007-05-20.
  3. "BTS—Bit Test and Set". www.felixcloutier.com. Retrieved 2016-11-21.
  4. "आईबीएम ज्ञान केंद्र". www.ibm.com. Retrieved 2016-11-21.
  5. Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau (2015). Operating Systems: Three Easy Pieces (0.91 ed.). Arpaci-Dusseau Books – via http://www.ostep.org/. {{cite book}}: External link in |via= (help)
  6. Solihin, Yan (2009). Fundamentals of parallel computer architecture : multichip and multicore systems. p. 252. ISBN 9780984163007.
  7. Solihin, Yan (2016). समानांतर वास्तुकला के मूल तत्व. Boca Raton, FL: CRC Press. ISBN 978-1-4822-1118-4.

बाहरी संबंध