सेमाफोर (प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
(Created page with "{{about|the computer programming term|other uses|Semaphore (disambiguation)}} File:Rail-semaphore-signal-Dave-F.jpg|thumb|एक [[रेलवे सेमाफोर स...")
 
No edit summary
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{about|the computer programming term|other uses|Semaphore (disambiguation)}}
{{about|कंप्यूटर प्रोग्रामिंग शब्द|अन्य उपयोग|सेमाफोर (बहुविकल्पी)}}
[[File:Rail-semaphore-signal-Dave-F.jpg|thumb|एक [[रेलवे सेमाफोर सिग्नल]] ({{lang-nl|seinpaal}}, दिज्क्स्ट्रा के मूल विवरण में प्रयुक्त शब्द<ref>{{Cite EWD|74|Over seinpalen}}</ref>).]]
[[File:Rail-semaphore-signal-Dave-F.jpg|thumb|एक [[रेलवे सेमाफोर सिग्नल|रेलवे सेमाफोर संकेत]]   ({{lang-nl|seinpaal}}, दिज्क्स्ट्रा के मूल विवरण में प्रयुक्त शब्द<ref>{{Cite EWD|74|Over seinpalen}}</ref>).]]


{{short description|Variable used in a concurrent system}}
{{short description|Variable used in a concurrent system}}
[[कंप्यूटर विज्ञान]] में, एक सेमाफोर एक [[चर (प्रोग्रामिंग)]] या [[सार डेटा प्रकार]] है जिसका उपयोग कई प्रक्रियाओं (कंप्यूटिंग) द्वारा एक सामान्य संसाधन तक पहुंच को नियंत्रित करने के लिए किया जाता है और एक [[कंप्यूटर मल्टीटास्किंग]] ऑपरेटिंग सिस्टम जैसे समवर्ती [[संगणक वैज्ञानिक]] में महत्वपूर्ण खंड समस्याओं से बचा जाता है। सेमाफोर एक प्रकार का [[तुल्यकालन (कंप्यूटर विज्ञान)]] है। एक तुच्छ सेमाफोर एक सादा चर है जिसे प्रोग्रामर-परिभाषित स्थितियों के आधार पर बदला जाता है (उदाहरण के लिए, वृद्धि या कमी, या टॉगल)।
[[कंप्यूटर विज्ञान]] में, एक सेमाफोर एक [[चर (प्रोग्रामिंग)]] या [[सार डेटा प्रकार]] है जिसका उपयोग कई प्रक्रियाओं (कंप्यूटिंग) द्वारा एक सामान्य संसाधन तक पहुंच को नियंत्रित करने के लिए किया जाता है और एक [[कंप्यूटर मल्टीटास्किंग]] ऑपरेटिंग सिस्टम जैसे समवर्ती [[संगणक वैज्ञानिक]] में महत्वपूर्ण खंड समस्याओं से बचा जाता है। सेमाफोर एक प्रकार का [[तुल्यकालन (कंप्यूटर विज्ञान)]] है। एक तुच्छ सेमाफोर एक सादा चर है जिसे प्रोग्रामर-परिभाषित स्थितियों के आधार पर बदला जाता है (उदाहरण के लिए, वृद्धि या कमी, या टॉगल)।


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


दौड़ स्थितियों की रोकथाम में सेमाफोर एक उपयोगी उपकरण है; हालाँकि, उनका उपयोग इस बात की गारंटी नहीं है कि कोई प्रोग्राम इन समस्याओं से मुक्त है। सेमाफोर जो मनमाने ढंग से संसाधनों की गणना की अनुमति देते हैं उन्हें काउंटिंग सेमाफोर कहा जाता है, जबकि सेमाफोर जो मान 0 और 1 (या लॉक/अनलॉक, अनुपलब्ध/उपलब्ध) तक सीमित हैं उन्हें बाइनरी सेमाफोर कहा जाता है और लॉक (कंप्यूटर विज्ञान) को लागू करने के लिए उपयोग किया जाता है।
दौड़ स्थितियों की रोकथाम में सेमाफोर एक उपयोगी उपकरण है; हालाँकि, उनका उपयोग इस बात की गारंटी नहीं है कि कोई प्रोग्राम इन समस्याओं से मुक्त है। सेमाफोर जो मनमाने ढंग से संसाधनों की गणना की अनुमति देते हैं उन्हें काउंटिंग सेमाफोर कहा जाता है, जबकि सेमाफोर जो मान 0 और 1 (या लॉक/अनलॉक, अनुपलब्ध/उपलब्ध) तक सीमित हैं उन्हें बाइनरी सेमाफोर कहा जाता है और लॉक (कंप्यूटर विज्ञान) को लागू करने के लिए उपयोग किया जाता है।


सेमाफोर अवधारणा का आविष्कार 1962 या 1963 में [[डच लोग]]ों के कंप्यूटर वैज्ञानिक [[एडवर्ड डिजस्ट्रा]] द्वारा किया गया था,<ref name="ReferenceA">{{Cite EWD|35|Over de sequentialiteit van procesbeschrijvingen}} (undated, 1962 or 1963)</ref> जब Dijkstra और उनकी टीम [[Electrologica X8]] के लिए एक [[ऑपरेटिंग सिस्टम]] विकसित कर रहे थे। उस प्रणाली को अंततः [[मल्टीप्रोग्रामिंग सिस्टम]] के रूप में जाना जाने लगा।
सेमाफोर अवधारणा का आविष्कार 1962 या 1963 में [[डच लोग]]ों के कंप्यूटर वैज्ञानिक [[एडवर्ड डिजस्ट्रा]] द्वारा किया गया था,<ref name="ReferenceA">{{Cite EWD|35|Over de sequentialiteit van procesbeschrijvingen}} (undated, 1962 or 1963)</ref> जब डिज्कस्ट्रा और उनकी टीम [[Electrologica X8|इलेक्ट्रोलॉजिका X8]] के लिए एक [[ऑपरेटिंग सिस्टम]] विकसित कर रहे थे। उस प्रणाली को अंततः [[मल्टीप्रोग्रामिंग सिस्टम]] के रूप में जाना जाने लगा।


== [[पुस्तकालय]] सादृश्य ==
== [[पुस्तकालय]] सादृश्य ==
Line 16: Line 16:
सबसे सरल कार्यान्वयन में, [[रिसेप्शनिस्ट]] के [[क्लर्क]] को केवल उपलब्ध मुफ्त कमरों की संख्या के बारे में पता होता है, जिसे वे केवल तभी सही ढंग से जानते हैं जब सभी छात्र वास्तव में अपने कमरे का उपयोग करते हैं जब उन्होंने उनके लिए साइन अप किया होता है और जब वे काम पूरा कर लेते हैं तो उन्हें वापस कर देते हैं। जब कोई छात्र कमरे का अनुरोध करता है, तो क्लर्क इस संख्या को कम कर देता है। जब कोई छात्र कमरा खाली करता है, तो क्लर्क इस संख्या को बढ़ा देता है। कमरे का उपयोग जब तक चाहें तब तक किया जा सकता है, और इसलिए समय से पहले कमरे बुक करना संभव नहीं है।
सबसे सरल कार्यान्वयन में, [[रिसेप्शनिस्ट]] के [[क्लर्क]] को केवल उपलब्ध मुफ्त कमरों की संख्या के बारे में पता होता है, जिसे वे केवल तभी सही ढंग से जानते हैं जब सभी छात्र वास्तव में अपने कमरे का उपयोग करते हैं जब उन्होंने उनके लिए साइन अप किया होता है और जब वे काम पूरा कर लेते हैं तो उन्हें वापस कर देते हैं। जब कोई छात्र कमरे का अनुरोध करता है, तो क्लर्क इस संख्या को कम कर देता है। जब कोई छात्र कमरा खाली करता है, तो क्लर्क इस संख्या को बढ़ा देता है। कमरे का उपयोग जब तक चाहें तब तक किया जा सकता है, और इसलिए समय से पहले कमरे बुक करना संभव नहीं है।


