पाठक-लेखक समस्या: Difference between revisions

From Vigyanwiki
(Created page with "{{Multiple issues| {{more footnotes|date=April 2015}} {{Technical|date=November 2016}} }} कंप्यूटर विज्ञान में, पाठकों-ल...")
 
No edit summary
 
(6 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Multiple issues|
[[कंप्यूटर विज्ञान]] में, '''पाठक-लेखक समस्याएँ'''समवर्ती में सामान्य कंप्यूटिंग समस्या के उदाहरण हैं।<ref>{{citation|title=Operating Systems - Design and Implementation, 3rd edition [Chapter: 2.3.2 The Readers and Writers Problem]|
{{more footnotes|date=April 2015}}
publisher=Pearson Education, Inc.|date=2006|first1=Andrew S.|last1=Tanenbaum}}</ref> समस्याओं की कम से कम तीन भिन्नताएँ हैं, जो उन स्थितियों से निपटती हैं जिनमें निष्पादन के कई [[समवर्ती (कंप्यूटर विज्ञान)|संगामी]] थ्रेड एक समय में समान साझा संसाधन तक ऐक्सेस करते हैं।
{{Technical|date=November 2016}}
}}


[[कंप्यूटर विज्ञान]] में, पाठकों-लेखकों की समस्याएं [[समवर्ती (कंप्यूटर विज्ञान)]] में एक सामान्य कंप्यूटिंग समस्या का उदाहरण हैं।<ref>{{citation|title=Operating Systems - Design and Implementation, 3rd edition [Chapter: 2.3.2 The Readers and Writers Problem]|
कुछ थ्रेड पढ़ सकते हैं और कुछ लिख सकते हैं, इस अवरोध के साथ कि कोई भी थ्रेड पढ़ने या लिखने के लिए साझा संसाधन तक नहीं ऐक्सेस कर सकता है, जबकि अन्य थ्रेड इसे लिखने के कार्य में हैं। (विशेष रूप से, हम एक से अधिक थ्रेड को एक साथ साझा संसाधन को संशोधित करने से रोकना चाहते हैं और दो या दो से अधिक पाठकों को एक ही समय में साझा संसाधन तक ऐक्सेस की अनुमति देना चाहते हैं)। पाठक-लेखक लॉक एक [[डेटा संरचना]] है जो पाठकों-लेखकों की एक या अधिक समस्याओं को हल करती है।
publisher=Pearson Education, Inc.|date=2006|first1=Andrew S.|last1=Tanenbaum}}</ref> समस्याओं की कम से कम तीन विविधताएँ हैं, जो उन स्थितियों से निपटती हैं जिनमें निष्पादन के कई समवर्ती सूत्र (कंप्यूटर विज्ञान) एक ही समय में समान साझा संसाधन तक पहुँचने का प्रयास करते हैं।


कुछ धागे पढ़ सकते हैं और कुछ लिख सकते हैं, इस बाधा के साथ कि कोई धागा पढ़ने या लिखने के लिए साझा संसाधन तक नहीं पहुंच सकता है जबकि दूसरा धागा इसे लिखने के कार्य में है। (विशेष रूप से, हम एक से अधिक थ्रेड को एक साथ साझा संसाधन को संशोधित करने से रोकना चाहते हैं और एक ही समय में दो या अधिक पाठकों को साझा संसाधन तक पहुंचने की अनुमति देना चाहते हैं)। एक पाठक-लेखक लॉक एक [[डेटा संरचना]] है जो पाठकों-लेखकों की एक या अधिक समस्याओं को हल करती है।
मूल पाठक-लेखक समस्या को सबसे पहले कोर्टोइस एट अल द्वारा सूत्रबद्ध और हल किया गया था।{{r|courtois}}<ref>{{Cite book |title=तुल्यकालन एल्गोरिदम और समवर्ती प्रोग्रामिंग|first=Gadi |last=Taubenfeld |publisher=Pearson Education |year=2006 |page=301}}</ref>
 
== प्रथम पाठक-लेखक समस्या ==
मूल पाठक-लेखक समस्या को सबसे पहले कोर्टोइस एट अल द्वारा तैयार और हल किया गया था।{{r|courtois}}<ref>{{Cite book |title=तुल्यकालन एल्गोरिदम और समवर्ती प्रोग्रामिंग|first=Gadi |last=Taubenfeld |publisher=Pearson Education |year=2006 |page=301}}</ref>
मान लीजिए कि हमारे पास एक साझा मेमोरी क्षेत्र (महत्वपूर्ण खंड) है जिसमें ऊपर वर्णित मूलभूत अवरोध हैं। आपसी अपवर्जन [[ म्युटेक्स |म्यूटेक्स]] के पीछे साझा किए गए डेटा की रक्षा करना संभव है, जिस स्थिति में कोई भी दो थ्रेड्स एक ही समय में डेटा को ऐक्सेस नहीं कर सकते हैं। हालाँकि, यह समाधान उप-इष्टतम है, क्योंकि यह संभव है कि रीडर ''R<sub>1</sub>'' के पास लॉक हो, और फिर दूसरा रीडर ''R<sub>2</sub>'' एक्सेस का अनुरोध करता है। ''R<sub>2</sub>'' के लिए अपना रीड ऑपरेशन प्रारम्भ करने से पहले ''R<sub>1</sub>'' के पूरा होने तक प्रतीक्षा करना मूर्खता होगी इसके स्थान पर, ''R<sub>2</sub>'' को ''R<sub>1</sub>'' के साथ-साथ स्रोत पढ़ने की अनुमति दी जानी चाहिए क्योंकि रीड्स डेटा को संशोधित नहीं करते हैं, इसलिए समवर्ती रीड्स सुरक्षित हैं। यह प्रथम पाठक-लेखक समस्या के लिए प्रेरणा है, जिसमें यह अवरोध जोड़ा जाता है कि यदि शेयर वर्तमान में पढ़ने के लिए खोला जाता है तो किसी पाठक को प्रतीक्षा नहीं करनी पड़ेगी। इसके समाधान के साथ इसे पाठक-प्राथमिकता भी कहा जाता है-
 
   resource.P() is equivalent to wait(resource)
 
   resource.V() is equivalent to signal(resource)
