प्रक्रिया सिंक्रनाइज़ेशन साझा डेटा तक समवर्ती पहुंच की समस्या को दूर करने की तकनीक है जिसके परिणामस्वरूप डेटा असंगति हो सकती है। एक सहयोगी प्रक्रिया वह है जो अन्य प्रक्रिया से प्रभावित या प्रभावित हो सकती है जिससे प्रक्रिया डेटा में असंगति हो सकती है इसलिए डेटा की स्थिरता के लिए प्रक्रिया सिंक्रनाइज़ेशन आवश्यक है।
क्रिटिकल-सेक्शन प्रॉब्लम
प्रत्येक प्रक्रिया में कोड का एक आरक्षित खंड होता है जिसे महत्वपूर्ण अनुभाग . के रूप में जाना जाता है . इस खंड में, प्रक्रिया सामान्य चर को बदल सकती है, तालिकाओं को अपडेट कर सकती है, फाइलें लिख सकती है, आदि। महत्वपूर्ण खंड के बारे में ध्यान देने योग्य बात यह है कि जब एक प्रक्रिया अपने महत्वपूर्ण खंड में निष्पादित हो रही है, तो कोई अन्य प्रक्रिया इसके महत्वपूर्ण खंड में निष्पादित नहीं हो सकती है। प्रत्येक प्रक्रिया को अपने महत्वपूर्ण खंड में प्रवेश करने से पहले अनुमति के लिए अनुरोध करना चाहिए और इस अनुरोध को लागू करने वाले कोड का अनुभाग प्रवेश अनुभाग है , कोड का अंत बाहर निकलें अनुभाग . है और शेष कोड शेष अनुभाग है।
किसी विशेष प्रक्रिया P1 के महत्वपूर्ण खंड की संरचना नीचे दी गई है
एक महत्वपूर्ण अनुभाग के लिए तीन आवश्यकताएं पूरी होनी चाहिए
- आपसी बहिष्करण - यदि एक प्रक्रिया मान लें कि P1 किसी अन्य प्रक्रिया की तुलना में अपने महत्वपूर्ण खंड में निष्पादित कर रहा है, तो मान लें कि P2 अपने महत्वपूर्ण खंड में निष्पादित नहीं कर सकता है।
- प्रगति - यदि इसके क्रिटिकल सेक्शन में कोई प्रोसेस एक्जीक्यूट नहीं है और ऐसी प्रोसेस हैं जो इसके क्रिटिकल सेक्शन में एंटर करना चाहती हैं, तो केवल वे प्रोसेस जो अपने बाकी सेक्शन में एक्सीक्यूट नहीं कर रहे हैं, क्रिटिकल सेक्शन में प्रवेश करने का अनुरोध कर सकते हैं और चयन अनिश्चित काल के लिए स्थगित किया जा सकता है। ।
- बंधी हुई प्रतीक्षा - बाउंडेड वेटिंग में, किसी प्रक्रिया द्वारा अपने महत्वपूर्ण खंड में प्रवेश करने का अनुरोध करने के बाद और उस अनुरोध को स्वीकार किए जाने से पहले एक प्रक्रिया अपने महत्वपूर्ण खंड में कितनी बार प्रवेश कर सकती है, इसकी सीमाएं या सीमाएं हैं।
क्रिटिकल सेक्शन को संभालने के लिए ऑपरेटिंग सिस्टम में आमतौर पर दो तरीकों का इस्तेमाल किया जाता है।
प्रीमेप्टिव कर्नेल - एक प्रीमेप्टिव कर्नेल एक प्रक्रिया को कर्नेल मोड में चलने के दौरान प्रीमेप्ट होने की अनुमति देता है।
गैर-निवारक कर्नेल - एक गैर-प्रीमेप्टिव कर्नेल कर्नेल मोड में चल रही प्रक्रिया को प्रीमेप्ट होने की अनुमति नहीं देता है।
पीटरसन का समाधान
पीटरसन का समाधान क्रिटिकल-सेक्शन की समस्या का एक क्लासिक आधारित सॉफ्टवेयर समाधान है। यह दो प्रक्रियाओं तक सीमित है जो उनके महत्वपूर्ण वर्गों और शेष वर्गों के बीच वैकल्पिक निष्पादन करते हैं। पीटरसन के अनुभाग को दो प्रक्रियाओं के बीच साझा करने के लिए दो डेटा आइटम की आवश्यकता होती है, अर्थात
- इंट टर्न;
- बूलियन ध्वज[2];
यहां, परिवर्तनीय मोड़ इंगित करता है कि किसकी बारी अपने महत्वपूर्ण खंड में प्रवेश करना है और ध्वज सरणी इंगित करती है कि प्रक्रिया अपने महत्वपूर्ण खंड में प्रवेश करने के लिए तैयार है या नहीं।
अगर बारी ==i, इसका मतलब है कि प्रक्रिया पाई को इसके महत्वपूर्ण खंड में प्रवेश करने की अनुमति है।
यदि ध्वज [j] सत्य है, तो इसका अर्थ है कि प्रक्रिया j अपने महत्वपूर्ण खंड में प्रवेश करने के लिए तैयार है
पीटरसन के समाधान में प्रक्रिया P की संरचना नीचे दी गई है
पीटरसन सॉल्यूशन तीनों शर्तों को बरकरार रखता है -
- आपसी बहिष्करण - एक समय में एक प्रक्रिया महत्वपूर्ण अनुभाग तक पहुंच सकती है।
- प्रगति - क्रिटिकल सेक्शन के बाहर की प्रक्रिया अन्य प्रक्रियाओं को क्रिटिकल सेक्शन में प्रवेश करने से नहीं रोकती है।
- बंधी हुई प्रतीक्षा - हर प्रक्रिया को अनिश्चित काल तक प्रतीक्षा किए बिना अपने महत्वपूर्ण खंड में प्रवेश करने का मौका मिलेगा।
सिंक्रनाइज़ेशन हार्डवेयर
इसे दो प्रकार के निर्देशों का उपयोग करके कार्यान्वित किया जाता है -
- परीक्षण और सेट ()
- स्वैप ()
परीक्षण और सेट () सिंक्रनाइज़ेशन की समस्या को हल करने के लिए एक हार्डवेयर समाधान है। इसमें एक साझा चर होता है जिसे लॉक के नाम से जानी जाने वाली कई प्रक्रियाओं द्वारा साझा किया जाता है जिसमें 0 और 1 से एक मान हो सकता है जहां 1 लॉक प्राप्त हुआ और 0 लॉक जारी का प्रतिनिधित्व करता है।
जब भी प्रक्रिया अपने महत्वपूर्ण वर्गों में प्रवेश करने की कोशिश कर रही होती है, तो उन्हें लॉक के मूल्य के बारे में पूछताछ करने की आवश्यकता होती है। यदि लॉक का मान 1 है तो उन्हें तब तक प्रतीक्षा करनी होगी जब तक कि लॉक का मान 0 में परिवर्तित न हो जाए।
नीचे दिए गए टेस्टएंडसेट () के साथ पारस्परिक-बहिष्करण कार्यान्वयन है
सेमाफोर
सेमाफोर एक सिंक्रोनाइज़ेशन टूल है जिसका उपयोग टेस्टएंडसेट () और स्वैप () निर्देशों द्वारा उत्पन्न समस्याओं को दूर करने के लिए किया जाता है। एक सेमाफोर एस एक पूर्णांक चर है जिसे दो मानक परमाणु संचालन के माध्यम से एक्सेस किया जा सकता है जो प्रतीक्षा () और सिग्नल ()
हैं।प्रतीक्षा के लिए कार्य ():
wait(S) { While S <= 0 ; // no operation S--; }
सिग्नल के लिए कार्य ():
signal(S) { S++; }
जब एक प्रक्रिया सेमाफोर के मूल्य को संशोधित कर रही है तो कोई अन्य प्रक्रिया एक साथ उसी सेमाफोर मूल्य में हेरफेर नहीं कर सकती है।
सेमाफोर के साथ पारस्परिक-बहिष्करण कार्यान्वयन नीचे दिया गया है
ऑपरेटिंग सिस्टम दो प्रकार के सेमफोर का उपयोग करता है जो हैं -
सेमाफोर की गिनती − इस प्रकार के सेमाफोर का मूल्य एक अप्रतिबंधित डोमेन पर हो सकता है
बाइनरी सेमाफोर - इस प्रकार के सेमाफोर का मान 0 और 1 के बीच हो सकता है। इन्हें म्यूटेक्स लॉक के रूप में भी जाना जाता है। ऑपरेटिंग सिस्टम कई प्रक्रियाओं में महत्वपूर्ण खंड के साथ मुद्दों को हल करने के लिए इसका उपयोग करता है।