आरटीओएस में कतारों के लिए प्रतिस्थापन


12

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

इससे सिस्टम पर ओवरहेड बढ़ जाता है। क्यू के लिए कुशल प्रतिस्थापन क्या हो सकता है ?

(मुझे लगता है कि यह सवाल आरटीओएस से स्वतंत्र है जिसका हम उपयोग करते हैं। अधिकांश आरटीओएस केवल इस तरह से क्यू संभालते हैं)


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

@ एरिक: क्षमा करें! मैं आपके द्वारा बताए गए तंत्र का उपयोग कर रहा हूं .... मैं कुछ और कहना चाहता था और मैंने अलग लिखा .... मैं इसे संपादित करूँगा !! गलती को इंगित करने के लिए धन्यवाद! मैं अपने कोड में कतार के उपयोग की प्रतीक्षा कर रहा हूँ!
स्वानंद

जवाबों:


7

कतारें इस तरह संचालित होती हैं क्योंकि यह अंतर-कार्य संचार के लिए एक थ्रेड-सुरक्षित लेनदेन मॉडल है। आप किसी भी कम कठोर योजना में डेटा भ्रष्टाचार और / या स्वामित्व के मुद्दों को जोखिम में डालते हैं।

क्या आप डेटा को एक बफर में मेमोरी में कॉपी कर रहे हैं, फिर क्यू तत्वों के साथ एक पॉइंटर पास कर रहे हैं, या क्यू तत्वों में सभी डेटा पास करने की कोशिश कर रहे हैं? यदि आप पॉइंटर्स पास नहीं कर रहे हैं तो आपको कतार तत्वों के माध्यम से एक बार में एक बाइट पास करने के बजाय प्रदर्शन में वृद्धि मिलेगी।


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

जैसा कि @Kortuk ने कहा, मुझे "यह सुनिश्चित करने की ज़रूरत है कि आप डेटा का उपयोग करने और बदलने की कोशिश कर रहे दो थ्रेड्स के साथ समाप्त न हों" ... जिसका मतलब है कि ओवरहेड में वृद्धि ... मुझे बहुत प्रसंस्करण नहीं चाहिए! :(
स्वानंद

इसलिए क्यू के लिए ऐसा कोई प्रतिस्थापन नहीं है ... डेटा कतार के बजाय, मुझे पॉइंटर कतार का उपयोग करने की आवश्यकता है!
स्वानंद

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

7

एक आसान तरीका यह है कि कतार पर डेटा के लिए एक संकेतक लगाया जाए और सूचक का उपयोग करके डेटा का उपभोग किया जाए।

ध्यान दें कि आप इस तरह से प्रदर्शन के लिए सुरक्षा का व्यापार कर रहे हैं, क्योंकि आपको यह सुनिश्चित करना है कि:

  1. जब तक उपभोक्ता ने डेटा का उपभोग नहीं किया है तब तक बफर वैध रहता है
  2. किसी ने बफर डील किया

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


6

एकल-निर्माता / एकल-उपभोक्ता मामले के लिए लॉक-मुक्त कतारें लागू की जा सकती हैं, और अक्सर आप कई-निर्माता या एकाधिक-उपभोक्ता कतार की संख्या को कम करने के लिए अपने सॉफ़्टवेयर को आर्किटेक्ट कर सकते हैं।

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

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

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


1
मैं इसे +1 करने जा रहा था, लेकिन आप गलत हैं: कई पाठकों और लेखकों के लिए लॉक-फ्री कतारें लागू करना संभव है, वे बस अधिक जटिल हैं। (लॉक-फ्री क्युस पर माइकल + स्कॉट के पेपर को देखो google.com/search?q=michael%20scott%20queue )
जेसन एस

1
@ जैसन एस - क्या स्कॉट पेपर विशेष रूप से लॉक-फ्री इंसर्ट और संचालन को हटाने के लिए फिर से प्रवेश का दावा करता है? यदि हां, तो यदि आप इसे निकाल सकते हैं और पोस्ट कर सकते हैं, तो कृपया करें, यह बहुतों के लिए एक अमूल्य संपत्ति होगी। पाठक को ध्यान देना चाहिए कि उद्धृत पेपर विशेष मशीन निर्देशों का उपयोग करता है, जबकि उपरोक्त पोस्ट में मेरी स्थिति ने ऐसा कोई निर्देश नहीं माना है।
जस्टजेफ

1
हाँ, लॉक-फ्री एल्गोरिदम की लागत आमतौर पर सीएएस या समकक्ष निर्देशों पर निर्भरता है। लेकिन यहाँ फिर से प्रवेश कैसे होता है? यह म्यूटेक्स + लॉकिंग संरचनाओं के लिए समझ में आता है, लेकिन डेटा संरचना संचालन के लिए नहीं।
जेसन एस

2

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


1

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

चियर्स !!


1

कतारें स्वाभाविक रूप से धीमी नहीं होती हैं। कार्यान्वयन उनमें से हो सकता है।

यदि आप नेत्रहीन डेटा कॉपी कर रहे हैं और एक तुल्यकालिक कतार का उपयोग कर रहे हैं, तो आपको एक प्रदर्शन हिट दिखाई देगा।

जैसा कि अन्य पोस्टरों ने संकेत दिया है, लॉक-फ्री विकल्प हैं। एकल-उत्पादक / एकल-उपभोक्ता मामला सीधा है; कई उत्पादकों और उपभोक्ताओं के लिए, माइकल और स्कॉट द्वारा लॉक-फ्री कतार एल्गोरिदम (जो उनके अंतिम नाम हैं) मानक है, और जावा के समवर्ती लिंकनक्यू के लिए आधार के रूप में उपयोग किया जाता है ।

कुछ मामलों में कतारों की आवश्यकता को ऑप्टिमाइज़ करना संभव है, लेकिन वे निर्णायक गारंटी प्रदान करते हैं जो आमतौर पर आपको कार्यों को कम करने की अनुमति देकर सिस्टम को भारी सरलीकरण लाभ प्रदान करते हैं।


माइकल एंड स्कॉट पेपर से: "यह उन मशीनों के लिए पसंद का स्पष्ट एल्गोरिदम है जो एक सार्वभौमिक परमाणु आदिम प्रदान करते हैं (उदाहरण के लिए तुलना और स्वैप या लिंक किए गए / स्टोर सशर्त)।" हालांकि यह वास्तव में एक थ्रेड को लॉक नहीं कर सकता है , यहां सिंक्रनाइज़ेशन का एक रूप चल रहा है।
जस्टजेफ

तुम्हारी बात तथ्य पूर्ण है; यह एक मेमोरी बैरियर के लिए विशेष पहुँच से संगणकीय आवश्यकता को कम कर सकता है।
जेसन एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.