== पहले पाठक-लेखक समस्या ==
   rmutex.P() is equivalent to wait(rmutex)
मान लीजिए कि हमारे पास एक साझा मेमोरी क्षेत्र (महत्वपूर्ण खंड) है जिसमें ऊपर वर्णित बुनियादी बाधाएं हैं। आपसी बहिष्करण [[ म्युटेक्स ]] के पीछे साझा किए गए डेटा की रक्षा करना संभव है, जिस स्थिति में कोई भी दो धागे एक ही समय में डेटा तक नहीं पहुंच सकते हैं। हालाँकि, यह समाधान उप-इष्टतम है, क्योंकि यह संभव है कि एक पाठक R<sub>1</sub>लॉक हो सकता है, और फिर एक अन्य पाठक आर<sub>2</sub>पहुँच का अनुरोध करता है। आर के लिए यह मूर्खता होगी<sub>2</sub>आर तक प्रतीक्षा करने के लिए<sub>1</sub>अपना रीड ऑपरेशन शुरू करने से पहले किया गया था; इसके बजाय, आर<sub>2</sub>आर के साथ संसाधन पढ़ने की अनुमति दी जानी चाहिए<sub>1</sub>क्योंकि रीड्स डेटा को संशोधित नहीं करते हैं, इसलिए समवर्ती रीड्स सुरक्षित हैं। यह 'पहले पाठक-लेखक समस्या' की प्रेरणा है, जिसमें यह बाधा जोड़ी जाती है कि यदि शेयर वर्तमान में पढ़ने के लिए खोला जाता है तो कोई पाठक प्रतीक्षा नहीं करेगा। इसे 'पाठक-वरीयता' भी कहा जाता है, इसके समाधान के साथ:
   rmutex.V() is equivalent to signal(rmutex)
<सिंटैक्सहाइलाइट लैंग = सी लाइन = 1>
सेमाफोर संसाधन = 1;
सेमाफोर आरम्यूटेक्स = 1;
रीडकाउंट = 0;
 
/*
   संसाधन। पी () प्रतीक्षा (संसाधन) के बराबर है
   संसाधन। वी () सिग्नल (संसाधन) के बराबर है
   rmutex.P () प्रतीक्षा के बराबर है (rmutex)
   rmutex.V () सिग्नल के बराबर है (rmutex)
*/
*/


लेखक () {
writer() {
     संसाधन पी (); // एक लेखक के लिए साझा की गई फ़ाइल को लॉक करें
     resource.P();         //Lock the shared file for a writer


     <गंभीर खंड>
     <CRITICAL Section>
     // लिखा गया है
     // Writing is done


     <निकास अनुभाग>
     <EXIT Section>
     संसाधन वी (); // अन्य पाठकों द्वारा उपयोग के लिए साझा की गई फ़ाइल को रिलीज़ करें। यदि कोई पाठक अनुरोध नहीं कर रहा है तो लेखकों को अनुमति दी जाती है।
     resource.V();         //Release the shared file for use by other readers. Writers are allowed if there are no readers requesting it.
}
}


