मैंने पिछले 15 वर्षों में कई बार हेरली और विंग को फिर से बनाया है। यह बहुत मुश्किल से पढ़ा गया है। और यह दुर्भाग्यपूर्ण है, क्योंकि जब किनारों के आसपास कुछ सूक्ष्मताएं होती हैं, तो मूल विचार वास्तव में काफी उचित होता है।
संक्षेप में: लीनियरिज़ेबिलिटी सीरीज़ेबिलिटी की तरह है, लेकिन अतिरिक्त आवश्यकता के साथ कि क्रमबद्धता लेनदेन के बीच अतिरिक्त ऑर्डरिंग बाधाओं का सम्मान करती है। लक्ष्य आपको एक बार में पूरे सिस्टम के बारे में तर्क करने के बजाय एक व्यक्तिगत परमाणु डेटा संरचना के बारे में कठोरता से तर्क करने की अनुमति देता है।
लीनियरिज़ेबिलिटी को प्राप्त करना भी आसान है: बस एक म्यूटेक्स को उस वस्तु के साथ जोड़ दें जिसे आप रैखिक करना चाहते हैं। उस ऑब्जेक्ट पर प्रत्येक लेन-देन म्यूटेक्स को लॉक करके शुरू होता है और म्यूटेक्स को अनलॉक करके समाप्त होता है।
यहां वे परिभाषाएं हैं जिनका मैं उपयोग करूंगा:
यदि कोई डेटा के सेट पर लेन-देन का एक सेट दिया जाता है, तो एक प्रणाली सीरिज़ैबाइल होती है , लेनदेन को निष्पादित करने का कोई भी परिणाम उसी तरह होता है जैसे कि लेनदेन को कुछ अनुक्रमिक क्रम में निष्पादित किया गया था, और प्रत्येक लेनदेन के संचालन उनके ऑर्डर में लेनदेन के भीतर निहित हैं। लेनदेन के कोड द्वारा निर्दिष्ट।
Serializability विभिन्न लेनदेन के बीच संचालन के interleaving की उपस्थिति को अस्वीकार करता है, और इसके लिए आवश्यक है कि लेन-देन के चुने गए आदेश कार्यशीलता को संतुष्ट करता है (यदि लेन-देन ए मूल्य x लिखता है, और लेनदेन B मूल्य x को पढ़ता है जिसे A ने लिखा है, तो लेनदेन A पूर्ववर्ती लेनदेन बी है चुने गए सीरियल ऑर्डर।) लेकिन यह लेनदेन के आदेश पर किसी भी अन्य बाधाओं के बारे में कुछ नहीं कहता है (विशेष रूप से, यह प्रक्रियाओं के बारे में कुछ नहीं कहता है और जिस क्रम में घटनाओं का अनुभव होता है।)
एक अन्य संबंधित विचार है जो उस क्रम के बारे में बाधाओं में जोड़ता है जिसमें प्रक्रियाएं निष्पादित होती हैं (लेकिन लेनदेन केवल व्यक्तिगत पढ़ने / लिखने के संचालन के बारे में बात नहीं करता है):
एक प्रणाली क्रमिक रूप से सुसंगत है यदि किसी भी निष्पादन का परिणाम समान है जैसे कि सभी प्रक्रियाओं के संचालन को कुछ अनुक्रमिक क्रम में निष्पादित किया गया था, और प्रत्येक व्यक्तिगत प्रक्रिया के संचालन इस क्रम में उसके कार्यक्रम द्वारा निर्दिष्ट क्रम में दिखाई देते हैं। ( लैम्पपोर्ट, "कैसे एक मल्टीप्रोसेसर कंप्यूटर बनाने के लिए जो सही ढंग से मल्टीप्रोसेस प्रोग्राम निष्पादित करता है", IEEE T Comp 28: 9 (690-691), 1979 )।
अनुक्रमिक स्थिरता की परिभाषा में निहित यह है कि हम केवल अनुक्रमिक आदेशों को स्वीकार करते हैं जहां प्रत्येक मेमोरी लोकेशन (ऑब्जेक्ट) के लिए ऑपरेशन के प्रेरित अनुक्रमिक आदेश इस नियम का पालन करते हैं कि प्रत्येक रीड ऑपरेशन द्वारा स्थान पर लौटाए गए x
मान का वही मान होना चाहिए जो लिखा गया था x
अनुक्रम क्रम में स्थान के लिए तुरंत पूर्ववर्ती लेखन ऑपरेशन ।
रेखीयता के अच्छे इरादे हैं (ए) लेन-देन की धारणा को एक साथ जोड़ना (क्रमांकन से) इस धारणा के साथ कि प्रक्रियाएं उम्मीद करती हैं कि वे परिचालन क्रम में (क्रमिक स्थिरता से) जारी करने की अपेक्षा करें और (बी) प्रत्येक के बारे में बात करने के लिए शुद्धता मानदंड को सीमित करें एक पूरे के रूप में प्रणाली के बारे में कारण के लिए मजबूर करने के बजाय अलगाव में वस्तु। (मैं यह कहना चाहूंगा कि मेरी वस्तु का क्रियान्वयन एक ऐसी प्रणाली में भी सही है जहाँ ऐसी अन्य वस्तुएं हैं जो रैखिक नहीं हैं।) मेरा मानना है कि हेरली और विंग शायद ही किसी मॉनीटर को सख्ती से परिभाषित करने की कोशिश कर रहे हों ।
भाग (ए) "आसान" है: अनुक्रमिक स्थिरता जैसी आवश्यकता यह होगी कि प्रत्येक प्रक्रिया द्वारा जारी किए गए ऑब्जेक्ट पर लेनदेन कार्यक्रम द्वारा निर्दिष्ट क्रम में परिणामी अनुक्रम में दिखाई दें। क्रमबद्धता जैसी आवश्यकता यह होगी कि वस्तु पर होने वाले लेन-देन सभी पारस्परिक रूप से अनन्य हों (क्रमबद्ध हो सकते हैं)।
जटिलता उद्देश्य से आती है (बी) (प्रत्येक वस्तु के बारे में स्वतंत्र रूप से सभी अन्य लोगों के बारे में बात करने में सक्षम)।
कई वस्तुओं के साथ एक प्रणाली में यह संभव है कि ऑब्जेक्ट B पर संचालन उस क्रम पर बाधा उत्पन्न करता है जिसमें हम मानते हैं कि ऑपरेशन ऑब्जेक्ट पर लागू किए गए थे। यदि हम पूरे सिस्टम इतिहास को देख रहे हैं, तो हम कुछ अनुक्रमिक आदेशों के लिए बाध्य होंगे, दूसरों को अस्वीकार करने की आवश्यकता होगी। लेकिन हम एक सही मापदंड चाहते थे, जिसे हम अलगाव में इस्तेमाल कर सकें (केवल इस बात का तर्क कि वैश्विक वैश्विक छात्र से अपील किए बिना वस्तु ए का क्या होता है)।
उदाहरण के लिए: मान लें कि मैं ऑब्जेक्ट A की शुद्धता के बारे में बहस करने की कोशिश कर रहा हूं, जो कि एक कतार है, मान लीजिए कि B एक मेमोरी लोकेशन है, और मान लीजिए कि मेरे पास निम्नलिखित निष्पादन हिस्ट्री हैं: थ्रेड 1: A.enqueue (x), A. dequeue () (रिटर्न y)। थ्रेड 2: ए.नेक्यू (वाई), एडेक्यू () (रिटर्न एक्स)। क्या घटनाओं की एक इंटरलेविंग है जो कतार के इस कार्यान्वयन को सही होने की अनुमति देगा? हाँ:
Thread 1 Thread 2
A.enqueue(x) ...
... A.enqueue(y)
... A.dequeue() (returns x)
A.dequeue(y) (returns y) ...
लेकिन अब क्या होगा अगर इतिहास ( ऑब्जेक्ट बी सहित ): बी मूल्य 0 से शुरू होता है। थ्रेड 1: एनेक्यू (एक्स), एडेक्यू () (रिटर्न वाई), बीराइट (1)। थ्रेड 2: B.read () (रिटर्न 1) A.queque (y), A.dequeue () (रिटर्न x)।
Thread 1 Thread 2
A.enqueue(x) ...
A.dequeue() (returns y) ... (uh oh!)
B.write(1) ...
... B.read() (returns 1)
... A.enqueue(y)
... A.dequeue() (returns x)
अब हम "शुद्धता" की अपनी परिभाषा को यह कहना चाहेंगे कि यह इतिहास बताता है कि या तो A का हमारा कार्यान्वयन छोटी गाड़ी है या B का हमारा कार्यान्वयन छोटी गाड़ी है, क्योंकि कोई क्रमांकन नहीं है जो "समझ में आता है" (या तो थ्रेड 2 को पढ़ने की आवश्यकता है B से एक मान जो अभी तक नहीं लिखा गया है, या थ्रेड 1 को A से एक मान को हटाने की आवश्यकता है जो अभी तक संलग्न नहीं है।) तो जबकि A पर लेन-देन का हमारा मूल क्रमबद्धता एक उचित लगता था, यदि हमारा कार्यान्वयन। दूसरे की तरह एक इतिहास की अनुमति देता है, तो यह स्पष्ट रूप से गलत है।
तो यह है कि रैखिककरण कहते हैं कि बाधाएं FIFO कतारों की तरह सरल डेटा संरचनाओं के लिए भी उचित (और आवश्यक हैं।) वे कुछ इस तरह हैं: "आपके कार्यान्वयन को एक बार में कुछ समय तक समाप्त नहीं किया जाना चाहिए () मूल्य को समाप्त करना चाहिए। भविष्य। " प्राप्त करने के लिए रेखीयता काफी आसान (और प्राकृतिक) है: बस अपनी वस्तु के साथ एक म्यूटेक्स संबद्ध करें, और प्रत्येक लेनदेन लॉकिंग द्वारा शुरू होता है और अनलॉक करके समाप्त होता है। जब आप साधारण म्यूटेक्स के बजाय गैर-अवरोधक या लॉक-फ्री या प्रतीक्षा-मुक्त तकनीकों के साथ अपनी परमाणुता को लागू करने की कोशिश कर रहे हैं, तो रैखिकता के बारे में तर्क मुश्किल होने लगते हैं।
यदि आप साहित्य के कुछ बिंदुओं में रुचि रखते हैं, तो मैंने निम्नलिखित पाया है (हालांकि मुझे लगता है कि "वास्तविक समय" के बारे में चर्चा लाल-झुंडों में से एक है जो रैखिकता को अधिक कठिन बनाती है, जितना कि इसके लिए आवश्यक है।) https: // stackoverflow.com/questions/4179587/difference-between-linearizability-and-serializability