इस परिदृश्य में फ्रंट डेस्क काउंट-होल्डर एक काउंटिंग सेमाफोर का प्रतिनिधित्व करता है, कमरे संसाधन हैं, और छात्र प्रक्रियाओं/धागों का प्रतिनिधित्व करते हैं। इस परिदृश्य में सेमाफोर का मान प्रारंभ में 10 है, जिसमें सभी कमरे खाली हैं। जब एक छात्र एक कमरे का अनुरोध करता है, तो उन्हें पहुंच प्रदान की जाती है, और सेमाफोर का मान 9 में बदल जाता है। अगले छात्र के आने के बाद, यह 8 तक गिर जाता है, फिर 7 और इसी तरह। यदि कोई कमरे का अनुरोध करता है और सेमाफोर का वर्तमान मान 0 है,<ref>[http://greenteapress.com/semaphores/ ''The Little Book of Semaphores''] Allen B. Downey</ref> उन्हें तब तक इंतजार करने के लिए मजबूर किया जाता है जब तक कि एक कमरा खाली नहीं हो जाता (जब गिनती 0 से बढ़ जाती है)। यदि एक कमरा छोड़ दिया गया था, लेकिन कई छात्र प्रतीक्षा कर रहे हैं, तो किसी एक का चयन करने के लिए किसी भी विधि का उपयोग किया जा सकता है जो कमरे पर कब्जा करेगा (जैसे [[फीफो (कंप्यूटिंग और इलेक्ट्रॉनिक्स)]] या बेतरतीब ढंग से एक को चुनना)। और निश्चित रूप से, एक छात्र को अपने कमरे को वास्तव में छोड़ने के बाद ही क्लर्क को सूचित करने की आवश्यकता होती है, अन्यथा, एक अजीब स्थिति हो सकती है जब ऐसे छात्र कमरे छोड़ने की प्रक्रिया में हों (वे अपनी पाठ्यपुस्तकें पैक कर रहे हों, आदि)। और उनके जाने से पहले एक अन्य छात्र कमरे में प्रवेश करता है।
इस परिदृश्य में फ्रंट डेस्क काउंट-होल्डर एक काउंटिंग सेमाफोर का प्रतिनिधित्व करता है, कमरे संसाधन हैं, और छात्र प्रक्रियाओं/धागों का प्रतिनिधित्व करते हैं। इस परिदृश्य में सेमाफोर का मान प्रारंभ में 10 है, जिसमें सभी कमरे खाली हैं। जब एक छात्र एक कमरे का अनुरोध करता है, तो उन्हें पहुंच प्रदान की जाती है, और सेमाफोर का मान 9 में बदल जाता है। अगले छात्र के आने के बाद, यह 8 तक गिर जाता है, फिर 7 और इसी तरह। यदि कोई कमरे का अनुरोध करता है और सेमाफोर का वर्तमान मान 0 है,<ref>[http://greenteapress.com/semaphores/ ''The Little Book of Semaphores''] Allen B. Downey</ref> उन्हें तब तक इंतजार करने के लिए मजबूर किया जाता है जब तक कि एक कमरा खाली नहीं हो जाता (जब गिनती 0 से बढ़ जाती है)। यदि एक कमरा छोड़ दिया गया था, लेकिन कई छात्र प्रतीक्षा कर रहे हैं, तो किसी एक का चयन करने के लिए किसी भी विधि का उपयोग किया जा सकता है जो कमरे पर कब्जा करेगा (जैसे [[फीफो (कंप्यूटिंग और इलेक्ट्रॉनिक्स)]] या बेतरतीब ढंग से एक को चुनना)। और निश्चित रूप से, एक छात्र को अपने कमरे को वास्तव में छोड़ने के बाद ही क्लर्क को सूचित करने की आवश्यकता होती है, अन्यथा, एक अजीब स्थिति हो सकती है जब ऐसे छात्र कमरे छोड़ने की प्रक्रिया में हों (वे अपनी पाठ्यपुस्तकें बाँध रहे हों, आदि)। और उनके जाने से पहले एक अन्य छात्र कमरे में प्रवेश करता है।


=== महत्वपूर्ण अवलोकन ===
=== महत्वपूर्ण अवलोकन ===
जब संसाधनों के एक [[पूल (कंप्यूटर विज्ञान)]] तक पहुंच को नियंत्रित करने के लिए उपयोग किया जाता है, तो एक सेमाफोर केवल यह ट्रैक करता है कि कितने संसाधन मुक्त हैं; यह ट्रैक नहीं करता है कि कौन से संसाधन निःशुल्क हैं। एक विशेष मुक्त संसाधन का चयन करने के लिए कुछ अन्य तंत्र (संभवतः अधिक सेमाफोर शामिल) की आवश्यकता हो सकती है।
जब संसाधनों के एक [[पूल (कंप्यूटर विज्ञान)]] तक पहुंच को नियंत्रित करने के लिए उपयोग किया जाता है, तो एक सेमाफोर केवल यह ट्रैक करता है कि कितने संसाधन मुक्त हैं; यह ट्रैक नहीं करता है कि कौन से संसाधन निःशुल्क हैं। एक विशेष मुक्त संसाधन का चयन करने के लिए कुछ अन्य तंत्र (संभवतः अधिक सेमाफोर सम्मिलित ) की आवश्यकता हो सकती है।


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


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


यहां तक ​​​​कि अगर सभी प्रक्रियाएं इन नियमों का पालन करती हैं, तब भी बहु-संसाधन [[गतिरोध]] तब भी हो सकता है जब अलग-अलग संसाधनों को अलग-अलग सेमाफोर द्वारा प्रबंधित किया जाता है और जब प्रक्रियाओं को एक समय में एक से अधिक संसाधनों का उपयोग करने की आवश्यकता होती है, जैसा कि डाइनिंग फिलोसोफर्स की समस्या से स्पष्ट होता है।
यहां तक ​​​​कि अगर सभी प्रक्रियाएं इन नियमों का पालन करती हैं, तब भी बहु-संसाधन [[गतिरोध]] तब भी हो सकता है जब अलग-अलग संसाधनों को अलग-अलग सेमाफोर द्वारा प्रबंधित किया जाता है और जब प्रक्रियाओं को एक समय में एक से अधिक संसाधनों का उपयोग करने की आवश्यकता होती है, जैसा कि डाइनिंग फिलोसोफर्स की समस्या से स्पष्ट होता है।


== शब्दार्थ और कार्यान्वयन ==
== शब्दार्थ और कार्यान्वयन ==
काउंटिंग सेमाफोर दो संक्रियाओं से सुसज्जित हैं, जिन्हें ऐतिहासिक रूप से P और V के रूप में दर्शाया गया है (देखें {{section link||Operation names}} वैकल्पिक नामों के लिए)। ऑपरेशन V सेमाफोर S को बढ़ाता है, और ऑपरेशन P इसे घटाता है।
काउंटिंग सेमाफोर दो संक्रियाओं से सुसज्जित हैं, जिन्हें ऐतिहासिक रूप से पी और वी के रूप में दर्शाया गया है (देखें {{section link||ऑपरेशन के नाम}} वैकल्पिक नामों के लिए)। ऑपरेशन वी सेमाफोर एस को बढ़ाता है, और ऑपरेशन पी इसे घटाता है।
 
सेमाफोर एस का मान वर्तमान में उपलब्ध संसाधनों की इकाइयों की संख्या है। पी ऑपरेशन वेटिंग या [[ नींद (सिस्टम कॉल) ]] में व्यस्त है जब तक कि सेमाफोर द्वारा संरक्षित संसाधन उपलब्ध नहीं हो जाता है, जिस समय संसाधन का तुरंत दावा किया जाता है। वी ऑपरेशन उलटा है: यह एक संसाधन को फिर से उपलब्ध कराता है जब प्रक्रिया का उपयोग समाप्त हो जाता है।


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


समझने का एक सरल तरीका {{mono|wait}} (पी) और {{mono|signal}} (वी) संचालन है:
समझने का एक सरल तरीका {{mono|प्रतीक्षा }} (पी) और {{mono|संकेत}} (वी) संचालन है:
* {{mono|wait}}: सेमाफोर चर के मान को 1 से घटाता है। यदि सेमाफोर चर का नया मान ऋणात्मक है, तो प्रक्रिया निष्पादित होती है {{mono|wait}} अवरुद्ध है (यानी, सेमाफोर की कतार में जोड़ा गया)। अन्यथा, संसाधन की एक इकाई का उपयोग करके प्रक्रिया निष्पादन जारी रखती है।
* {{mono| प्रतीक्षा}}: सेमाफोर चर के मान को 1 से घटाता है। यदि सेमाफोर चर का नया मान ऋणात्मक है, तो प्रक्रिया निष्पादित होती है {{mono|  प्रतीक्षा}} अवरुद्ध है (यानी, सेमाफोर की पंक्ति में जोड़ा गया)। अन्यथा, संसाधन की एक इकाई का उपयोग करके प्रक्रिया निष्पादन प्रचलित रखती है।
* {{mono|signal}}: सेमाफोर चर के मान को 1 से बढ़ाता है। वृद्धि के बाद, यदि पूर्व-वृद्धि मान ऋणात्मक था (मतलब संसाधन के लिए प्रतीक्षारत प्रक्रियाएं हैं), तो यह एक अवरुद्ध प्रक्रिया को सेमाफोर की प्रतीक्षा कतार से तैयार कतार में स्थानांतरित करता है।
* {{mono|संकेत}}: सेमाफोर चर के मान को 1 से बढ़ाता है। वृद्धि के बाद, यदि पूर्व-वृद्धि मान ऋणात्मक था (मतलब संसाधन के लिए प्रतीक्षारत प्रक्रियाएं हैं), तो यह एक अवरुद्ध प्रक्रिया को सेमाफोर की प्रतीक्षा पंक्ति से तैयार पंक्ति में स्थानांतरित करता है।


कई ऑपरेटिंग सिस्टम कुशल सेमाफोर प्रिमिटिव प्रदान करते हैं जो सेमाफोर के बढ़ने पर प्रतीक्षा प्रक्रिया को अनब्लॉक करते हैं। इसका मतलब यह है कि प्रक्रिया अनावश्यक रूप से सेमाफोर मूल्य की जाँच करने में समय बर्बाद नहीं करती है।
कई ऑपरेटिंग सिस्टम कुशल सेमाफोर प्रिमिटिव प्रदान करते हैं जो सेमाफोर के बढ़ने पर प्रतीक्षा प्रक्रिया को अनब्लॉक करते हैं। इसका मतलब यह है कि प्रक्रिया अनावश्यक रूप से सेमाफोर मूल्य की जाँच करने में समय बर्बाद नहीं करती है।


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


  फ़ंक्शन वी (सेमाफोर एस, पूर्णांक I):
  '''function''' V(semaphore S, integer I):
     [एस एस + मैं]
     [S S + I]
   
   
  समारोह पी (सेमाफोर एस, पूर्णांक I):
  '''function''' P(semaphore S, integer I):
     दोहराना:
     '''repeat:'''
         [अगर एस मैं:
         ['''if''' S I:
         एस एस - आई
         S S − I
         तोड़ना]
         '''break''']


हालांकि, इस खंड का शेष भाग यूनरी वी और पी संचालन के साथ सेमाफोर को संदर्भित करता है, जब तक कि अन्यथा निर्दिष्ट न हो।
हालांकि, इस खंड का शेष भाग यूनरी वी और पी संचालन के साथ सेमाफोर को संदर्भित करता है, जब तक कि अन्यथा निर्दिष्ट न हो।


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


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


== उदाहरण ==
== उदाहरण ==


=== तुच्छ उदाहरण ===
=== तुच्छ उदाहरण ===
एक वेरिएबल A और एक बूलियन वेरिएबल S पर विचार करें। A को तभी एक्सेस किया जाता है जब S को ट्रू मार्क किया जाता है। इस प्रकार, S, A के लिए एक सेमाफोर है।
एक वेरिएबल ए  और एक बूलियन वेरिएबल एस पर विचार करें। ए  को तभी एक्सेस किया जाता है जब एस को ट्रू मार्क किया जाता है। इस प्रकार, एस, ए  के लिए एक सेमाफोर है।


एक ट्रेन स्टेशन (ए) से ठीक पहले एक स्टॉपलाइट सिग्नल (एस) की कल्पना कर सकता है। ऐसे में अगर सिग्नल हरा है, तो कोई ट्रेन स्टेशन में प्रवेश कर सकता है। यदि यह पीला या लाल (या कोई अन्य रंग) है, तो ट्रेन स्टेशन तक नहीं पहुँचा जा सकता है।
एक ट्रेन स्टेशन (ए) से ठीक पहले एक स्टॉपलाइट संकेत  (एस) की कल्पना कर सकता है। ऐसे में अगर संकेत हरा है, तो कोई ट्रेन स्टेशन में प्रवेश कर सकता है। यदि यह पीला या लाल (या कोई अन्य रंग) है, तो ट्रेन स्टेशन तक नहीं पहुँचा जा सकता है।


=== लॉगिन कतार ===
=== लॉगिन पंक्ति ===
एक ऐसी प्रणाली पर विचार करें जो केवल दस उपयोगकर्ताओं (S = 10) का समर्थन कर सकती है। जब भी कोई उपयोगकर्ता लॉग इन करता है, पी को कॉल किया जाता है, सेमाफोर एस को 1 से कम कर दिया जाता है। जब भी कोई उपयोगकर्ता लॉग आउट करता है, वी को कॉल किया जाता है, उपलब्ध हो चुके लॉगिन स्लॉट का प्रतिनिधित्व करते हुए एस को 1 से बढ़ा दिया जाता है। जब S 0 होता है, तो लॉग इन करने के इच्छुक किसी भी उपयोगकर्ता को S बढ़ने तक प्रतीक्षा करनी चाहिए; एक स्लॉट मुक्त होने तक लॉगिन अनुरोध एक फीफो कतार पर लगाया जाता है। [[आपसी बहिष्कार]] का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि अनुरोधों को क्रम में रखा गया है। जब भी एस बढ़ता है (लॉगिन स्लॉट उपलब्ध है), एक लॉगिन अनुरोध को हटा दिया जाता है, और अनुरोध करने वाले उपयोगकर्ता को लॉग इन करने की अनुमति दी जाती है। यदि एस पहले से ही 0 से अधिक है, तो लॉगिन अनुरोध तुरंत हटा दिए जाते हैं।
एक ऐसी प्रणाली पर विचार करें जो केवल दस उपयोगकर्ताओं (एस = 10) का समर्थन कर सकती है। जब भी कोई उपयोगकर्ता लॉग इन करता है, पी को कॉल किया जाता है, सेमाफोर एस को 1 से कम कर दिया जाता है। जब भी कोई उपयोगकर्ता लॉग आउट करता है, वी को कॉल किया जाता है, उपलब्ध हो चुके लॉगिन स्लॉट का प्रतिनिधित्व करते हुए एस को 1 से बढ़ा दिया जाता है। जब एस 0 होता है, तो लॉग इन करने के इच्छुक किसी भी उपयोगकर्ता को एस बढ़ने तक प्रतीक्षा करनी चाहिए; एक स्लॉट मुक्त होने तक लॉगिन अनुरोध एक फीफो पंक्ति पर लगाया जाता है। [[आपसी बहिष्कार]] का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि अनुरोधों को क्रम में रखा गया है। जब भी एस बढ़ता है (लॉगिन स्लॉट उपलब्ध है), एक लॉगिन अनुरोध को हटा दिया जाता है, और अनुरोध करने वाले उपयोगकर्ता को लॉग इन करने की अनुमति दी जाती है। यदि एस पहले से ही 0 से अधिक है, तो लॉगिन अनुरोध तुरंत हटा दिए जाते हैं।


=== निर्माता-उपभोक्ता समस्या ===
=== निर्माता-उपभोक्ता समस्या ===


निर्माता-उपभोक्ता समस्या में, एक प्रक्रिया (निर्माता) डेटा आइटम उत्पन्न करती है और दूसरी प्रक्रिया (उपभोक्ता) उन्हें प्राप्त करती है और उनका उपयोग करती है। वे अधिकतम आकार N की कतार का उपयोग करके संचार करते हैं और निम्नलिखित शर्तों के अधीन हैं:
निर्माता-उपभोक्ता समस्या में, एक प्रक्रिया (निर्माता) डेटा आइटम उत्पन्न करती है और दूसरी प्रक्रिया (उपभोक्ता) उन्हें प्राप्त करती है और उनका उपयोग करती है। वे अधिकतम आकार एन की पंक्ति का उपयोग करके संचार करते हैं और निम्नलिखित उपबंध के अधीन हैं:
* कतार खाली होने पर उपभोक्ता को निर्माता के लिए कुछ उत्पादन करने की प्रतीक्षा करनी चाहिए;
* पंक्ति खाली होने पर उपभोक्ता को निर्माता के लिए कुछ उत्पादन करने की प्रतीक्षा करनी चाहिए;
* कतार पूरी होने पर निर्माता को उपभोक्ता द्वारा कुछ उपभोग करने की प्रतीक्षा करनी चाहिए।
* पंक्ति पूरी होने पर निर्माता को उपभोक्ता द्वारा कुछ उपभोग करने की प्रतीक्षा करनी चाहिए।


निर्माता-उपभोक्ता समस्या का सेमाफोर समाधान कतार की स्थिति को दो सेमाफोर के साथ ट्रैक करता है: <code>emptyCount</code>, कतार में खाली स्थानों की संख्या, और <code>fullCount</code>, कतार में तत्वों की संख्या। अखंडता बनाए रखने के लिए, <code>emptyCount</code> कतार में खाली स्थानों की वास्तविक संख्या से कम (लेकिन कभी अधिक नहीं) हो सकता है, और <code>fullCount</code> कतार में वस्तुओं की वास्तविक संख्या की तुलना में कम (लेकिन कभी अधिक नहीं) हो सकता है। खाली स्थान और आइटम दो प्रकार के संसाधनों का प्रतिनिधित्व करते हैं, खाली बॉक्स और पूर्ण बॉक्स, और सेमाफोर <code>emptyCount</code> और <code>fullCount</code> इन संसाधनों पर नियंत्रण बनाए रखें।
निर्माता-उपभोक्ता समस्या का सेमाफोर समाधान पंक्ति की स्थिति को दो सेमाफोर के साथ ट्रैक करता है: <code>खाली गिनती</code>, पंक्ति में खाली स्थानों की संख्या, और <code>पूर्ण गणना</code>, पंक्ति में तत्वों की संख्या। अखंडता बनाए रखने के लिए, <code>खाली गिनती</code> पंक्ति में खाली स्थानों की वास्तविक संख्या से कम (लेकिन कभी अधिक नहीं) हो सकता है, और <code>पूर्ण गणना</code>पंक्ति में वस्तुओं की वास्तविक संख्या की तुलना में कम (लेकिन कभी अधिक नहीं) हो सकता है। खाली स्थान और आइटम दो प्रकार के संसाधनों का प्रतिनिधित्व करते हैं, खाली बॉक्स और पूर्ण बॉक्स, और सेमाफोर <code>खाली गिनती</code> और <code>पूर्ण गणना</code> इन संसाधनों पर नियंत्रण बनाए रखें।


बाइनरी सेमाफोर <code>useQueue</code> यह सुनिश्चित करता है कि कतार की स्थिति की अखंडता से समझौता नहीं किया जाता है, उदाहरण के लिए दो उत्पादकों द्वारा एक साथ खाली कतार में आइटम जोड़ने का प्रयास किया जाता है, जिससे इसकी आंतरिक स्थिति दूषित हो जाती है। वैकल्पिक रूप से बाइनरी सेमाफोर के स्थान पर एक [[ म्युटेक्स ]] का उपयोग किया जा सकता है। <code>emptyCount</code> ई> शुरू में एन है, <code>fullCount</code> प्रारंभ में 0 है, और <code>useQueue</code> प्रारंभ में 1 है।
बाइनरी सेमाफोर <code>उपयोग कतार</code> यह सुनिश्चित करता है कि पंक्ति की स्थिति की अखंडता से समझौता नहीं किया जाता है, उदाहरण के लिए दो उत्पादकों द्वारा एक साथ खाली पंक्ति में आइटम जोड़ने का प्रयास किया जाता है, जिससे इसकी आंतरिक स्थिति दूषित हो जाती है। वैकल्पिक रूप से बाइनरी सेमाफोर के स्थान पर एक [[ म्युटेक्स ]] का उपयोग किया जा सकता है। <code>खाली गिनती</code> ई> प्रारम्भ  में एन है, <code>पूर्ण गणना</code> प्रारंभ में 0 है, और <code>उपयोग कतार</code> प्रारंभ में 1 है।


निर्माता निम्नलिखित बार-बार करता है:
निर्माता निम्नलिखित बार-बार करता है:
Line 84: Line 85:
  उत्पाद:
  उत्पाद:
     पी (खाली गिनती)
     पी (खाली गिनती)
     पी (उपयोग कतार)
     पी (उपयोग पंक्ति)
    putItemIntoQueue (आइटम)
    आइटम को कतार में रखें(आइटम)
     वी (उपयोग कतार)
     वी (उपयोग पंक्ति)
     वी (पूर्ण गणना)
     वी (पूर्ण गणना)


Line 93: Line 94:
  उपभोग करना:
  उपभोग करना:
     पी (पूर्ण गणना)
     पी (पूर्ण गणना)
     पी (उपयोग कतार)
     पी (उपयोग पंक्ति)
     आइटम ← getItemFromQueue ()
     आइटम ← कतार से आइटम प्राप्त करें ()
     वी (उपयोग कतार)
     वी (उपयोग पंक्ति)
     वी (खाली गिनती)
     वी (खाली गिनती)


नीचे एक वास्तविक उदाहरण है:
नीचे एक वास्तविक उदाहरण है:
# एक एकल उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश करता है। तब से <code>fullCount</code> 0 है, उपभोक्ता ब्लॉक।
# एक एकल उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश करता है। तब से <code>पूर्ण गणना</code> 0 है, उपभोक्ता ब्लॉक।
# कई निर्माता निर्माता के महत्वपूर्ण खंड में प्रवेश करते हैं। एन उत्पादकों से अधिक कोई भी उनके महत्वपूर्ण खंड में प्रवेश नहीं कर सकता है <code>emptyCount</code> उनके प्रवेश पर रोक।
# कई निर्माता निर्माता के महत्वपूर्ण खंड में प्रवेश करते हैं। एन उत्पादकों से अधिक कोई भी उनके महत्वपूर्ण खंड में प्रवेश नहीं कर सकता है <code>खाली गिनती</code> उनके प्रवेश पर रोक।
# निर्माता, एक समय में, कतार तक पहुंच प्राप्त करते हैं <code>useQueue</code> और कतार में आइटम जमा करें।
# निर्माता, एक समय में, पंक्ति तक पहुंच प्राप्त करते हैं <code>uएसeQueue</code> और पंक्ति में आइटम जमा करें।
# एक बार जब पहला निर्माता अपने महत्वपूर्ण खंड से बाहर निकल जाता है, <code>fullCount</code> वृद्धि हुई है, जिससे एक उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश कर सकता है।
# एक बार जब पहला निर्माता अपने महत्वपूर्ण खंड से बाहर निकल जाता है, <code>पूर्ण गणना</code> वृद्धि हुई है, जिससे एक उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश कर सकता है।


ध्यान दें कि <code>emptyCount</code> कतार में खाली स्थानों की वास्तविक संख्या की तुलना में बहुत कम हो सकता है, उदाहरण के लिए जहां कई उत्पादकों ने इसे घटा दिया है लेकिन अपनी बारी का इंतजार कर रहे हैं <code>useQueue</code> खाली जगह भरने से पहले ध्यान दें कि <code>emptyCount + fullCount ≤ ''N'' </code> हमेशा समानता के साथ रखता है अगर और केवल अगर कोई निर्माता या उपभोक्ता अपने महत्वपूर्ण वर्गों को निष्पादित नहीं कर रहे हैं।
ध्यान दें कि <code>खाली गिनतीt</code> पंक्ति में खाली स्थानों की वास्तविक संख्या की तुलना में बहुत कम हो सकता है, उदाहरण के लिए जहां कई उत्पादकों ने इसे घटा दिया है लेकिन अपनी बारी का इंतजार कर रहे हैं <code>उपयोग पंक्ति</code> खाली जगह भरने से पहले ध्यान दें कि <code>खाली गिनती + पूर्ण गणनाt ≤ ''एन'' </code> हमेशा समानता के साथ रखता है अगर और केवल अगर कोई निर्माता या उपभोक्ता अपने महत्वपूर्ण वर्गों को निष्पादित नहीं कर रहे हैं।


== ऑपरेशन के नाम ==
== ऑपरेशन के नाम ==
विहित नाम वी और पी डच भाषा के शब्दों के पहले अक्षर से आते हैं। वी को आम तौर पर वेरोजेन (वृद्धि) के रूप में समझाया जाता है। पी के लिए कई स्पष्टीकरण पेश किए गए हैं, जिनमें प्रोब्रेन (परीक्षण या प्रयास करना) शामिल है,<ref>{{harvnb|Silberschatz|Galvin|Gagne|2008|p=234}}</ref> पास (पास), और हड़पना (हड़पना)। इस विषय पर दिज्क्स्ट्रा का सबसे पहला पेपर<ref name="ReferenceA"/>पी के अर्थ के रूप में पासिंग (पासिंग) देता है, और वी के अर्थ के रूप में व्रजगवे (रिलीज) देता है। इसमें यह भी उल्लेख किया गया है कि शब्दावली रेलवे सिग्नल में उपयोग की जाने वाली शब्दावली से ली गई है। दिज्क्स्ट्रा ने बाद में लिखा कि उनका इरादा पी को प्रोलाग के लिए खड़ा करना था,<ref>{{Cite EWD|74}}</ref> प्रोबेरर ते वर्लगेन के लिए संक्षिप्त, शाब्दिक रूप से कम करने का प्रयास करें, या दूसरे मामले में उपयोग की जाने वाली शर्तों को समानांतर करने के लिए, कम करने का प्रयास करें।<ref>{{Cite EWD|51| MULTIPROGAMMERING EN DE X8}} (in [[Dutch language|Dutch]])</ref><ref name="try-and">Dijkstra's own translation reads "try-''and''-decrease", although that phrase might be confusing for those unaware of the [http://www.wsu.edu/~brians/errors/try.html colloquial "try-and..."]</ref><ref>[https://lkml.org/lkml/2005/12/19/34 (PATCH 1/19) MUTEX: Introduce simple mutex implementation] Linux Kernel Mailing List, 19 December 2005</ref>
विहित नाम वी और पी डच भाषा के शब्दों के पहले अक्षर से आते हैं। वी को प्रायः  वेरोजेन (वृद्धि) के रूप में समझाया जाता है। पी के लिए कई स्पष्टीकरण प्रस्तुत  किए गए हैं, जिनमें प्रोब्रेन (परीक्षण या प्रयास करना) सम्मिलित  है,<ref>{{harvnb|Silberschatz|Galvin|Gagne|2008|p=234}}</ref> पास (पास), और हड़पना (हड़पना)। इस विषय पर दिज्क्स्ट्रा का सबसे पहला पेपर<ref name="ReferenceA"/>पी के अर्थ के रूप में पासिंग (पासिंग) देता है, और वी के अर्थ के रूप में व्रजगवे (रिलीज) देता है। इसमें यह भी उल्लेख किया गया है कि शब्दावली रेलवे संकेत  में उपयोग की जाने वाली शब्दावली से ली गई है। दिज्क्स्ट्रा ने बाद में लिखा कि उनका इरादा पी को प्रोलाग के लिए खड़ा करना था,<ref>{{Cite EWD|74}}</ref> प्रोबेरर ते वर्लगेन के लिए संक्षिप्त, शाब्दिक रूप से कम करने का प्रयास करें, या दूसरे मामले में उपयोग की जाने वाली शर्तों को समानांतर करने के लिए, कम करने का प्रयास करें।<ref>{{Cite EWD|51| MULTIPROGAMMERING EN DE X8}} (in [[Dutch language|Dutch]])</ref><ref name="try-and">Dijkstra's own translation reads "try-''and''-decrease", although that phrase might be confusing for those unaware of the [http://www.wsu.edu/~brians/errors/try.html colloquial "try-and..."]</ref><ref>[https://lkml.org/lkml/2005/12/19/34 (PATCH 1/19) MUTEX: Introduce simple mutex implementation] Linux Kernel Mailing List, 19 December 2005</ref>
[[ALGOL 68]] में, [[लिनक्स कर्नेल]],<ref>[http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html#ss5.3 Linux Kernel hacking HOWTO] {{Webarchive|url=https://web.archive.org/web/20100528154351/http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html#ss5.3 |date=2010-05-28 }} LinuxGrill.com</ref> और कुछ अंग्रेजी पाठ्यपुस्तकों में, V और P संक्रियाओं को क्रमशः ऊपर और नीचे कहा जाता है। सॉफ्टवेयर इंजीनियरिंग अभ्यास में, उन्हें अक्सर संकेत और प्रतीक्षा कहा जाता है,<ref name="plan9">{{cite conference |last1=Mullender |first1=Sape |first2=Russ |last2=Cox |title=Semaphores in Plan 9 |conference=3rd International Workshop on [[Plan 9 from Bell Labs|Plan 9]] |year=2008 |url=http://doc.cat-v.org/plan_9/IWP9/2008/iwp9_proceedings08.pdf#page=62}}</ref> जारी करना और प्राप्त करना{{r|plan9}} (जो कि मानक [[जावा (प्रोग्रामिंग भाषा)]] लाइब्रेरी है<ref>{{Javadoc:SE|package=java.util.concurrent|java/util/concurrent|Semaphore}}</ref> का उपयोग करता है), या पोस्ट और पेंड। कुछ पाठ<ref>{{Cite web|url=http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node036A.html|title=exec.library/Procure|website=amigadev.elowar.com|access-date=2016-09-19}}</ref><ref>{{Cite web|url=http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node0389.html|title=exec.library/Vacate|website=amigadev.elowar.com|access-date=2016-09-19}}</ref> उन्हें खाली करने के लिए कहें और मूल डच इनिशियल्स से मिलान करने के लिए खरीद लें।
 
[[ALGOL 68|एलजीओएल 68]] में, [[लिनक्स कर्नेल]],<ref>[http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html#ss5.3 Linux Kernel hacking HOWTO] {{Webarchive|url=https://web.archive.org/web/20100528154351/http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html#ss5.3 |date=2010-05-28 }} LinuxGrill.com</ref> और कुछ अंग्रेजी पाठ्यपुस्तकों में, वी और पी संक्रियाओं को क्रमशः ऊपर और नीचे कहा जाता है। सॉफ्टवेयर इंजीनियरिंग अभ्यास में, उन्हें अक्सर संकेत और प्रतीक्षा कहा जाता है,<ref name="plan9">{{cite conference |last1=Mullender |first1=Sape |first2=Russ |last2=Cox |title=Semaphores in Plan 9 |conference=3rd International Workshop on [[Plan 9 from Bell Labs|Plan 9]] |year=2008 |url=http://doc.cat-v.org/plan_9/IWP9/2008/iwp9_proceedings08.pdf#page=62}}</ref> प्रचलित करना और प्राप्त करना{{r|plan9}} (जो कि मानक [[जावा (प्रोग्रामिंग भाषा)]] लाइब्रेरी है<ref>{{Javadoc:SE|package=java.util.concurrent|java/util/concurrent|Semaphore}}</ref> का उपयोग करता है), या पोस्ट और भुगतान किया। कुछ पाठ<ref>{{Cite web|url=http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node036A.html|title=exec.library/Procure|website=amigadev.elowar.com|access-date=2016-09-19}}</ref><ref>{{Cite web|url=http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node0389.html|title=exec.library/Vacate|website=amigadev.elowar.com|access-date=2016-09-19}}</ref> उन्हें खाली करने के लिए कहें और मूल डच इनिशियल्स से मिलान करने के लिए खरीद लें।


== सेमाफोरस बनाम म्यूटेक्स ==
== सेमाफोरस बनाम म्यूटेक्स ==
एक म्युटेक्स एक म्युचुअल एक्सक्लूज़न#टाइप ऑफ़ म्यूच्यूअल एक्सक्लूज़न डिवाइस है जो कभी-कभी बाइनरी सेमाफोर के समान बुनियादी कार्यान्वयन का उपयोग करता है। उनके बीच का अंतर यह है कि उनका उपयोग कैसे किया जाता है। जबकि एक बाइनरी सेमाफोर को बोलचाल की भाषा में म्यूटेक्स के रूप में संदर्भित किया जा सकता है, एक सच्चे म्यूटेक्स में एक अधिक विशिष्ट उपयोग-मामला और परिभाषा होती है, जिसमें म्यूटेक्स को लॉक करने वाले [[टास्क (कंप्यूटिंग)]] को इसे अनलॉक करना होता है। इस बाधा का उद्देश्य सेमाफोर का उपयोग करने की कुछ संभावित समस्याओं से निपटना है:
एक म्युटेक्स एक म्युचुअल एक्सक्लूज़न टाइप ऑफ़ म्यूच्यूअल एक्सक्लूज़न उपकरण है जो कभी-कभी बाइनरी सेमाफोर के समान बुनियादी कार्यान्वयन का उपयोग करता है। उनके बीच का अंतर यह है कि उनका उपयोग कैसे किया जाता है। जबकि एक बाइनरी सेमाफोर को बोलचाल की भाषा में म्यूटेक्स के रूप में संदर्भित किया जा सकता है, एक सच्चे म्यूटेक्स में एक अधिक विशिष्ट उपयोग-मामला और परिभाषा होती है, जिसमें म्यूटेक्स को लॉक करने वाले [[टास्क (कंप्यूटिंग)]] को इसे अनलॉक करना होता है। इस बाधा का उद्देश्य सेमाफोर का उपयोग करने की कुछ संभावित समस्याओं से निपटना है:
# प्राथमिकता व्युत्क्रम: यदि म्यूटेक्स को पता है कि किसने इसे लॉक किया है और इसे अनलॉक करना है, तो उस कार्य की प्राथमिकता को बढ़ावा देना संभव है जब भी कोई उच्च-प्राथमिकता वाला कार्य म्यूटेक्स पर प्रतीक्षा करना शुरू करता है।
# प्राथमिकता व्युत्क्रम: यदि म्यूटेक्स को पता है कि किसने इसे लॉक किया है और इसे अनलॉक करना है, तो उस कार्य की प्राथमिकता को बढ़ावा देना संभव है जब भी कोई उच्च-प्राथमिकता वाला कार्य म्यूटेक्स पर प्रतीक्षा करना प्रारम्भ  करता है।
# समय से पहले कार्य समाप्ति: म्यूटेक्स विलोपन सुरक्षा भी प्रदान कर सकता है, जहां म्यूटेक्स को रखने वाले कार्य को गलती से हटाया नहीं जा सकता है। {{citation needed|date=May 2019}}
# समय से पहले कार्य समाप्ति: म्यूटेक्स विलोपन सुरक्षा भी प्रदान कर सकता है, जहां म्यूटेक्स को रखने वाले कार्य को गलती से हटाया नहीं जा सकता है। {{citation needed|date=May 2019}}
# समाप्ति गतिरोध: यदि किसी कारण से म्यूटेक्स-होल्डिंग कार्य समाप्त हो जाता है, तो [[रीयल-टाइम ऑपरेटिंग सिस्टम]] इस स्थिति के म्यूटेक्स और सिग्नल प्रतीक्षा कार्यों को जारी कर सकता है।
# समाप्ति गतिरोध: यदि किसी कारण से म्यूटेक्स-होल्डिंग कार्य समाप्त हो जाता है, तो [[रीयल-टाइम ऑपरेटिंग सिस्टम]] इस स्थिति के म्यूटेक्स और संकेत  प्रतीक्षा कार्यों को प्रचलित कर सकता है।
# पुनरावर्तन गतिरोध: एक कार्य को एक पुनर्वित्त म्यूटेक्स को कई बार लॉक करने की अनुमति दी जाती है क्योंकि यह इसे समान संख्या में अनलॉक करता है।
# पुनरावर्तन गतिरोध: एक कार्य को एक पुनर्वित्त म्यूटेक्स को कई बार लॉक करने की अनुमति दी जाती है क्योंकि यह इसे समान संख्या में अनलॉक करता है।
# एक्सीडेंटल रिलीज़: म्यूटेक्स के रिलीज़ होने पर एक त्रुटि उत्पन्न होती है यदि रिलीज़ करने वाला कार्य उसका स्वामी नहीं है।
# एक्सीडेंटल रिलीज़: म्यूटेक्स के रिलीज़ होने पर एक त्रुटि उत्पन्न होती है यदि रिलीज़ करने वाला कार्य उसका स्वामी नहीं है।
Line 133: Line 135:
==बाहरी संबंध==
==बाहरी संबंध==


 
परिचय
 
 
=== परिचय ===
 
* हिल्सहाइमर, वोल्कर (2004)। [https://doc.qt.io/archives/qq/qq11-mutex.html रीड/राइट म्यूटेक्स लागू करना] (वेब ​​पेज)। क्यूटी तिमाही, अंक 11 - क्यू3 2004
* हिल्सहाइमर, वोल्कर (2004)। [https://doc.qt.io/archives/qq/qq11-mutex.html रीड/राइट म्यूटेक्स लागू करना] (वेब ​​पेज)। क्यूटी तिमाही, अंक 11 - क्यू3 2004
* {{cite journal |url= https://see.stanford.edu/materials/icsppcs107/23-Concurrency-Examples.pdf |first1= Julie |last1= Zelenski |first2= Nick |last2= Parlante |series= CS107 Programming Paradigms |volume= Spring 2008 |issue= 23 |journal= Handout |title= थ्रेड और सेमाफोर उदाहरण|publisher= Stanford Engineering Everwhere (SEE) }}
* {{cite journal |url= https://see.stanford.edu/materials/icsppcs107/23-Concurrency-Examples.pdf |first1= जूली |last1= ज़ेलेंस्की |first2= छेद |last2= भाषा |series= CS107 प्रोग्रामिंग प्रतिमान |volume= स्प्रिंग 2008 |issue= 23 |journal= थिसिस |title= थ्रेड और सेमाफोर उदाहरण|publisher= स्टैनफोर्ड इंजीनियरिंग एवरव्हेयर (एसईई) }}


=== संदर्भ ===
=== संदर्भ ===
*{{Cite EWD|123|Cooperating sequential processes}} (September 1965)
*{{Cite EWD|123|अनुक्रमिक प्रक्रियाओं का सहयोग करना}} (एसeपीtember 1965)
*{{citation |mode=cs1 |url=http://www.opengroup.org/onlinepubs/009695399/basedefs/semaphore.h.html |section=semaphore.h - semaphores (REALTIME) |title=The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition |publisher=Open Group |date=2004}}
*{{citation |mode=सीएस 1 |url=http://www.opengroup.org/onlinepubs/009695399/basedefs/semaphore.h.html |section=सेमाफोर.एच - सेमाफोर (वास्तविक समय) |title=ओपन ग्रुप बेस स्पेसिफिकेशंस इश्यू 6 IEEE Std 1003.1, 2004 संस्करण |publisher=खुला समूह |date=2004}}
*{{cite web |url= http://greenteapress.com/semaphores/ |title= The Little Book of Semaphores |first= Allen B. |last= Downey |publisher= Green Tea Press |issue= 2.2.1 |edition= 2nd |date= 2016 |orig-year= 2005 }}
*{{cite web |url= http://greenteapress.com/semaphores/ |title= सेमाफोरस की छोटी किताब |first= एलन बी. |last= डाउनी |publisher= ग्रीन टी प्रेस |issue= 2.2.1 |edition= 2nd |date= 2016 |orig-year= 2005 }}
*{{cite web |url= http://www.enseignement.polytechnique.fr/informatique/INF431/X09-2010-2011/AmphiTHC/SynchronizationPrimitives.pdf |title= A pragmatic, historically oriented survey on the universality of synchronization primitives |first= Jouni |last= Leppäjärvi |date= May 11, 2008 |location= University of Oulu, Finland }}
*{{cite web |url= http://www.enseignement.polytechnique.fr/informatique/INF431/X09-2010-2011/AmphiTHC/SynchronizationPrimitives.pdf |title= तुल्यकालन आदिमों की सार्वभौमिकता पर एक व्यावहारिक, ऐतिहासिक रूप से उन्मुख सर्वेक्षण |first= जौनी |last= लेप्पाजर्वी |date= May 11, 2008 |location= औलू विश्वविद्यालय, फिनलैंड }}


{{Data types}}
{{Data types}}
Line 151: Line 149:
{{Parallel computing}}
{{Parallel computing}}


{{DEFAULTSORT:Semaphore (Programming)}}[[Category: तुल्यकालन | कंप्यूटर विज्ञान]] [[Category: समरूपता नियंत्रण]] [[Category: समवर्ती (कंप्यूटर विज्ञान)]] [[Category: समानांतर कंप्यूटिंग]] [[Category: कंप्यूटर के मध्यस्थता द्वारा संचार]] [[Category: एडजर डब्ल्यू डिज्कस्ट्रा]] [[Category: डच आविष्कार]]
{{DEFAULTSORT:Semaphore (Programming)}}
 
 


[[Category: Machine Translated Page]]
[[Category:All articles with unsourced statements|Semaphore (Programming)]]
[[Category:Created On 26/05/2023]]
[[Category:Articles containing Dutch-language text|Semaphore (Programming)]]
[[Category:Articles with hatnote templates targeting a nonexistent page|Semaphore (Programming)]]
[[Category:Articles with unsourced statements from May 2019|Semaphore (Programming)]]
[[Category:CS1|Semaphore (Programming)]]
[[Category:CS1 errors|Semaphore (Programming)]]
[[Category:Collapse templates|Semaphore (Programming)]]
[[Category:Created On 26/05/2023|Semaphore (Programming)]]
[[Category:Lua-based templates|Semaphore (Programming)]]
[[Category:Machine Translated Page|Semaphore (Programming)]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Semaphore (Programming)]]
[[Category:Pages with script errors|Semaphore (Programming)]]
[[Category:Sidebars with styles needing conversion|Semaphore (Programming)]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Semaphore (Programming)]]
[[Category:Templates generating microformats|Semaphore (Programming)]]
[[Category:Templates that add a tracking category|Semaphore (Programming)]]
[[Category:Templates that are not mobile friendly|Semaphore (Programming)]]
[[Category:Templates that generate short descriptions|Semaphore (Programming)]]
[[Category:Templates using TemplateData|Semaphore (Programming)]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia metatemplates|Semaphore (Programming)]]
[[Category:एडजर डब्ल्यू डिज्कस्ट्रा|Semaphore (Programming)]]
[[Category:कंप्यूटर के मध्यस्थता द्वारा संचार|Semaphore (Programming)]]
[[Category:डच आविष्कार|Semaphore (Programming)]]
[[Category:तुल्यकालन| कंप्यूटर विज्ञान]]
[[Category:समरूपता नियंत्रण|Semaphore (Programming)]]
[[Category:समवर्ती (कंप्यूटर विज्ञान)|Semaphore (Programming)]]
[[Category:समानांतर कंप्यूटिंग|Semaphore (Programming)]]

Latest revision as of 12:14, 10 June 2023

एक रेलवे सेमाफोर संकेत (Dutch: seinpaal, दिज्क्स्ट्रा के मूल विवरण में प्रयुक्त शब्द[1]).

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

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

दौड़ स्थितियों की रोकथाम में सेमाफोर एक उपयोगी उपकरण है; हालाँकि, उनका उपयोग इस बात की गारंटी नहीं है कि कोई प्रोग्राम इन समस्याओं से मुक्त है। सेमाफोर जो मनमाने ढंग से संसाधनों की गणना की अनुमति देते हैं उन्हें काउंटिंग सेमाफोर कहा जाता है, जबकि सेमाफोर जो मान 0 और 1 (या लॉक/अनलॉक, अनुपलब्ध/उपलब्ध) तक सीमित हैं उन्हें बाइनरी सेमाफोर कहा जाता है और लॉक (कंप्यूटर विज्ञान) को लागू करने के लिए उपयोग किया जाता है।

सेमाफोर अवधारणा का आविष्कार 1962 या 1963 में डच लोगों के कंप्यूटर वैज्ञानिक एडवर्ड डिजस्ट्रा द्वारा किया गया था,[2] जब डिज्कस्ट्रा और उनकी टीम इलेक्ट्रोलॉजिका X8 के लिए एक ऑपरेटिंग सिस्टम विकसित कर रहे थे। उस प्रणाली को अंततः मल्टीप्रोग्रामिंग सिस्टम के रूप में जाना जाने लगा।

पुस्तकालय सादृश्य

मान लीजिए कि एक भौतिक पुस्तकालय में एक समय में एक छात्र द्वारा उपयोग किए जाने वाले 10 समान अध्ययन कक्ष हैं। यदि छात्र अध्ययन कक्ष का उपयोग करना चाहते हैं तो उन्हें फ्रंट डेस्क से एक कमरे का अनुरोध करना होगा। यदि कोई कमरा खाली नहीं है, तो छात्र डेस्क पर तब तक प्रतीक्षा करते हैं जब तक कि कोई कमरा खाली नहीं कर देता। जब एक छात्र एक कमरे का उपयोग करना समाप्त कर लेता है, तो छात्र को डेस्क पर लौटना चाहिए और यह इंगित करना चाहिए कि एक कमरा खाली हो गया है।

सबसे सरल कार्यान्वयन में, रिसेप्शनिस्ट के क्लर्क को केवल उपलब्ध मुफ्त कमरों की संख्या के बारे में पता होता है, जिसे वे केवल तभी सही ढंग से जानते हैं जब सभी छात्र वास्तव में अपने कमरे का उपयोग करते हैं जब उन्होंने उनके लिए साइन अप किया होता है और जब वे काम पूरा कर लेते हैं तो उन्हें वापस कर देते हैं। जब कोई छात्र कमरे का अनुरोध करता है, तो क्लर्क इस संख्या को कम कर देता है। जब कोई छात्र कमरा खाली करता है, तो क्लर्क इस संख्या को बढ़ा देता है। कमरे का उपयोग जब तक चाहें तब तक किया जा सकता है, और इसलिए समय से पहले कमरे बुक करना संभव नहीं है।

इस परिदृश्य में फ्रंट डेस्क काउंट-होल्डर एक काउंटिंग सेमाफोर का प्रतिनिधित्व करता है, कमरे संसाधन हैं, और छात्र प्रक्रियाओं/धागों का प्रतिनिधित्व करते हैं। इस परिदृश्य में सेमाफोर का मान प्रारंभ में 10 है, जिसमें सभी कमरे खाली हैं। जब एक छात्र एक कमरे का अनुरोध करता है, तो उन्हें पहुंच प्रदान की जाती है, और सेमाफोर का मान 9 में बदल जाता है। अगले छात्र के आने के बाद, यह 8 तक गिर जाता है, फिर 7 और इसी तरह। यदि कोई कमरे का अनुरोध करता है और सेमाफोर का वर्तमान मान 0 है,[3] उन्हें तब तक इंतजार करने के लिए मजबूर किया जाता है जब तक कि एक कमरा खाली नहीं हो जाता (जब गिनती 0 से बढ़ जाती है)। यदि एक कमरा छोड़ दिया गया था, लेकिन कई छात्र प्रतीक्षा कर रहे हैं, तो किसी एक का चयन करने के लिए किसी भी विधि का उपयोग किया जा सकता है जो कमरे पर कब्जा करेगा (जैसे फीफो (कंप्यूटिंग और इलेक्ट्रॉनिक्स) या बेतरतीब ढंग से एक को चुनना)। और निश्चित रूप से, एक छात्र को अपने कमरे को वास्तव में छोड़ने के बाद ही क्लर्क को सूचित करने की आवश्यकता होती है, अन्यथा, एक अजीब स्थिति हो सकती है जब ऐसे छात्र कमरे छोड़ने की प्रक्रिया में हों (वे अपनी पाठ्यपुस्तकें बाँध रहे हों, आदि)। और उनके जाने से पहले एक अन्य छात्र कमरे में प्रवेश करता है।

महत्वपूर्ण अवलोकन

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

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

प्रोटोकॉल की सफलता के लिए अनुप्रयोगों को इसका सही ढंग से पालन करने की आवश्यकता होती है। निष्पक्षता और सुरक्षा से समझौता किए जाने की संभावना है (जिसका व्यावहारिक अर्थ है कि एक प्रोग्राम धीरे-धीरे व्यवहार कर सकता है, अनियमित रूप से कार्य कर सकता है, रुक सकता है (कंप्यूटिंग) या क्रैश (कंप्यूटिंग)) यदि एक भी प्रक्रिया गलत तरीके से कार्य करती है। यह भी सम्मिलित है:

  • किसी संसाधन का अनुरोध करना और उसे प्रचलित करना भूल जाना;
  • ऐसे संसाधन को प्रचलित करना जिसका कभी अनुरोध नहीं किया गया था;
  • किसी संसाधन को लंबे समय तक बिना आवश्यकता के रखना;
  • पहले अनुरोध किए बिना (या इसे प्रचलित करने के बाद) संसाधन का उपयोग करना।

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

शब्दार्थ और कार्यान्वयन

काउंटिंग सेमाफोर दो संक्रियाओं से सुसज्जित हैं, जिन्हें ऐतिहासिक रूप से पी और वी के रूप में दर्शाया गया है (देखें § ऑपरेशन के नाम वैकल्पिक नामों के लिए)। ऑपरेशन वी सेमाफोर एस को बढ़ाता है, और ऑपरेशन पी इसे घटाता है।

सेमाफोर एस का मान वर्तमान में उपलब्ध संसाधनों की इकाइयों की संख्या है। पी ऑपरेशन वेटिंग या नींद (सिस्टम कॉल) में व्यस्त है जब तक कि सेमाफोर द्वारा संरक्षित संसाधन उपलब्ध नहीं हो जाता है, जिस समय संसाधन का तुरंत दावा किया जाता है। वी ऑपरेशन उलटा है: यह एक संसाधन को फिर से उपलब्ध कराता है जब प्रक्रिया का उपयोग समाप्त हो जाता है।

सेमाफोर एस की एक महत्वपूर्ण संपत्ति यह है कि इसके मूल्य को वी और पी संचालनों का उपयोग करने के अलावा बदला नहीं जा सकता है।

समझने का एक सरल तरीका प्रतीक्षा (पी) और संकेत (वी) संचालन है:

  •  प्रतीक्षा: सेमाफोर चर के मान को 1 से घटाता है। यदि सेमाफोर चर का नया मान ऋणात्मक है, तो प्रक्रिया निष्पादित होती है   प्रतीक्षा अवरुद्ध है (यानी, सेमाफोर की पंक्ति में जोड़ा गया)। अन्यथा, संसाधन की एक इकाई का उपयोग करके प्रक्रिया निष्पादन प्रचलित रखती है।
  • संकेत: सेमाफोर चर के मान को 1 से बढ़ाता है। वृद्धि के बाद, यदि पूर्व-वृद्धि मान ऋणात्मक था (मतलब संसाधन के लिए प्रतीक्षारत प्रक्रियाएं हैं), तो यह एक अवरुद्ध प्रक्रिया को सेमाफोर की प्रतीक्षा पंक्ति से तैयार पंक्ति में स्थानांतरित करता है।

कई ऑपरेटिंग सिस्टम कुशल सेमाफोर प्रिमिटिव प्रदान करते हैं जो सेमाफोर के बढ़ने पर प्रतीक्षा प्रक्रिया को अनब्लॉक करते हैं। इसका मतलब यह है कि प्रक्रिया अनावश्यक रूप से सेमाफोर मूल्य की जाँच करने में समय बर्बाद नहीं करती है।

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

function V(semaphore S, integer I):
    [S ← S + I]

function P(semaphore S, integer I):
    repeat:
        [if S ≥ I:
        S ← S − I
        break]

हालांकि, इस खंड का शेष भाग यूनरी वी और पी संचालन के साथ सेमाफोर को संदर्भित करता है, जब तक कि अन्यथा निर्दिष्ट न हो।

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

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

उदाहरण

तुच्छ उदाहरण

एक वेरिएबल ए और एक बूलियन वेरिएबल एस पर विचार करें। ए को तभी एक्सेस किया जाता है जब एस को ट्रू मार्क किया जाता है। इस प्रकार, एस, ए के लिए एक सेमाफोर है।

एक ट्रेन स्टेशन (ए) से ठीक पहले एक स्टॉपलाइट संकेत (एस) की कल्पना कर सकता है। ऐसे में अगर संकेत हरा है, तो कोई ट्रेन स्टेशन में प्रवेश कर सकता है। यदि यह पीला या लाल (या कोई अन्य रंग) है, तो ट्रेन स्टेशन तक नहीं पहुँचा जा सकता है।

लॉगिन पंक्ति

एक ऐसी प्रणाली पर विचार करें जो केवल दस उपयोगकर्ताओं (एस = 10) का समर्थन कर सकती है। जब भी कोई उपयोगकर्ता लॉग इन करता है, पी को कॉल किया जाता है, सेमाफोर एस को 1 से कम कर दिया जाता है। जब भी कोई उपयोगकर्ता लॉग आउट करता है, वी को कॉल किया जाता है, उपलब्ध हो चुके लॉगिन स्लॉट का प्रतिनिधित्व करते हुए एस को 1 से बढ़ा दिया जाता है। जब एस 0 होता है, तो लॉग इन करने के इच्छुक किसी भी उपयोगकर्ता को एस बढ़ने तक प्रतीक्षा करनी चाहिए; एक स्लॉट मुक्त होने तक लॉगिन अनुरोध एक फीफो पंक्ति पर लगाया जाता है। आपसी बहिष्कार का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि अनुरोधों को क्रम में रखा गया है। जब भी एस बढ़ता है (लॉगिन स्लॉट उपलब्ध है), एक लॉगिन अनुरोध को हटा दिया जाता है, और अनुरोध करने वाले उपयोगकर्ता को लॉग इन करने की अनुमति दी जाती है। यदि एस पहले से ही 0 से अधिक है, तो लॉगिन अनुरोध तुरंत हटा दिए जाते हैं।

निर्माता-उपभोक्ता समस्या

निर्माता-उपभोक्ता समस्या में, एक प्रक्रिया (निर्माता) डेटा आइटम उत्पन्न करती है और दूसरी प्रक्रिया (उपभोक्ता) उन्हें प्राप्त करती है और उनका उपयोग करती है। वे अधिकतम आकार एन की पंक्ति का उपयोग करके संचार करते हैं और निम्नलिखित उपबंध के अधीन हैं:

  • पंक्ति खाली होने पर उपभोक्ता को निर्माता के लिए कुछ उत्पादन करने की प्रतीक्षा करनी चाहिए;
  • पंक्ति पूरी होने पर निर्माता को उपभोक्ता द्वारा कुछ उपभोग करने की प्रतीक्षा करनी चाहिए।

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

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

निर्माता निम्नलिखित बार-बार करता है:

उत्पाद:
    पी (खाली गिनती)
    पी (उपयोग पंक्ति)
   आइटम को कतार में रखें(आइटम)
    वी (उपयोग पंक्ति)
    वी (पूर्ण गणना)

उपभोक्ता निम्नलिखित बार-बार करता है

उपभोग करना:
    पी (पूर्ण गणना)
    पी (उपयोग पंक्ति)
    आइटम ← कतार से आइटम प्राप्त करें ()
    वी (उपयोग पंक्ति)
    वी (खाली गिनती)

नीचे एक वास्तविक उदाहरण है:

  1. एक एकल उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश करता है। तब से पूर्ण गणना 0 है, उपभोक्ता ब्लॉक।
  2. कई निर्माता निर्माता के महत्वपूर्ण खंड में प्रवेश करते हैं। एन उत्पादकों से अधिक कोई भी उनके महत्वपूर्ण खंड में प्रवेश नहीं कर सकता है खाली गिनती उनके प्रवेश पर रोक।
  3. निर्माता, एक समय में, पंक्ति तक पहुंच प्राप्त करते हैं uएसeQueue और पंक्ति में आइटम जमा करें।
  4. एक बार जब पहला निर्माता अपने महत्वपूर्ण खंड से बाहर निकल जाता है, पूर्ण गणना वृद्धि हुई है, जिससे एक उपभोक्ता अपने महत्वपूर्ण खंड में प्रवेश कर सकता है।

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

ऑपरेशन के नाम

विहित नाम वी और पी डच भाषा के शब्दों के पहले अक्षर से आते हैं। वी को प्रायः वेरोजेन (वृद्धि) के रूप में समझाया जाता है। पी के लिए कई स्पष्टीकरण प्रस्तुत किए गए हैं, जिनमें प्रोब्रेन (परीक्षण या प्रयास करना) सम्मिलित है,[4] पास (पास), और हड़पना (हड़पना)। इस विषय पर दिज्क्स्ट्रा का सबसे पहला पेपर[2]पी के अर्थ के रूप में पासिंग (पासिंग) देता है, और वी के अर्थ के रूप में व्रजगवे (रिलीज) देता है। इसमें यह भी उल्लेख किया गया है कि शब्दावली रेलवे संकेत में उपयोग की जाने वाली शब्दावली से ली गई है। दिज्क्स्ट्रा ने बाद में लिखा कि उनका इरादा पी को प्रोलाग के लिए खड़ा करना था,[5] प्रोबेरर ते वर्लगेन के लिए संक्षिप्त, शाब्दिक रूप से कम करने का प्रयास करें, या दूसरे मामले में उपयोग की जाने वाली शर्तों को समानांतर करने के लिए, कम करने का प्रयास करें।[6][7][8]

एलजीओएल 68 में, लिनक्स कर्नेल,[9] और कुछ अंग्रेजी पाठ्यपुस्तकों में, वी और पी संक्रियाओं को क्रमशः ऊपर और नीचे कहा जाता है। सॉफ्टवेयर इंजीनियरिंग अभ्यास में, उन्हें अक्सर संकेत और प्रतीक्षा कहा जाता है,[10] प्रचलित करना और प्राप्त करना[10] (जो कि मानक जावा (प्रोग्रामिंग भाषा) लाइब्रेरी है[11] का उपयोग करता है), या पोस्ट और भुगतान किया। कुछ पाठ[12][13] उन्हें खाली करने के लिए कहें और मूल डच इनिशियल्स से मिलान करने के लिए खरीद लें।

सेमाफोरस बनाम म्यूटेक्स

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

  1. प्राथमिकता व्युत्क्रम: यदि म्यूटेक्स को पता है कि किसने इसे लॉक किया है और इसे अनलॉक करना है, तो उस कार्य की प्राथमिकता को बढ़ावा देना संभव है जब भी कोई उच्च-प्राथमिकता वाला कार्य म्यूटेक्स पर प्रतीक्षा करना प्रारम्भ करता है।
  2. समय से पहले कार्य समाप्ति: म्यूटेक्स विलोपन सुरक्षा भी प्रदान कर सकता है, जहां म्यूटेक्स को रखने वाले कार्य को गलती से हटाया नहीं जा सकता है।[citation needed]
  3. समाप्ति गतिरोध: यदि किसी कारण से म्यूटेक्स-होल्डिंग कार्य समाप्त हो जाता है, तो रीयल-टाइम ऑपरेटिंग सिस्टम इस स्थिति के म्यूटेक्स और संकेत प्रतीक्षा कार्यों को प्रचलित कर सकता है।
  4. पुनरावर्तन गतिरोध: एक कार्य को एक पुनर्वित्त म्यूटेक्स को कई बार लॉक करने की अनुमति दी जाती है क्योंकि यह इसे समान संख्या में अनलॉक करता है।
  5. एक्सीडेंटल रिलीज़: म्यूटेक्स के रिलीज़ होने पर एक त्रुटि उत्पन्न होती है यदि रिलीज़ करने वाला कार्य उसका स्वामी नहीं है।

यह भी देखें

संदर्भ

  1. Dijkstra, Edsger W. Over seinpalen (EWD-74) (PDF). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin. (transcription)
  2. 2.0 2.1 Dijkstra, Edsger W. Over de sequentialiteit van procesbeschrijvingen (EWD-35) (PDF). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin. (transcription) (undated, 1962 or 1963)
  3. The Little Book of Semaphores Allen B. Downey
  4. Silberschatz, Galvin & Gagne 2008, p. 234
  5. Dijkstra, Edsger W. EWD-74 (PDF). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin. (transcription)
  6. Dijkstra, Edsger W. MULTIPROGAMMERING EN DE X8 (EWD-51) (PDF). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin. (transcription) (in Dutch)
  7. Dijkstra's own translation reads "try-and-decrease", although that phrase might be confusing for those unaware of the colloquial "try-and..."
  8. (PATCH 1/19) MUTEX: Introduce simple mutex implementation Linux Kernel Mailing List, 19 December 2005
  9. Linux Kernel hacking HOWTO Archived 2010-05-28 at the Wayback Machine LinuxGrill.com
  10. 10.0 10.1 Mullender, Sape; Cox, Russ (2008). Semaphores in Plan 9 (PDF). 3rd International Workshop on Plan 9.
  11. java.util.concurrent.Semaphore
  12. "exec.library/Procure". amigadev.elowar.com. Retrieved 2016-09-19.
  13. "exec.library/Vacate". amigadev.elowar.com. Retrieved 2016-09-19.


बाहरी संबंध

परिचय

संदर्भ