लॉक-फ्री संग्रह पर सीमाएं?


10

डेविड रोड्रिग्ज़ - ड्रिबियास ने स्टैकओवरफ़्लो पर एक टिप्पणी में लिखा है कि "सभी संग्रह बिना ताले के लागू नहीं किए जा सकते हैं"। अगर यह सच है तो मुझे यकीन नहीं है, और मैं किसी भी तरह से सबूत नहीं पा सकता हूं।

यह कथन बहुत सटीक नहीं है, लेकिन मुझे इसे कुछ और औपचारिक तरीके से फिर से समझने की कोशिश करें: प्रत्येक संग्रह प्रकार के लिए C, एक लॉक-फ्री संग्रह प्रकार CLF मौजूद है जो समान संचालन सेट प्रदान करता है, और जहां CLF पर प्रत्येक ऑपरेशन। उसी बिग-ओ जटिलता पर इसी ऑपरेशन के रूप में है C

मैं वैसे भी बदलाव की उम्मीद नहीं करता।


1
एक गैर-विशेषज्ञ के रूप में, मुझे आश्चर्य है कि अगर "लॉक-फ्री" को सख्ती से परिभाषित किया जा सकता है।
त्सुयोशी इतो

1
@ सुरेश: शायद "डेटा संरचना" का एक पर्याय?
त्सुयोशी इतो

2
क्या होगा यदि आप सिर्फ एसटीएम (सॉफ्टवेयर ट्रांसेक्शनल मेमोरी) का लॉक-फ्री कार्यान्वयन लेते हैं, और उसके ऊपर कोई डेटा संरचना लागू करते हैं?
जुक्का सुमेला २ '

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

1
जहाँ तक मैं इसे समझता हूँ, यहाँ लॉक-फ़्री को गैर-अवरोधक का पर्याय समझा जाता है। इसमें सीपीयू के LOCKनिर्देशों को शामिल नहीं किया गया है लेकिन म्यूटेक्स / सेमाफोर्स / आदि के माध्यम से थ्रेड शेड्यूलर शामिल है।
मर्सल्ट्स

जवाबों:


11

चूंकि मैं खुद कुछ उलझन में था, इसलिए मैं प्रश्न में कुछ अवधारणाओं को स्पष्ट करके शुरू करता हूं।

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

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

इन परिभाषाओं के साथ, मुझे लगता है कि हर्लीह और बॉस मूल रूप से कहते हैं कि जवाब महत्वपूर्ण क्षेत्रों को लेनदेन में बदलना है।

लेकिन, आप पूछ सकते हैं कि क्या इसकी जटिलता समान है? मुझे यकीन नहीं है कि सवाल समझ में आता है। विचार करें push(x) { lock(); stack[size++] = x; unlock(); }। क्या यह एक निरंतर समय संचालन है? यदि आप लॉकिंग ऑपरेशन और इसलिए अन्य उपयोगकर्ताओं को अनदेखा करते हैं तो आप हां का जवाब दे सकते हैं। यदि आप अन्य उपयोगकर्ताओं को अनदेखा नहीं करना चाहते हैं, तो वास्तव में यह कहने का कोई तरीका नहीं है कि क्या निरंतर समय में पुश चलेगा। यदि आप एक स्तर ऊपर जाते हैं और देखते हैं कि स्टैक का उपयोग कुछ विशेष एल्गोरिथ्म द्वारा कैसे किया जाता है, तो आप यह कहने में सक्षम हो सकते हैं कि पुश हमेशा निरंतर समय लेगा (अब जो कुछ भी आपके समानांतर एल्गोरिदम का इनपुट होगा) के संदर्भ में मापा जाता है। लेकिन वह वास्तव में तो यह मतलब नहीं है यह कहना है कि, अपने एल्गोरिथ्म की संपत्ति है धक्का है एक निरंतर समय ऑपरेशन।

सारांश में, यदि आप अनदेखा करते हैं कि एक ऑपरेशन को अंजाम देने वाला उपयोगकर्ता अन्य उपयोगकर्ताओं के लिए कितना इंतजार करता है, तो महत्वपूर्ण क्षेत्रों के बजाय लेनदेन का उपयोग करना आपके प्रश्न का सकारात्मक जवाब देता है। यदि आप प्रतीक्षा समय को अनदेखा नहीं करते हैं, तो आपको यह देखने की आवश्यकता है कि डेटा संरचना का उपयोग कैसे किया जाता है।


मुझे इस पर भी यकीन नहीं है कि क्या आप वास्तव में इस बात पर विचार कर सकते हैं कि pushजैसा कि ऊपर कहा गया है ऑपरेशन एक निरंतर समय ऑपरेशन नहीं है। प्रोसेसर की एक निश्चित संख्या के लिए, और इसका एक सामान्य कार्यान्वयन lockबिना भुखमरी की गारंटी देता है, उपरोक्त ऑपरेशन (सबसे खराब स्थिति में, किसी भी प्रोसेसर के लिए N_proc * O (1) लेता है, जिसे भोले रूप से O (1) माना जा सकता है छिपा स्थिरांक में
फैक्टर

n(n)

खैर, मेमोरी एक्सेस उसी का एक सामान्य मामला है। अधिकांश एल्गोरिथ्म विश्लेषण मानता है कि मेमोरी एक्सेस O (1) उपयोग की गई मेमोरी से स्वतंत्र है; वास्तविक मेमोरी आर्किटेक्चर (कैश आदि के साथ) O (लॉग एन) द्वारा बेहतर अनुमानित हैं जहां एन मेमोरी का उपयोग किया जाता है।
MSalters

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

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

3

मुझे लगता है कि "COLLECTIONS" का अर्थ "कतारों, ढेरों, जुड़ी हुई सूचियों, पेड़ों, ..." से है।

से http://www.cl.cam.ac.uk/research/srg/netos/lock-free/

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

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

यदि "लॉक-फ्री" का अर्थ है "ऑपरेटिंग सिस्टम के सेमाफोर, म्यूटेक्स, मॉनिटर, ..." का उपयोग न करें, तो मुझे लगता है कि (लेकिन मैं विशेषज्ञ नहीं हूं) कि हर संग्रह को परमाणु पठन-लेखन का उपयोग करके लॉक-फ़्री बनाया जा सकता है- हार्डवेयर द्वारा समर्थित होने वाली प्राथमिकताओं को संशोधित करें।

हे()

इस विषय पर व्यापक प्रलेखन ऑनलाइन पाया जा सकता है:

http://www.google.it/search?q=lock+free+algorithm+filetype%3Apdf

(... और प्रत्येक दस्तावेज़ के अंत में और संदर्भ)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.