2011-12-31 8 views
32

हमारे पास रीयल-टाइम सी # एप्लिकेशन के पास एक बहुत ही उच्च प्रदर्शन मल्टीटास्किंग है। यह प्रदर्शन प्राथमिक रूप से घर के उगाए गए शेड्यूलर के साथ सहकारी मल्टीटास्किंग इन-हाउस को कार्यान्वित करके हासिल किया गया था। इसे अक्सर सूक्ष्म धागे कहा जाता है। इस प्रणाली में सभी कार्य कतारों के माध्यम से अन्य कार्यों के साथ संवाद करते हैं।सी # सी ++ इंटरऑप या किसी अन्य तरीके के माध्यम से प्रथम श्रेणी निरंतरता?

हमें जो विशिष्ट समस्या है, वह केवल प्रथम श्रेणी की निरंतरताओं के माध्यम से हल हो सकती है जो सी # समर्थन नहीं करता है।

विशेष रूप से समस्या कतारों से निपटने वाले 2 मामलों में उत्पन्न होती है। जब भी कोई विशेष कार्य कतार पर कोई आइटम रखने से पहले कुछ काम करता है। अगर कतार भरा हुआ है तो क्या होगा?

इसके विपरीत, एक अलग कार्य कुछ काम कर सकता है और फिर एक कतार के एक आइटम को बंद करने की आवश्यकता है। क्या होगा यदि वह कतार खाली है?

हमने कतारों को कार्यों से जोड़ने के लिए 90% मामलों में हल किया है ताकि उनके आउटबाउंड कतार पूर्ण हो या इनबाउंड कतार खाली हो।

इसके अलावा कुछ कार्यों को राज्य मशीनों में परिवर्तित कर दिया गया ताकि वे कतार पूर्ण/खाली हो और प्रतीक्षा किए बिना जारी रख सकें।

वास्तविक समस्या कुछ किनारे के मामलों में उत्पन्न होती है जहां उन समाधानों में से किसी एक को अव्यवहारिक होता है। उस परिदृश्य में विचार बिंदु पर स्टैक स्थिति को सहेजना होगा और एक अलग कार्य पर स्विच करना होगा ताकि यह काम कर सके और बाद में जब भी यह जारी रखने में सक्षम हो, प्रतीक्षा कार्य को पुनः प्रयास करें।

अतीत में, हमने अन्य कार्यों को प्रतीक्षा करने और बाद में प्रतीक्षा कार्य को पुनः प्रयास करने के लिए प्रतीक्षा कार्य को अनुसूची (रिकर्सिवली) में वापस कॉल करने का प्रयास किया था। हालांकि, इससे बहुत अधिक "डेडलॉक" परिस्थितियां हुईं।

.NET थ्रेड वास्तव में "फाइबर" के रूप में काम करने के लिए एक कस्टम सीएलआर होस्ट का एक उदाहरण था जो अनिवार्य रूप से थ्रेड के बीच स्टैक स्थिति स्विच करने की अनुमति देता है। लेकिन अब मुझे इसके लिए कोई नमूना कोड नहीं मिल रहा है। इसके अलावा ऐसा लगता है कि इसे सही करने के लिए कुछ महत्वपूर्ण जटिलताएं लेंगी।

क्या किसी के पास रचनात्मक रूप से कार्यों के बीच स्विच करने और उपर्युक्त समस्याओं से बचने के लिए कोई अन्य रचनात्मक विचार है?

क्या कोई अन्य सीएलआर होस्ट है जो इसे वाणिज्यिक, अन्यथा प्रदान करता है? क्या कोई ऐड-ऑन देशी लाइब्रेरी है जो सी # के लिए निरंतरता के कुछ रूप प्रदान कर सकती है?

+1

फाइबर मोड सीएलआर होस्ट नमूना - आप इस बारे में डिनो विहलैंड की ब्लॉग श्रृंखला का जिक्र कर रहे हैं, जो यहां शुरू होता है: http://blogs.msdn.com/b/dinoviehland/archive/2004/08/16/215140। एएसपीएक्स – bobbymcr

+3

नाइट: डेडलॉक एक दक्षता मुद्दा नहीं है। यह एक शुद्धता मुद्दा है। (इसके अलावा, एक पूर्ण अनबाउंड कतार और कोई और स्मृति के बीच क्या अंतर है? राज्य राज्य है और कहीं भी संग्रहीत किया जाना चाहिए।) –

+8

हम सी # 5 के लिए निरंतरता का एक रूप जोड़ रहे हैं। हालांकि वे बिल्कुल प्रथम श्रेणी के कॉल/सीसी-शैली निरंतरता, वे नैतिक रूप से समकक्ष हैं। इसकी पूर्वावलोकन रिलीज के लिए "async CTP" देखें। http://msdn.microsoft.com/en-us/vstudio/gg316360.aspx। एसिंक फीचर की प्रदर्शन विशेषताओं पर स्टीफन टब के हालिया एमएसडीएन पत्रिका लेख को भी देखें। –

उत्तर

1

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

+0

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

+0

दिलचस्प बात यह है कि हमने जो संदेश पास किया है, वह अब निर्धारित करता है कि संदेश प्राप्त होने पर प्रेषक के रूप में एक ही थ्रेड/कोर पर चलाया जाएगा, जो पूरी तरह से ताले को हटा देता है। इसलिए विवाद केवल तभी होता है जब किसी अन्य कोर पर कूदने के लिए जरूरी होता है जो केवल एक सीएएस ऑपरेशन की तुलना में क्वाड कोर पर 4 गुना सस्ता होता है क्योंकि सीएएस सभी कोर बंद कर देता है जबकि एल 1 कैश मिस केवल डेटा को पढ़ने वाले एकल कोर को प्रभावित करता है वह लिखा गया था। – Wayne

