2012-03-05 13 views
12

मैं एम्बेडेड लिनक्स पर प्रक्रिया के बीच संचार के लिए उपयोग की जाने वाली एक संदेश कतार पर काम कर रहा हूं। मैं सोच रहा हूं कि मैं लिनक्स द्वारा प्रदान की गई संदेश कतारों का उपयोग क्यों नहीं कर रहा हूं:लिनक्स के संदेश कतारों के नुकसान क्या हैं?

msgctl, msgstr msgrcv, msgsnd।

साझा स्मृति बनाने के बजाय, और सेमफोर के साथ सिंक?

सीधे इस व्यवसाय के एम्बेडेड उत्पाद पर फ़ंक्शंस के इस सेट का उपयोग करने का क्या नुकसान है?

+2

संदेश पासिंग और साझा स्मृति विभिन्न प्रोग्रामिंग प्रतिमान हैं। दरअसल, संदेश पास करना शायद कोड के लिए आसान है। –

उत्तर

9

वे 'सिस्टम वी आईपीसी' संदेश कतार कार्य हैं। वे आपके लिए काम करेंगे, लेकिन वे काफी भारी वजन वाले हैं। वे पॉज़िक्स द्वारा मानकीकृत हैं। POSIX भी जो आपके लिए बेहतर हो सकता है (जैसे धन के एक शर्मिंदगी) काम करता है, mq_close, mq_getattr, mq_notify, mq_open, mq_receive, mq_send, mq_setattr, mq_unlink का एक और अधिक आधुनिक सेट प्रदान करता है। हालांकि, आपको यह जांचना होगा कि डिफ़ॉल्ट रूप से आपके लक्षित प्लेटफॉर्म पर कौन सा, यदि स्थापित है। विशेष रूप से एक एम्बेडेड सिस्टम में, यह हो सकता है कि आपको उन्हें कॉन्फ़िगर करना होगा, या यहां तक ​​कि उन्हें इंस्टॉल भी करना होगा क्योंकि वे डिफ़ॉल्ट रूप से नहीं हैं (और यह साझा स्मृति और सेमफोरों के बारे में भी सच हो सकता है)।

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

तो, (पुनः) जब आप कर सकते हैं उपयोग करें। यदि यह एक विकल्प है, तो अपने आप को दोबारा शुरू करने के बजाय दो संदेश कतार प्रणाली में से एक का उपयोग करें। यदि आप अंततः पाते हैं कि एक प्रदर्शन बाधा या कुछ समान है, तो आप अपने स्वयं के विकल्पों को लिखने की जांच कर सकते हैं, लेकिन तब तक — पुन: उपयोग करें!

+0

लेकिन क्यों न केवल सॉकेट का उपयोग करें? वे पूर्व-डीबग, इत्यादि आदि हैं। निश्चित रूप से, शायद आप AF_UNIX और SOCK_SEQPACKET प्रकार सेमेन्टिक्स चाहते हैं, लेकिन सॉकेट निश्चित रूप से मेरे लिए बहुत बेहतर प्रतीत होता है। – tchrist

+0

@ क्रिसमस: इस बात का विस्तार करने के लिए कि क्यों सॉकेट आपके लिए बेहतर लगते हैं? – Gauthier

2

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

एक साझा स्मृति क्षेत्र भेजने/प्राप्त करने पर डेटा कॉपी नहीं करता है और कम स्वच्छ प्रोग्रामिंग मॉडल के व्यापार में बड़े डेटा सेट के लिए अधिक कुशल हो सकता है।

+1

असल में बड़े डेटा हिस्सों के लिए भी, साझा स्मृति अकेले एक अच्छा विचार नहीं हो सकता है। डेटा को एक सामान्य मेमोरी में संग्रहीत करना और उस मेमोरी तक पहुंचने के लिए सेमफोर या म्यूटेक्स का उपयोग करने के बजाय, आईपीसी का उपयोग करके कम त्रुटि प्रवण प्रोग्रामिंग के लिए अच्छा विचार होगा। – theB

+0

@theB: यह सुनिश्चित करने के लिए कि मैं समझता हूं, बड़े डेटा के लिए, आप अभी भी 'shm' का उपयोग करेंगे, लेकिन इसे' sem' से लॉक नहीं करेंगे? आप 'shm' पर लिखेंगे, फिर यह घोषणा करने के लिए एक आईपीसी संदेश पास करें कि डेटा तैयार है? – Gauthier

5

सिस्टम वी संदेश कतार (संदेश * सिस्टम कॉल द्वारा छेड़छाड़ किए गए) में बहुत सारे अजीब quirks और gotchas है। नए कोड के लिए, मैं दृढ़ता से यूनिक्स डोमेन सॉकेट का उपयोग करने की सलाह दूंगा।

कहा जा रहा है कि, मैं साझा-स्मृति योजनाओं पर संदेश-पास आईपीसी की दृढ़ता से अनुशंसा करता हूं। साझा करने के लिए साझा स्मृति बहुत आसान है, और अधिक विनाशकारी रूप से गलत हो जाती है।

0

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

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

1

नुकसान संदेश कतार miniscule हैं - कुछ सिस्टम कॉल और ओवरहेड की प्रतिलिपि - जो अधिकांश अनुप्रयोगों के लिए कुछ भी नहीं है। लाभ ऊपर से अधिक है।सिंक्रनाइज़ेशन स्वचालित है और इन्हें विभिन्न तरीकों से उपयोग किया जा सकता है: अवरुद्ध करना, अवरुद्ध करना, और चूंकि लिनक्स में संदेश कतार प्रकार फ़ाइल डिस्क्रिप्टर के रूप में कार्यान्वित किए जाते हैं, जिनका उपयोग select() मल्टीप्लेक्सिंग के लिए भी किया जा सकता है। POSIX विविधता में, जिसे आप तब तक उपयोग करना चाहिए जब तक आपके पास SYSV कतारों का उपयोग करने की वास्तव में अनिवार्य आवश्यकता न हो, आप कतार वस्तुओं को संसाधित करने के लिए स्वचालित रूप से धागे या संकेत उत्पन्न कर सकते हैं। और सबसे अच्छा वे पूरी तरह से डीबग हैं।

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