2009-12-15 14 views
7

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

वर्तमान में, मैं नामित पाइप सोच रहा हूं, क्योंकि यह ओएस द्वारा ही प्रदान किया जाता है। क्या प्रदर्शन या प्रयोज्यता के बारे में कोई चेतावनी है?

साझा मेमोरी बेहतर होगी?

मुझे नहीं लगता कि मुझे एक सुपर-जटिल फ्रेमवर्क की आवश्यकता है।

कृपया मुझे सही दिशा में इंगित करें, धन्यवाद!


अद्यतन: मैं, उनकी स्थिति वापस रिपोर्ट एक छोटा सा कार्यक्रम (डेमॉन) कि अन्य कार्यक्रमों के लिए कहता है (जो वह खुद को शुरू होता है) को रोकने के लिए निर्माण करना चाहते हैं, बंद करो आदि

तो अन्य प्रोग्राम चाहिए अधिसूचित किया जाए कि एक नया आदेश इसके लिए इंतजार कर रहा है। एक पाइप उसके लिए आदर्श नहीं है, है ना?

उत्तर

4

बूस्ट में InterProcess लाइब्रेरी है जो क्रॉस-प्लेटफॉर्म और काफी सहज है।

मैंने केवल इसके साथ खिलवाड़ किया है, इसलिए वहां बेहतर विकल्प हो सकते हैं।

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

+0

यह दिलचस्प लग रहा है। मैं इसे देख लूंगा। मैं हमेशा बूस्ट पुस्तकालयों को देखना भूल जाता हूं। – brandstaetter

10

आप देखा है, तो आप अंतर प्रक्रिया संचार के लिए उपयोग कर सकते हैं:

  • साझा स्मृति
  • नाम पाइप
  • टीसीपी/यूडीपी सॉकेट (अंततः स्थानीय लोगों)

साझा स्मृति प्रदर्शन का लाभ है, क्योंकि संदेश भेजने/प्राप्त करने पर आपके पास कोई बफर नहीं है। लेकिन आपको एक और आईपीसी के साथ अपने डेटा एक्सचेंजों को सिंक्रनाइज़ करना होगा। यह आईपीसी semaphores या ... नाम पाइप या सॉकेट हो सकता है।

जब प्रदर्शन मुख्य लक्ष्य नहीं होता है, तो मुझे सॉकेट पसंद करते हैं क्योंकि उनका उपयोग सरल है और इसे इंटर कंप्यूटर संचार तक बढ़ाया जा सकता है।

सबसे अच्छा तरीका एक ऐसे वर्ग के साथ अपने संचार को सारण करना है जो साझा प्रक्रिया का उपयोग कर सकता है जब दोनों प्रक्रियाएं एक ही कंप्यूटर पर होंगी और सॉकेट नहीं होती हैं। फिर आपको यूडीपी और टीसीपी के बीच चयन करना होगा ;-)

सिंच्रो/बफर एक्सचेंज के लिए, टीसीपी को अधिक विश्वसनीय के रूप में पसंद करें।

मैं नहीं नामित पाइप का उपयोग के रूप में मैं संभावना इंटर कंप्यूटर communicationand निश्चित रूप से आप पोर्टेबल सॉकेट पुस्तकालयों का एक बहुत कुछ मिल सकता है का उपयोग करने के लिए सॉकेट पसंद करते हैं ...

my2cents

संपादित करें:

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

+0

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

+1

@brandstaetter: इस मामले में साझा mem रास्ता है। प्रदर्शन जितना बेहतर होगा उतना बड़ा प्रदर्शन। अन्य आईपीसी (और सॉकेट) को बफर करना होता है, भले ही वे अनुकूलित हों। साझा ज्ञापन के साथ आप सुनिश्चित हैं कि कोई बफर ओवरहेड नहीं है। हम छवि विनिमय के लिए साझा ज्ञापन का उपयोग करते हैं। सिंक्रो को नामित पाइप या एक (स्थानीय) सॉकेट के साथ किया जा सकता है, साझा सेमफोर (और अधिक पोर्टेबल) से प्रबंधित करना आसान है। आप अपने डेटा/एक्सचेंज प्रोटोकॉल के आधार पर भी कर सकते हैं ... – neuro

+0

एब्स्ट्रक्शन लेयर –

2

D-Bus एक ही मेजबान में आईपीसी करने के लिए बहुत उपयोगी और बहुत स्थिर है। http://www.freedesktop.org/wiki/Software/dbus

+0

हम, थोड़ी अधिक मात्रा में और मुझे लगता है कि सेटअप करने के लिए कड़ी मेहनत है अगर पहले से स्थापित/सेटअप नहीं है? – neuro

1

मैं यूनिक्स सॉकेट या कुछ लाइब्रेरी का उपयोग करता हूं जो उन्हें लपेटता है। यूनिक्स सॉकेट का उपयोग करना बहुत आसान है।

दूसरी तरफ यदि आपके पास रिपोर्ट करने के लिए निश्चित आकार की स्थिति जानकारी है, तो आप केवल बच्चे को फाइलों में लिखने की प्रक्रिया कर सकते हैं (संभवतः यह छोटा है और आप इसे fsync नहीं करेंगे, इसलिए यह उत्पन्न नहीं होगा महत्वपूर्ण आईओ वर्कलोड)।

+0

+1: हाँ क्यों एक फ़ाइल नहीं। सिंक्रो के संबंध में सबसे अच्छा तरीका नहीं है, लेकिन आप सिंक्रनाइज़ेशन के लिए मार्कर/काउंटर का उपयोग कर सकते हैं। – neuro

4

socketpair का उपयोग करने के लिए एक अच्छी पसंद है बहुत तेज़ और कुशल।

+0

+1 आह हाँ अच्छा बिंदु – neuro

1

सेमफोर के साथ साझा स्मृति सबसे तेज़ और सबसे पारदर्शी है यदि आप प्राइमेटिव्स से सॉफ्टवेयर बनाना चाहते हैं।

नामित पाइप पाइप से बहुत अलग नहीं हैं और प्रक्रियाओं की एक जोड़ी के बीच अच्छी तरह से काम करते हैं, न कि सर्वर और कई क्लाइंट।

यदि आप मौजूदा आधारभूत संरचना पर निर्माण करना चाहते हैं, तो डीबीस एक विकल्प है।

सॉकेट संचार बहुमुखी है और अच्छी तरह से स्केल करता है यदि आप अपने अनुप्रयोगों को नेटवर्क पर मेजबानों में ले जाना चाहते हैं।

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