+0

निरंतरता के लिए, हम बस एक राज्य मशीन का उपयोग करते हैं क्योंकि इस तरह कंपेलर इसे वैसे भी करते हैं। अफसोस की बात है, निरंतरता के लिए सी # में कोई वाक्य रचनात्मक चीनी नहीं है। लेकिन एक राज्य मशीन उद्देश्य उद्देश्य अच्छी तरह से! सौभाग्य से सिस्टम में केवल कुछ मुट्ठी भर जगहें हैं जहां निरंतरता/राज्य मशीन आवश्यक है। – Wayne

0

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

आपकी समस्या को हल करने का अन्य तरीका प्रकाशन-ग्राहक पैटर्न या संभावित थ्रेड पूल का उपयोग कर रहा है।

आशा है कि यह सहायक होगा?

+0

धन्यवाद लेकिन सीएएस का परीक्षण भी धीमा है। प्रत्येक सीएएस वैध होने के लिए, सभी कोरों को सिंक्रनाइज़ करना होगा। हमारी रणनीति अब शून्य ताले का उपयोग करती है, जिसमें सीएएस जैसे शून्य स्पिन ताले शामिल हैं। इसके बजाय अलग-अलग घटक एरलांग डिज़ाइन के समान संदेश के माध्यम से संवाद करते हैं। यह कैश मिस या सीएएस धीमी गति के बिना सच समानांतर प्रसंस्करण की अनुमति देता है। – Wayne

2

C# 5 CTP, जो तरीकों नई async कीवर्ड के साथ घोषित से अधिक एक निरंतरता-गुजर शैली परिवर्तन करता है, और निरंतरता-गुजर आधारित कॉल जब await कीवर्ड का उपयोग नहीं है।

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

+1

आप यह ध्यान रखना चाहते हैं कि यह एक बेहद सीमित सीपीएस परिवर्तन है। – leppie

+1

संदेश पासिंग के साथ पूर्ण उड़ा ऑब्जर्वर पैटर्न की शक्ति, प्रदर्शन और लचीलापन को कम करता है। संदेश पास बहु-कोर और वितरित प्रोग्रामिंग के लिए सबसे सुरुचिपूर्ण और कुशल समाधान प्रतीत होता है। – Wayne

+0

@ वेन सहमत हैं। मैं इसे केवल इसलिए लाता हूं क्योंकि यह प्रथम श्रेणी की भाषा सुविधा है (हालांकि रनटाइम स्तर पर पहली कक्षा नहीं है, क्योंकि इसे उस कोड पर लागू नहीं किया जा सकता है जो फीचर के लिए लिखा और संकलित नहीं है)। –

1

नहीं, काम पर नहीं जा रहा है। सी # (और यहां तक ​​कि आईएल) एक सामान्य तरीके से ऐसे परिवर्तन (सीपीएस) करने के लिए बहुत जटिल भाषा है। सबसे अच्छा आप प्राप्त कर सकते हैं सी # 5 क्या पेशकश करेगा। उस ने कहा, आप शायद उच्च ऑर्डर लूप/पुनरावृत्तियों के साथ तोड़ने/फिर से शुरू करने में सक्षम नहीं होंगे, जो वास्तव में चाहते हैं कि आप सामान्य उद्देश्य पुन: प्रयोज्य निरंतरता से चाहते हैं।

1

फाइबर मोड तनाव में समस्याओं के कारण CLR के वी 2 से हटा दिया गया था, देखें:

मेरी जानकारी फाइबर समर्थन करने के लिए अभी तक नहीं है मधुमक्खी फिर से जोड़ा, हालांकि उपर्युक्त लेख पढ़ने से फिर से जोड़ा जा सकता है (एच इस तथ्य पर ध्यान दें कि विषय पर 6-7 साल के लिए कुछ भी उल्लेख नहीं किया गया है, मुझे विश्वास है कि इसकी संभावना नहीं है)।

FYI करें फाइबर समर्थन नहीं नेट अनुप्रयोगों अनुमति देने के लिए एक विधि के रूप, मौजूदा अनुप्रयोगों (जैसे कि SQL सर्वर के रूप में) फाइबर का प्रयोग कर एक तरीका है कि उन्हें प्रदर्शन को अधिकतम करने की अनुमति देता है में CLR की मेजबानी के लिए एक तरीका बनना था धागे के हंडर्ड बनाने के लिए - छोटे फाइबर में आपकी समस्या के लिए एक जादू बुलेट समाधान नहीं है, हालांकि यदि आपके पास एक ऐसा एप्लिकेशन है जो फाइबर का उपयोग सीएलआर की मेजबानी करने की इच्छा रखता है तो प्रबंधित होस्टिंग एपीआई सीएलआर के लिए " अपने आवेदन के साथ अच्छी तरह से काम करें। इस पर जानकारी का एक अच्छा स्रोत managed hosting API documentation होगा, या यह देखने के लिए कि SQL सर्वर सीएलआर कैसे होस्ट करता है, जिसमें से कई अत्यधिक जानकारीपूर्ण लेख हैं।

Threads, fibers, stacks and address space का एक त्वरित पठन भी लें।

संबंधित मुद्दे