पाठक () {
reader() {
     rmutex.P (); //सुनिश्चित करें कि जब आप इसमें हैं तो कोई अन्य पाठक <प्रविष्टि> अनुभाग को निष्पादित नहीं कर सकता है
     rmutex.P();           //Ensure that no other reader can execute the <Entry> section while you are in it
     <गंभीर खंड>
     <CRITICAL Section>
     रीडकाउंट ++; // इंगित करें कि आप एक पाठक हैं जो [[ महत्वपूर्ण अनुभाग ]] में प्रवेश करने का प्रयास कर रहे हैं
     readcount++;         //Indicate that you are a reader trying to enter the Critical Section
     if (readcount == 1) // चेक करता है कि क्या आप CS में प्रवेश करने का प्रयास करने वाले पहले पाठक हैं
     if (readcount == 1)   //Checks if you are the first reader trying to enter CS
         संसाधन पी (); // यदि आप पहले पाठक हैं, तो लेखकों के संसाधन को लॉक कर दें। संसाधन बाद के पाठकों के लिए आरक्षित रहता है
         resource.P();    //If you are the first reader, lock the resource from writers. Resource stays reserved for subsequent readers
    <एग्जिट क्रिटिकल सेक्शन>
     <EXIT CRITICAL Section>
    rmutex.V (); //मुक्त करना
     rmutex.V();           //Release
 
    // पढ़ना करो
 
    rmutex.P (); //सुनिश्चित करें कि जब आप इसमें हैं तो कोई अन्य पाठक <बाहर निकलें> अनुभाग को निष्पादित नहीं कर सकता है
    <गंभीर खंड>
    रीडकाउंट--; // इंगित करें कि अब आपको साझा संसाधन की आवश्यकता नहीं है। एक कम पाठक
     अगर (रीडकाउंट == 0) // चेक करता है कि क्या आप अंतिम (केवल) पाठक हैं जो साझा फ़ाइल पढ़ रहे हैं
        संसाधन वी (); // यदि आप अंतिम पाठक हैं, तो आप संसाधन को अनलॉक कर सकते हैं। यह इसे लेखकों के लिए उपलब्ध कराता है।
     <एग्जिट क्रिटिकल सेक्शन>
     rmutex.V (); //मुक्त करना
}
</वाक्यविन्यास हाइलाइट>


पाठकों/लेखकों की समस्या के इस समाधान में, यदि उपलब्ध हो तो पहले पाठक को संसाधन (साझा फ़ाइल) को लॉक करना होगा। एक बार जब फ़ाइल लेखकों से लॉक हो जाती है, तो इसे बाद के कई पाठकों द्वारा इसे फिर से लॉक किए बिना उपयोग किया जा सकता है।
    // Do the Reading


क्रिटिकल सेक्शन में प्रवेश करने से पहले, प्रत्येक नए पाठक को एंट्री सेक्शन से गुजरना चाहिए। हालाँकि, एक समय में प्रवेश अनुभाग में केवल एक ही पाठक हो सकता है। यह पाठकों पर [[दौड़ की स्थिति]] से बचने के लिए किया जाता है (इस संदर्भ में, एक दौड़ की स्थिति एक ऐसी स्थिति है जिसमें दो या दो से अधिक धागे एक साथ जाग रहे हैं और महत्वपूर्ण खंड में प्रवेश करने की कोशिश कर रहे हैं; आगे की बाधा के बिना, व्यवहार गैर-नियतात्मक है। उदाहरण के लिए दो पाठक एक ही समय में रीडकाउंट बढ़ाते हैं, और दोनों संसाधन को लॉक करने का प्रयास करते हैं, जिससे एक पाठक ब्लॉक हो जाता है)। इसे पूरा करने के लिए, प्रत्येक पाठक जो <प्रविष्टी अनुभाग> में प्रवेश करता है, वह अपने लिए <प्रविष्टि अनुभाग> को तब तक लॉक कर देगा जब तक कि वे इसे पूरा नहीं कर लेते। इस बिंदु पर पाठक संसाधन को लॉक नहीं कर रहे हैं। वे केवल एंट्री सेक्शन को लॉक कर रहे हैं ताकि कोई अन्य पाठक इसमें प्रवेश न कर सके। एक बार जब पाठक प्रवेश अनुभाग को क्रियान्वित कर लेता है, तो वह म्यूटेक्स को संकेत देकर इसे अनलॉक कर देगा। इसे सिगनल देना इसके बराबर है: उपरोक्त कोड में म्यूटेक्स.वी ()। वही <निकास अनुभाग> के लिए मान्य है। एक समय में एक्ज़िट सेक्शन में एक से अधिक पाठक नहीं हो सकते हैं, इसलिए, प्रत्येक पाठक को इसका उपयोग करने से पहले अपने लिए एक्ज़िट सेक्शन का दावा और लॉक करना होगा।
    rmutex.P();           //Ensure that no other reader can execute the <Exit> section while you are in it
    <CRITICAL Section>
    readcount--;          //Indicate that you no longer need the shared resource. One fewer reader
    if (readcount == 0)  //Checks if you are the last (only) reader who is reading the shared file
        resource.V();    //If you are last reader, then you can unlock the resource. This makes it available to writers.
    <EXIT CRITICAL Section>
    rmutex.V();          //Release
पाठकों/लेखकों की समस्या के इस समाधान में, यदि उपलब्ध हो तो पहले पाठक को स्रोत (साझा फ़ाइल) को लॉक करना होगा। एक बार जब फ़ाइल लेखकों से लॉक हो जाती है, तो इसे बाद के कई पाठकों द्वारा इसे फिर से लॉक किए बिना उपयोग किया जा सकता है।


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


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


==दूसरा पाठक–लेखक समस्या==
इस समाधान में, प्रत्येक लेखक को व्यक्तिगत रूप से स्रोत का दावा करना होगा। इसका अर्थ यह है कि पाठकों का वर्ग बाद में सभी संभावित लेखकों को बाहर कर सकता है और उन्हें वंचित रख सकता है। ऐसा इसलिए है, क्योंकि प्रथम पाठक द्वारा स्रोत को लॉक करने के बाद, कोई भी लेखक इसे रिलीज़ होने से पहले लॉक नहीं कर सकता है। और यह केवल अंतिम पाठक द्वारा रिलीज़ किया जाएगा। इसलिए, यह समाधान निष्पक्षता को संतुष्ट नहीं करता है।
पहला समाधान उप इष्टतम है, क्योंकि यह संभव है कि एक पाठक आर<sub>1</sub>लॉक हो सकता है, एक लेखक डब्ल्यू लॉक की प्रतीक्षा कर रहा होगा, और फिर एक पाठक आर<sub>2</sub>पहुँच का अनुरोध करता है। आर के लिए यह अनुचित होगा<sub>2</sub>डब्ल्यू के आगे, तुरंत कूदने के लिए; यदि ऐसा अक्सर होता है, तो डब्ल्यू भुखमरी का संसाधन करेगा। इसके बजाय, डब्ल्यू को जल्द से जल्द शुरू करना चाहिए। यह 'दूसरी पाठक-लेखक समस्या' के लिए प्रेरणा है, जिसमें यह बाधा जोड़ी जाती है कि कोई भी लेखक, एक बार कतार में जुड़ जाने के बाद, बिल्कुल आवश्यक से अधिक समय तक प्रतीक्षा नहीं करेगा। इसे 'लेखक-वरीयता' भी कहते हैं।


लेखकों-वरीयता परिदृश्य का समाधान है:<ref name="courtois">{{cite journal |journal=Communications of the ACM |title="पाठकों" और "लेखकों" के साथ समवर्ती नियंत्रण|first1=P. J. |last1=Courtois |first2=F. |last2=Heymans |first3=D. L. |last3=Parnas |year=1971 |volume=14 |issue=10 |pages=667–668 |doi=10.1145/362759.362813 |s2cid=7540747 |url=http://cs.nyu.edu/~lerner/spring10/MCP-S10-Read04-ReadersWriters.pdf}}</ref>
==द्वितीय पाठक-लेखक समस्या==
<सिंटैक्सहाइलाइट लैंग = सी लाइन = 1>
प्रथम समाधान उप इष्टतम है, क्योंकि यह संभव है कि पाठक ''R<sub>1</sub>'' में लॉक हो, लेखक ''W'' लॉक के लिए प्रतीक्षा कर रहा हो, और फिर पाठक ''R<sub>2</sub>'' ऐक्सेस का अनुरोध करता है। ''R<sub>2</sub>'' के लिए तुरंत ''W'' से आगे अकस्मात वृद्धि अनुचित होगी यदि ऐसा प्रायः होता, तो ''W'' वंचित रह जाता। इसके स्थान पर, ''W'' को जल्द से जल्द प्रारम्भ करना चाहिए। यह द्वितीय पाठक-लेखक समस्या के लिए प्रेरणा है, जिसमें यह अवरोध जोड़ा जाता है कि कोई भी लेखक, एक बार कतार में जुड़ जाने के बाद, पूरी तरह से आवश्यकता से अधिक समय तक प्रतीक्षा नहीं करेगा। इसे लेखक-प्राथमिकता भी कहते हैं।
इंट रीडकाउंट, राइटकाउंट; //(प्रारंभिक मान = 0)
सेमाफोर rmutex, wmutex, readTry, संसाधन; //(प्रारंभिक मान = 1)


// पाठक
लेखक-प्राथमिकता परिदृश्य का समाधान है-<ref name="courtois">{{cite journal |journal=Communications of the ACM |title="पाठकों" और "लेखकों" के साथ समवर्ती नियंत्रण|first1=P. J. |last1=Courtois |first2=F. |last2=Heymans |first3=D. L. |last3=Parnas |year=1971 |volume=14 |issue=10 |pages=667–668 |doi=10.1145/362759.362813 |s2cid=7540747 |url=http://cs.nyu.edu/~lerner/spring10/MCP-S10-Read04-ReadersWriters.pdf}}</ref>
पाठक () {
   readTry.P();                 //Indicate a reader is trying to enter
<प्रविष्टि अनुभाग>
   rmutex.P();                 //lock entry section to avoid race condition with other readers
   रीडट्री। पी (); // इंगित करें कि एक पाठक प्रवेश करने का प्रयास कर रहा है
   readcount++;                 //report yourself as a reader
   rmutex.P (); // अन्य पाठकों के साथ दौड़ की स्थिति से बचने के लिए प्रवेश अनुभाग को लॉक करें
   if (readcount == 1)         //checks if you are first reader
   रीडकाउंट ++; // एक पाठक के रूप में खुद को रिपोर्ट करें
     resource.P();             //if you are first reader, lock  the resource
   if (readcount == 1) // चेक करता है कि क्या आप पहले पाठक हैं
   rmutex.V();                 //release entry section for other readers
     संसाधन पी (); // यदि आप पहले पाठक हैं, तो संसाधन को लॉक कर दें
   readTry.V();                 //indicate you are done trying to access the resource
   rmutex.V (); // अन्य पाठकों के लिए प्रवेश अनुभाग जारी करें
   readTry.V (); // इंगित करें कि आप संसाधन तक पहुँचने का प्रयास कर रहे हैं


<गंभीर खंड>
<CRITICAL Section>
// पठन किया जाता है
//reading is performed


<निकास अनुभाग>
<EXIT Section>
   rmutex.P (); // रिजर्व एग्जिट सेक्शन - पाठकों के साथ दौड़ की स्थिति से बचा जाता है
   rmutex.P();                 //reserve exit section - avoids race condition with readers
   रीडकाउंट--; // इंगित करें कि आप जा रहे हैं
   readcount--;                 //indicate you're leaving
   अगर (रीडकाउंट == 0) // चेक करता है कि क्या आप अंतिम पाठक जा रहे हैं
   if (readcount == 0)         //checks if you are last reader leaving
     संसाधन वी (); // यदि अंतिम हो, तो आपको लॉक किए गए संसाधन को रिलीज़ करना होगा
     resource.V();             //if last, you must release the locked resource
   rmutex.V (); // अन्य पाठकों के लिए निकास खंड जारी करें
   rmutex.V();                 //release exit section for other readers
}
}


// लेखक
//WRITER
लेखक () {
writer() {
<प्रविष्टि अनुभाग>
<ENTRY Section>
   wmutex.पी (); // लेखकों के लिए आरक्षित प्रविष्टि अनुभाग - दौड़ की स्थिति से बचा जाता है
   wmutex.P();                 //reserve entry section for writers - avoids race conditions
   राइटकाउंट ++; // प्रवेश करने वाले लेखक के रूप में खुद को रिपोर्ट करें
   writecount++;               //report yourself as a writer entering
   अगर (राइटकाउंट == 1) // चेक करता है कि क्या आप पहले लेखक हैं
   if (writecount == 1)         //checks if you're first writer
     रीडट्री। पी (); // यदि आप पहले हैं, तो आपको पाठकों को लॉक करना होगा। उन्हें सीएस में प्रवेश करने की कोशिश करने से रोकें
     readTry.P();               //if you're first, then you must lock the readers out. Prevent them from trying to enter CS
   wmutex.V (); // रिलीज़ एंट्री सेक्शन
   wmutex.V();                 //release entry section
   संसाधन पी (); // अपने लिए संसाधन आरक्षित करें - अन्य लेखकों को साझा संसाधन को एक साथ संपादित करने से रोकता है
   resource.P();               //reserve the resource for yourself - prevents other writers from simultaneously editing the shared resource
<गंभीर खंड>
<CRITICAL Section>
   // लेखन किया जाता है
   //writing is performed
   संसाधन वी (); // रिलीज फ़ाइल
   resource.V();               //release file


<निकास अनुभाग>
<EXIT Section>
   wmutex.पी (); // रिजर्व एग्जिट सेक्शन
   wmutex.P();                 //reserve exit section
   राइटकाउंट--; // इंगित करें कि आप जा रहे हैं
   writecount--;               //indicate you're leaving
   अगर (राइटकाउंट == 0) // चेक करता है कि क्या आप आखिरी लेखक हैं
   if (writecount == 0)         //checks if you're the last writer
     readTry.V (); // यदि आप अंतिम लेखक हैं, तो आपको पाठकों को अनलॉक करना होगा। उन्हें पढ़ने के लिए सीएस में प्रवेश करने की कोशिश करने की अनुमति देता है
     readTry.V();               //if you're last writer, you must unlock the readers. Allows them to try enter CS for reading
   wmutex.V (); // रिलीज़ एग्जिट सेक्शन
   wmutex.V();                 //release exit section
}
इस समाधान में लेखकों को प्राथमिकता दी जाती है। यह प्रत्येक पाठक को अलग-अलग रीडट्री संकेत पद्धति को लॉक और रिलीज करने के लिए विवश करके पूरा किया जाता है। दूसरी ओर लेखकों को इसे व्यक्तिगत रूप से लॉक करने की आवश्यकता नहीं है। केवल प्रथम लेखक रीडट्री को लॉक करेगा और उसके बाद के सभी लेखक स्रोत का उपयोग कर सकते हैं क्योंकि यह पिछले लेखक द्वारा मुक्त हो जाता है। अंतिम लेखक को रीडट्री संकेत पद्धति जारी करना चाहिए, इस प्रकार पाठकों के लिए पढ़ने का प्रयास करने के लिए द्वार खुल जाता है।
</वाक्यविन्यास हाइलाइट>


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


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


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


Rmutex और wmutex का उपयोग ठीक उसी तरह किया जाता है जैसे पहले समाधान में किया गया था। उनका एकमात्र उद्देश्य पाठकों और लेखकों पर दौड़ की स्थिति से बचना है, जबकि वे अपने प्रवेश या निकास अनुभागों में हैं।
Rmutex और wmutex का उपयोग ठीक उसी तरह किया जाता है जैसे पहले समाधान में किया गया था। उनका एकमात्र उद्देश्य पाठकों और लेखकों पर दौड़ की स्थिति से बचना है, जबकि वे अपने प्रवेश या निकास अनुभागों में हैं।


==तीसरा पाठक–लेखक समस्या==
==तृतीय पाठक-लेखक समस्या==
वास्तव में, दोनों समस्या कथनों द्वारा निहित समाधान भुखमरी का कारण बन सकते हैं - पहला कतार में लेखकों को भूखा रख सकता है, और दूसरा पाठकों को भूखा रख सकता है। इसलिए, तीसरी पाठक-लेखक समस्या कभी-कभी प्रस्तावित की जाती है, जो बाधा को जोड़ती है कि 'किसी भी धागे को भूखा नहीं रहने दिया जाएगा'; यानी, साझा किए गए डेटा पर लॉक प्राप्त करने का ऑपरेशन हमेशा सीमित समय में समाप्त हो जाएगा।
वास्तव में, दोनों समस्या कथनों द्वारा निहित समाधान अप्राप्ति का कारण बन सकते हैं - प्रथम कतार में लेखकों को वंचित रख सकता है, और द्वितीय पाठकों को वंचित रख सकता है। इसलिए, तृतीय पाठक-लेखक समस्या कभी-कभी प्रस्तावित की जाती है, जो इस अवरोध को जोड़ती है कि किसी भी थ्रेड को वंचित नहीं रहने दिया जाएगा अर्थात्, साझा किए गए डेटा पर लॉक प्राप्त करने का ऑपरेशन हमेशा एक निश्चित समय में समाप्त हो जाएगा। पाठकों और लेखकों दोनों के लिए निष्पक्षता के साथ समाधान इस प्रकार हो सकता है-
पाठकों और लेखकों दोनों के लिए निष्पक्षता वाला समाधान इस प्रकार हो सकता है:


<सिंटैक्सहाइलाइट लैंग = सी लाइन = 1>
<syntaxhighlight lang="c" line="1">
इंट रीडकाउंट; // init से 0; वर्तमान में संसाधन तक पहुँचने वाले पाठकों की संख्या
int readcount;               // init to 0; number of readers currently accessing resource


// सभी सेमाफोर 1 से शुरू होते हैं
// all semaphores initialised to 1
सेमाफोर संसाधन; // संसाधन तक पहुंच (पढ़ने/लिखने) को नियंत्रित करता है। बाइनरी सेमाफोर।
semaphore resource;           // controls access (read/write) to the resource. Binary semaphore.
सेमाफोर रम्यूटेक्स; // साझा चर रीडकाउंट में परिवर्तनों को समन्वयित करने के लिए
semaphore rmutex;             // for syncing changes to shared variable readcount
सेमाफोर सर्विस क्यू; // निष्पक्षता: अनुरोधों के क्रम को बरकरार रखता है (संकेत फीफो होना चाहिए)
semaphore serviceQueue;       // FAIRNESS: preserves ordering of requests (signaling must be FIFO)


// पाठक
//READER
पाठक () {
reader() {
<प्रविष्टि अनुभाग>
<ENTRY Section>
   सर्विस क्यू। पी (); // सेवित होने के लिए लाइन में प्रतीक्षा करें
   serviceQueue.P();           // wait in line to be serviced
   rmutex.P (); // रीडकाउंट के लिए विशेष पहुंच का अनुरोध करें
   rmutex.P();                 // request exclusive access to readcount
   रीडकाउंट ++; // सक्रिय पाठकों की अद्यतन संख्या
   readcount++;               // update count of active readers
   if (readcount == 1) // अगर मैं पहला पाठक हूं
   if (readcount == 1)         // if I am the first reader
     संसाधन पी (); // पाठकों के लिए संसाधन एक्सेस का अनुरोध करें (लेखक अवरोधित हैं)
     resource.P();             // request resource access for readers (writers blocked)
   सर्विस क्यू। वी (); // अगली पंक्ति में सर्विस होने दें
   serviceQueue.V();           // let next in line be serviced
   rmutex.V (); // रीडकाउंट तक पहुंच जारी करें
   rmutex.V();                 // release access to readcount
      
      
<गंभीर खंड>
<CRITICAL Section>
// पठन किया जाता है
//reading is performed
      
      
<निकास अनुभाग>
<EXIT Section>
   rmutex.P (); // रीडकाउंट के लिए विशेष पहुंच का अनुरोध करें
   rmutex.P();                 // request exclusive access to readcount
   रीडकाउंट--; // सक्रिय पाठकों की अद्यतन संख्या
   readcount--;               // update count of active readers
   if (readcount == 0) // यदि कोई पाठक नहीं बचा है
   if (readcount == 0)         // if there are no readers left
     संसाधन वी (); // सभी के लिए संसाधन एक्सेस जारी करें
     resource.V();             // release resource access for all
   rmutex.V (); // रीडकाउंट तक पहुंच जारी करें
   rmutex.V();                 // release access to readcount
}
}


// लेखक
//WRITER
लेखक () {
writer() {
<प्रविष्टि अनुभाग>
<ENTRY Section>
   सर्विस क्यू। पी (); // सेवित होने के लिए लाइन में प्रतीक्षा करें
   serviceQueue.P();           // wait in line to be serviced
   संसाधन पी (); // संसाधन के लिए विशेष पहुंच का अनुरोध करें
   resource.P();               // request exclusive access to resource
   सर्विस क्यू। वी (); // अगली पंक्ति में सर्विस होने दें
   serviceQueue.V();           // let next in line be serviced
      
      
<गंभीर खंड>
<CRITICAL Section>
// लेखन किया जाता है
// writing is performed
      
      
<निकास अनुभाग>
<EXIT Section>
   संसाधन वी (); // अगले पाठक/लेखक के लिए संसाधन एक्सेस जारी करें
   resource.V();               // release resource access for next reader/writer
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


=== सबसे सरल पाठक लेखक समस्या ===
=== सरलतम पाठक लेखक समस्या ===


सबसे सरल पाठक लेखक समस्या जो केवल दो सेमाफोर का उपयोग करती है और बफर में डेटा पढ़ने के लिए पाठकों की एक सरणी की आवश्यकता नहीं होती है।
सरलतम पाठक लेखक समस्या जो केवल दो संकेत पद्धित का उपयोग करती है और बफर में डेटा पढ़ने के लिए पाठकों की एक सरणी की आवश्यकता नहीं होती है।  


कृपया ध्यान दें कि यह समाधान सामान्य मामले की तुलना में सरल हो जाता है क्योंकि इसे निर्माता-उपभोक्ता समस्या समस्या के समतुल्य बनाया जाता है, और इसलिए केवल {{var|N}} पाठकों को समानांतर में प्रवेश करने की अनुमति है, {{var|N}} बफर का आकार होना।
कृपया ध्यान दें कि यह समाधान सामान्य स्थिति की तुलना में सरल हो जाता है क्योंकि इसे परिबद्ध बफर समस्या के समतुल्य बनाया जाता है, और इसलिए केवल N पाठकों को समानांतर में प्रवेश करने की अनुमति है, N बफर के आकार का है।


==== पाठक ====
==== पाठक ====
Line 211: Line 184:


==== एल्गोरिथम ====
==== एल्गोरिथम ====
# रीड सेमाफोर के कारण पाठक लेखक के पीछे भागेगा।
# रीड संकेत पद्धति के कारण पाठक लेखक के बाद रन करेगा।
# राइटर लिखना बंद कर देगा जब राइट सेमाफोर 0 पर पहुंच जाएगा।
# जब राइट संकेत पद्धति 0 पर पहुंच जाता है तो लेखक लिखना बंद कर देगा।
# जब रीड सेमाफोर 0 पर पहुंच जाएगा तो पाठक पढ़ना बंद कर देगा।
# जब रीड संकेत पद्धति 0 पर पहुंच जाएगा तो पाठक पढ़ना बंद कर देगा।


राइटर में राइट सेमाफोर का मान सेमाफोर को पढ़ने के लिए दिया जाता है और रीडर में लूप के पूरा होने पर लिखने के लिए रीड का मान दिया जाता है।
लेखक में राइट संकेत पद्धति का मान संकेत पद्धति को पढ़ने के लिए दिया जाता है और पाठक में, लूप के पूरा होने पर लिखने के लिए रीड का मान दिया जाता है।


== यह भी देखें ==
== यह भी देखें ==
* [[एबीए समस्या]]
* [[एबीए समस्या|एबीए (ABA) समस्या]]
*[[निर्माता-उपभोक्ता समस्या]]
*[[निर्माता-उपभोक्ता समस्या]]
* [[भोजन दार्शनिकों की समस्या]]
* [[भोजन दार्शनिकों की समस्या|डाइनिंग फिलॉसफर्स समस्या]]
* [[सिगरेट पीने वालों की समस्या]]
* [[सिगरेट पीने वालों की समस्या|सिगरेट स्मोकर्स समस्या]]
* नींद नाई की समस्या
* स्लीपिंग बार्बर समस्या
* पाठक-लेखक ताला
* पाठक-लेखक लॉक
* [[seqlock]]
* [[seqlock]]
* पढ़ें-कॉपी-अपडेट
* रीड-कॉपी-अपडेट


==संदर्भ==
==संदर्भ==
Line 233: Line 206:
*Fair Solution to the Reader-Writer-Problem with Semaphores only. H. Ballhausen, 2003 {{ArXiv|cs/0303005}}
*Fair Solution to the Reader-Writer-Problem with Semaphores only. H. Ballhausen, 2003 {{ArXiv|cs/0303005}}
*Faster Fair Solution for the Reader–Writer Problem. V. Popov, O. Mazonka 2013 {{ArXiv|1309.4507}}
*Faster Fair Solution for the Reader–Writer Problem. V. Popov, O. Mazonka 2013 {{ArXiv|1309.4507}}
==बाहरी संबंध==
==बाहरी संबंध==
* [http://www.rfc1149.net/blog/2011/01/07/the-third-readers-writers-problem/ Algorithmic description of the third readers–writers problem]
* [http://www.rfc1149.net/blog/2011/01/07/the-third-readers-writers-problem/ Algorithmic description of the third readers–writers problem]
{{Use dmy dates|date=February 2021}}
{{Concurrent computing}}
{{Concurrent computing}}


{{DEFAULTSORT:Readers-writers problem}}[[Category: समवर्ती (कंप्यूटर विज्ञान)]]
{{DEFAULTSORT:Readers-writers problem}}
 
 


[[Category: Machine Translated Page]]
[[Category:Articles with invalid date parameter in template|Readers-writers problem]]
[[Category:Created On 26/05/2023]]
[[Category:Collapse templates|Readers-writers problem]]
[[Category:Created On 26/05/2023|Readers-writers problem]]
[[Category:Machine Translated Page|Readers-writers problem]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Readers-writers problem]]
[[Category:Pages with script errors|Readers-writers problem]]
[[Category:Sidebars with styles needing conversion|Readers-writers problem]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Readers-writers problem]]
[[Category:Templates generating microformats|Readers-writers problem]]
[[Category:Templates that are not mobile friendly|Readers-writers problem]]
[[Category:Templates using TemplateData|Readers-writers problem]]
[[Category:Wikipedia metatemplates|Readers-writers problem]]

Latest revision as of 10:29, 29 August 2023

कंप्यूटर विज्ञान में, पाठक-लेखक समस्याएँसमवर्ती में सामान्य कंप्यूटिंग समस्या के उदाहरण हैं।[1] समस्याओं की कम से कम तीन भिन्नताएँ हैं, जो उन स्थितियों से निपटती हैं जिनमें निष्पादन के कई संगामी थ्रेड एक समय में समान साझा संसाधन तक ऐक्सेस करते हैं।

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

मूल पाठक-लेखक समस्या को सबसे पहले कोर्टोइस एट अल द्वारा सूत्रबद्ध और हल किया गया था।[2][3]

प्रथम पाठक-लेखक समस्या

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

  resource.P() is equivalent to wait(resource)
  resource.V() is equivalent to signal(resource)
  rmutex.P() is equivalent to wait(rmutex)
  rmutex.V() is equivalent to signal(rmutex)
  • /

writer() {

   resource.P();          //Lock the shared file for a writer
   <CRITICAL Section>
   // Writing is done
   <EXIT Section>
   resource.V();          //Release the shared file for use by other readers. Writers are allowed if there are no readers requesting it.

}

reader() {

   rmutex.P();           //Ensure that no other reader can execute the <Entry> section while you are in it
   <CRITICAL Section>
   readcount++;          //Indicate that you are a reader trying to enter the Critical Section
   if (readcount == 1)   //Checks if you are the first reader trying to enter CS
       resource.P();     //If you are the first reader, lock the resource from writers. Resource stays reserved for subsequent readers
   <EXIT CRITICAL Section>
   rmutex.V();           //Release
   // Do the Reading
   rmutex.P();           //Ensure that no other reader can execute the <Exit> section while you are in it
   <CRITICAL Section>
   readcount--;          //Indicate that you no longer need the shared resource. One fewer reader
   if (readcount == 0)   //Checks if you are the last (only) reader who is reading the shared file
       resource.V();     //If you are last reader, then you can unlock the resource. This makes it available to writers.
   <EXIT CRITICAL Section>
   rmutex.V();           //Release

पाठकों/लेखकों की समस्या के इस समाधान में, यदि उपलब्ध हो तो पहले पाठक को स्रोत (साझा फ़ाइल) को लॉक करना होगा। एक बार जब फ़ाइल लेखकों से लॉक हो जाती है, तो इसे बाद के कई पाठकों द्वारा इसे फिर से लॉक किए बिना उपयोग किया जा सकता है।

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

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

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

द्वितीय पाठक-लेखक समस्या

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

लेखक-प्राथमिकता परिदृश्य का समाधान है-[2]

 readTry.P();                 //Indicate a reader is trying to enter
 rmutex.P();                  //lock entry section to avoid race condition with other readers
 readcount++;                 //report yourself as a reader
 if (readcount == 1)          //checks if you are first reader
   resource.P();              //if you are first reader, lock  the resource
 rmutex.V();                  //release entry section for other readers
 readTry.V();                 //indicate you are done trying to access the resource

<CRITICAL Section> //reading is performed

<EXIT Section>

 rmutex.P();                  //reserve exit section - avoids race condition with readers
 readcount--;                 //indicate you're leaving
 if (readcount == 0)          //checks if you are last reader leaving
   resource.V();              //if last, you must release the locked resource
 rmutex.V();                  //release exit section for other readers

}

//WRITER writer() { <ENTRY Section>

 wmutex.P();                  //reserve entry section for writers - avoids race conditions
 writecount++;                //report yourself as a writer entering
 if (writecount == 1)         //checks if you're first writer
   readTry.P();               //if you're first, then you must lock the readers out. Prevent them from trying to enter CS
 wmutex.V();                  //release entry section
 resource.P();                //reserve the resource for yourself - prevents other writers from simultaneously editing the shared resource

<CRITICAL Section>

 //writing is performed
 resource.V();                //release file

<EXIT Section>

 wmutex.P();                  //reserve exit section
 writecount--;                //indicate you're leaving
 if (writecount == 0)         //checks if you're the last writer
   readTry.V();               //if you're last writer, you must unlock the readers. Allows them to try enter CS for reading
 wmutex.V();                  //release exit section

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

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

स्रोत संकेत पद्धति को लेखक और पाठक दोनों द्वारा उनके प्रवेश अनुभाग में लॉक किया जा सकता है। वे रीडट्री संकेत पद्धति को प्रथम बार लॉक करने के बाद ही ऐसा करने में सक्षम होते हैं, जो एक समय में उनमें से केवल एक के द्वारा ही किया जा सकता है।

जैसे ही वर्तमान पाठक पढ़ना समाप्त कर लेगा और भविष्य के सभी पाठकों को बाहर कर देगा, तब यह स्रोत पर नियंत्रण कर लेगा। बाद के सभी पाठक रीडट्री संकेत पद्धति पर रुके रहेंगे और लेखकों के स्रोत समाप्त होने और रीड्री जारी करके गेट खोलने की प्रतीक्षा करेंगे।

Rmutex और wmutex का उपयोग ठीक उसी तरह किया जाता है जैसे पहले समाधान में किया गया था। उनका एकमात्र उद्देश्य पाठकों और लेखकों पर दौड़ की स्थिति से बचना है, जबकि वे अपने प्रवेश या निकास अनुभागों में हैं।

तृतीय पाठक-लेखक समस्या

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

int readcount;                // init to 0; number of readers currently accessing resource

// all semaphores initialised to 1
semaphore resource;           // controls access (read/write) to the resource. Binary semaphore.
semaphore rmutex;             // for syncing changes to shared variable readcount
semaphore serviceQueue;       // FAIRNESS: preserves ordering of requests (signaling must be FIFO)

//READER
reader() {
<ENTRY Section>
  serviceQueue.P();           // wait in line to be serviced
  rmutex.P();                 // request exclusive access to readcount
  readcount++;                // update count of active readers
  if (readcount == 1)         // if I am the first reader
    resource.P();             // request resource access for readers (writers blocked)
  serviceQueue.V();           // let next in line be serviced
  rmutex.V();                 // release access to readcount
    
<CRITICAL Section>
//reading is performed
    
<EXIT Section>
  rmutex.P();                 // request exclusive access to readcount
  readcount--;                // update count of active readers
  if (readcount == 0)         // if there are no readers left
    resource.V();             // release resource access for all
  rmutex.V();                 // release access to readcount
}

//WRITER
writer() {
<ENTRY Section>
  serviceQueue.P();           // wait in line to be serviced
  resource.P();               // request exclusive access to resource
  serviceQueue.V();           // let next in line be serviced
    
<CRITICAL Section>
// writing is performed
    
<EXIT Section>
  resource.V();               // release resource access for next reader/writer
}

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

सरलतम पाठक लेखक समस्या

सरलतम पाठक लेखक समस्या जो केवल दो संकेत पद्धित का उपयोग करती है और बफर में डेटा पढ़ने के लिए पाठकों की एक सरणी की आवश्यकता नहीं होती है।

कृपया ध्यान दें कि यह समाधान सामान्य स्थिति की तुलना में सरल हो जाता है क्योंकि इसे परिबद्ध बफर समस्या के समतुल्य बनाया जाता है, और इसलिए केवल N पाठकों को समानांतर में प्रवेश करने की अनुमति है, N बफर के आकार का है।

पाठक

do {
    wait(read)
    ............
    reading data
    ............
    signal(write)
} while (TRUE);


लेखक

do {
    wait(write)
    .............
    writing data
    .............
    signal(read)
} while (TRUE);


एल्गोरिथम

  1. रीड संकेत पद्धति के कारण पाठक लेखक के बाद रन करेगा।
  2. जब राइट संकेत पद्धति 0 पर पहुंच जाता है तो लेखक लिखना बंद कर देगा।
  3. जब रीड संकेत पद्धति 0 पर पहुंच जाएगा तो पाठक पढ़ना बंद कर देगा।

लेखक में राइट संकेत पद्धति का मान संकेत पद्धति को पढ़ने के लिए दिया जाता है और पाठक में, लूप के पूरा होने पर लिखने के लिए रीड का मान दिया जाता है।

यह भी देखें

संदर्भ

  1. Tanenbaum, Andrew S. (2006), Operating Systems - Design and Implementation, 3rd edition [Chapter: 2.3.2 The Readers and Writers Problem], Pearson Education, Inc.
  2. 2.0 2.1 Courtois, P. J.; Heymans, F.; Parnas, D. L. (1971). ""पाठकों" और "लेखकों" के साथ समवर्ती नियंत्रण" (PDF). Communications of the ACM. 14 (10): 667–668. doi:10.1145/362759.362813. S2CID 7540747.
  3. Taubenfeld, Gadi (2006). तुल्यकालन एल्गोरिदम और समवर्ती प्रोग्रामिंग. Pearson Education. p. 301.
  • Morris JM (1979). A starvation-free solution to the mutual exclusion problem. Inf Process Lett 8:76–80
  • Fair Solution to the Reader-Writer-Problem with Semaphores only. H. Ballhausen, 2003 arXiv:cs/0303005
  • Faster Fair Solution for the Reader–Writer Problem. V. Popov, O. Mazonka 2013 arXiv:1309.4507

बाहरी संबंध