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

From Vigyanwiki
No edit summary
No edit summary
Line 13: Line 13:


/*
/*
   संसाधन। पी () प्रतीक्षा (संसाधन) के बराबर है
   resource.P() is equivalent to wait(resource)
   संसाधन। वी () सिग्नल (संसाधन) के बराबर है
   resource.V() is equivalent to signal(resource)
   rmutex.P () प्रतीक्षा के बराबर है (rmutex)
   rmutex.P() is equivalent to wait(rmutex)
   rmutex.V () सिग्नल के बराबर है (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 (); //सुनिश्चित करें कि जब आप इसमें हैं तो कोई अन्य पाठक <प्रविष्टि> अनुभाग को निष्पादित नहीं कर सकता है
     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


     // पढ़ना करो
     // Do the Reading


     rmutex.P (); //सुनिश्चित करें कि जब आप इसमें हैं तो कोई अन्य पाठक <बाहर निकलें> अनुभाग को निष्पादित नहीं कर सकता है
     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
     अगर (रीडकाउंट == 0) // चेक करता है कि क्या आप अंतिम (केवल) पाठक हैं जो साझा फ़ाइल पढ़ रहे हैं
     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 (); //मुक्त करना
     rmutex.V();           //Release
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


पाठकों/लेखकों की समस्या के इस समाधान में, यदि उपलब्ध हो तो पहले पाठक को संसाधन (साझा फ़ाइल) को लॉक करना होगा। एक बार जब फ़ाइल लेखकों से लॉक हो जाती है, तो इसे बाद के कई पाठकों द्वारा इसे फिर से लॉक किए बिना उपयोग किया जा सकता है।
पाठकों/लेखकों की समस्या के इस समाधान में, यदि उपलब्ध हो तो पहले पाठक को संसाधन (साझा फ़ाइल) को लॉक करना होगा। एक बार जब फ़ाइल लेखकों से लॉक हो जाती है, तो इसे बाद के कई पाठकों द्वारा इसे फिर से लॉक किए बिना उपयोग किया जा सकता है।
Line 66: Line 66:
सेमाफोर rmutex, wmutex, readTry, संसाधन; //(प्रारंभिक मान = 1)
सेमाफोर rmutex, wmutex, readTry, संसाधन; //(प्रारंभिक मान = 1)


// पाठक
//READER
पाठक () {
reader() {
<प्रविष्टि अनुभाग>
<ENTRY Section>
   रीडट्री। पी (); // इंगित करें कि एक पाठक प्रवेश करने का प्रयास कर रहा है
   readTry.P();                 //Indicate a reader is trying to enter
   rmutex.P (); // अन्य पाठकों के साथ दौड़ की स्थिति से बचने के लिए प्रवेश अनुभाग को लॉक करें
   rmutex.P();                 //lock entry section to avoid race condition with other readers
   रीडकाउंट ++; // एक पाठक के रूप में खुद को रिपोर्ट करें
   readcount++;                 //report yourself as a reader
   if (readcount == 1) // चेक करता है कि क्या आप पहले पाठक हैं
   if (readcount == 1)         //checks if you are first reader
     संसाधन पी (); // यदि आप पहले पाठक हैं, तो संसाधन को लॉक कर दें
     resource.P();             //if you are first reader, lock  the resource
   rmutex.V (); // अन्य पाठकों के लिए प्रवेश अनुभाग जारी करें
   rmutex.V();                 //release entry section for other readers
   readTry.V (); // इंगित करें कि आप संसाधन तक पहुँचने का प्रयास कर रहे हैं
   readTry.V();                 //indicate you are done trying to access the resource


<गंभीर खंड>
<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
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<सिंटैक्सहाइलाइट लैंग = सी लाइन = 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>


यह समाधान केवल इस शर्त को पूरा कर सकता है कि किसी भी थ्रेड को भूखा नहीं रहने दिया जाएगा यदि और केवल तभी जब सेमाफोर थ्रेड्स को ब्लॉक और रिलीज करते समय फर्स्ट-इन फर्स्ट-आउट ऑर्डर को संरक्षित करते हैं। अन्यथा, एक अवरुद्ध लेखक, उदाहरण के लिए, अन्य लेखकों के एक चक्र के साथ सेमाफोर को कम करने से पहले अनिश्चित काल तक अवरुद्ध रह सकता है।
यह समाधान केवल इस शर्त को पूरा कर सकता है कि किसी भी थ्रेड को भूखा नहीं रहने दिया जाएगा यदि और केवल तभी जब सेमाफोर थ्रेड्स को ब्लॉक और रिलीज करते समय फर्स्ट-इन फर्स्ट-आउट ऑर्डर को संरक्षित करते हैं। अन्यथा, एक अवरुद्ध लेखक, उदाहरण के लिए, अन्य लेखकों के एक चक्र के साथ सेमाफोर को कम करने से पहले अनिश्चित काल तक अवरुद्ध रह सकता है।
Line 234: Line 234:
{{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]]

Revision as of 11:05, 5 June 2023

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

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

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

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

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

/*

  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

} </syntaxhighlight>

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

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

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

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

दूसरा पाठक–लेखक समस्या

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

लेखकों-वरीयता परिदृश्य का समाधान है:[2] <सिंटैक्सहाइलाइट लैंग = सी लाइन = 1> इंट रीडकाउंट, राइटकाउंट; //(प्रारंभिक मान = 0) सेमाफोर rmutex, wmutex, readTry, संसाधन; //(प्रारंभिक मान = 1)

//READER reader() { <ENTRY Section>

 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

} </syntaxhighlight>

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

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

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

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

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


बाहरी संबंध