2012-09-25 8 views
5

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

1. क्या एनआईएफ एक ही ओएस प्रक्रिया में चलाता है क्योंकि मेरे बाकी एरलांग प्रोसेस या एनआईएफ को एक अलग ओएस प्रक्रिया में लॉन्च किया जाता है?

2. क्या यह एनआईएफ के साथ इस बहु-थ्रेडेड स्टेटफुल सी ++ कोड को खराब करने के लिए समझ में आता है?

4. अगर एनआईएफ सही दृष्टिकोण नहीं है, तो इस सी ++ कोड के साथ एल्रैंग बात करने के लिए मेरे लिए बेहतर तरीका क्या है। मैं अपने सी ++ कोड को उसी ओएस प्रक्रिया के अंदर भी पसंद करता हूं क्योंकि मेरी बाकी एरलांग प्रक्रियाएं होती हैं और जैसा कि ऐसा लगता है कि लिंक किए गए ड्राइवरों में एक विकल्प है लेकिन यह सुनिश्चित नहीं है कि मेरे सी ++ कोड की बहु-थ्रेडेड प्रकृति ठीक रहेगी या नहीं आदर्श। इसके अलावा मैंने सुना है कि वे elrang शेड्यूलर गड़बड़ कर सकते हैं?

उत्तर

4
  1. बंदरगाहों के विपरीत, एनआईएफ ड्राइवरों के समान एरलांग वीएम प्रक्रिया के भीतर चलाए जाते हैं। इसके कारण, किसी भी एनआईएफ दुर्घटनाएं भी वीएम को नीचे लाएंगी। और, अग्रिम में, आपके अंतिम प्रश्न पर, एनआईएफ, ड्राइवरों की तरह, आपके शेड्यूलर को अवरुद्ध कर सकता है।

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

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

NIFs और ड्राइवरों के बीच अंतर की बात हो रही, पूर्व देशी रूप सिंक्रोनस होता है और बाद के अतुल्यकालिक (वास्तव में एक बहुत बड़ा लाभ हो सकता है जो हो सकता है अगर आप में से अधिकांश के लिए कोई जवाब प्राप्त नहीं करना चाहते हैं आदेशों)। ड्राइवर्स को गड़बड़ करना और लागू करना कठिन होता है (लेकिन एक बार जब आप मुख्य पैटर्न और समस्याओं को समझते हैं, तो वे वास्तव में ठीक लगते हैं)। NIFs के लिए http://www.erlang.org/doc/apps/erts/driver.html

और कुछ इसी तरह (जटिलता में अंतर निहारना): http://www.erlang.org/doc/tutorial/nif.html

+0

उत्तर के लिए धन्यवाद

यहाँ चालकों के लिए एक अच्छी शुरुआत है। बात यह है कि मैं सी ++ कोड नहीं बदल सकता और यह आंतरिक रूप से कुछ सीमित धागे बनाता है। इसके अलावा इसमें कुछ आंतरिक डेटा संरचनाओं पर ताले हैं जहां एनआईएफ कॉल का उपयोग किया जा सकता है और इसलिए एनआईएफ कॉल तब तक अवरुद्ध हो सकता है जब तक आंतरिक थ्रेड लॉक जारी नहीं करता है। क्या यह अभी भी ठीक है कि सी ++ कोड बग फ्री है? साथ ही, यह मुझे लगता है कि सभी Erlang प्रक्रिया केवल एक धागे पर चलती है (केवल मेरे पास एक कोर है) और वीएम किसी थ्रेड पूल का उपयोग नहीं करता है? क्या यह सही है? यदि ऐसा है तो हम Erlang में सहमति कैसे प्राप्त करते हैं क्योंकि हम कभी नहीं जानते कि प्रत्येक एरलांग प्रक्रिया कितनी देर तक ले सकती है? – iCode

+2

यदि आप एसिंक व्यवहार प्राप्त करना चाहते हैं तो आप अपने बारे में बात करने के लिए http://www.erlang.org/doc/man/erl_nif.html#enif_thread_create का उपयोग करना चाहिए ताकि आप अपना सी ++ कोड निष्पादित कर सकें। आप उपयोग करते हैं एक पाइप या somesuch उस धागे के साथ संवाद करने के लिए और वापस परिणाम भेजने के लिए enif_send_term का उपयोग करें।एक ड्राइवर को कार्यान्वित करने से आप बेहतर तरीके से सूट कर सकते हैं, फिर आप सी ++ संचालन करने के लिए एर्लंग एसिंक थ्रेड पूल में निर्मित का उपयोग कर सकते हैं। एक गैर-एसएमपी एम्यूलेटर में चलने पर ड्राइवर्स भी अधिक लचीला होते हैं (एसपीपी: 1: 1 के समान नहीं)। – Lukas

+0

एरलांग में धागे की संख्या समेकन को अधिक प्रभावित नहीं करती है। वीएम शेड्यूलर बस सभी प्रक्रियाओं के बीच CPU समय लोड करता है (उनकी प्राथमिकता के अनुसार, जो डिफ़ॉल्ट रूप से सामान्य है और जिसे आप प्रत्येक प्रक्रिया के लिए स्पष्ट रूप से सेट कर सकते हैं)। आप यहां से एर्लांग प्रक्रियाओं के बारे में एक बेहतर विचार प्राप्त कर सकते हैं: http://c2.com/cgi/wiki?GreenVsNativeThreads – demeshchuk