2010-03-28 11 views
11

लिनक्स एप्लिकेशन में मैं धागे के बीच जानकारी पास करने के लिए पाइप का उपयोग कर रहा हूं।पॉज़िक्स पाइप हल्के वजन वाले हैं?

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

उपयोगकर्ता-स्थान में पाइप दो फ़ाइल-हैंडल की तरह दिखते हैं। अब मुझे आश्चर्य है कि ओएस पक्ष पर ऐसे पाइप कितने संसाधनों का उपयोग करते हैं।

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

+6

पॉज़िक्स पाइप इंटरफ़ेस निर्दिष्ट करता है, कार्यान्वयन नहीं, जहां "वजन" आता है। –

+0

कितने चैनल? प्रति सेकंड कितने संदेश? सैकड़ों? लाखों? कई तकनीकों का उपयोग करके एक सरल प्रोटोटाइप बनाएं (आईपीसी संदेश कतारों से कुछ भी पाइप से यूनिक्स सॉकेट आदि तक) और तुलना करें। –

उत्तर

4

आप लिनक्स का उपयोग कर रहे हैं के रूप में आप की जांच करेंगे और eventfd के साथ pipe प्रदर्शन की तुलना कर सकते हैं। वे तकनीकी रूप से तेज़ और हल्के वजन वाले हैं लेकिन वास्तव में अभ्यास में लाभ देखने के लिए आप बहुत भाग्यशाली होंगे।

http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html

+0

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

7

नहीं, मैं पाइप "हल्के वजन" पर विचार नहीं करता, लेकिन इसका मतलब यह नहीं है कि वे आपके आवेदन के लिए गलत जवाब भी हैं।

एक पाइप पर एक बाइट भेजना कम से कम 3 सिस्टम कॉल (लिखना, मतदान, पढ़ना) की आवश्यकता होगी। इन-मेमोरी कतार और पाथ्रेड ऑपरेशंस का उपयोग करना (mutex_lock, cond_signal) में बहुत कम ओवरहेड शामिल है। खुली फ़ाइल डिस्क्रिप्टर निश्चित रूप से कर्नेल संसाधनों का उपभोग करते हैं; यही कारण है कि प्रक्रियाएं आम तौर पर डिफ़ॉल्ट रूप से 256 खुली फ़ाइलों तक ही सीमित होती हैं (यह नहीं कि सीमा को विस्तारित नहीं किया जा सकता है)।

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

+0

यह 3 सिस्टम कॉल क्यों लेगा? पाइप के बफर भरने पर एक अंधेरा लिखना() 'कॉल अवरुद्ध हो जाएगा। यदि प्रत्येक थ्रेड को केवल अपनी पाइप को सुनने की ज़रूरत है, तो आप 'पोल()' को भी छोड़ सकते हैं, बस पढ़ने के लिए 'पढ़ने() ' – Hasturkun

+2

ओपी के लिए प्रतीक्षा कर रहे हैं ओपी ने विशेष रूप से कहा है कि वह कई पाइपों की प्रतीक्षा करने के लिए मतदान() का उपयोग कर रहा है एक उपभोक्ता धागा। –

+0

मुझे एक फ़ाइल (/ dev/ttySxx धारावाहिक) * को पढ़ने और लिखना है और * किसी अन्य थ्रेड से कमांड का जवाब देने में सक्षम होना चाहिए। अवरोधन सवाल से बाहर है। अगर मैं उदाहरण के लिए सीरियल पर 10 मेगाबाइट लिखता हूं तो मैं इसे समाप्त होने तक इंतजार नहीं कर सकता अगर आवेदन मुझे बताता है कि वह स्थानांतरण को रद्द करना चाहता है। इसलिए दो गैर-अवरुद्ध फाइलें जिनके लिए मैं मतदान करता हूं: एक धारावाहिक बंदरगाह के लिए और एक आदेश प्राप्त करने के लिए। –

1

मापें और आपको पता चलेगा। पाइप के साथ पूर्ण प्रक्रियाएं बहुत सारे अनुप्रयोगों के लिए पर्याप्त हल्के हैं। अन्य अनुप्रयोगों को कुछ हल्के वजन की आवश्यकता होती है, जैसे ओएस थ्रेड्स (कई यूनिक्स ऐप्स के लिए पथ्रेड लोकप्रिय विकल्प है), या सुपरलाइटवेट, उपयोगकर्ता-स्तरीय थ्रेड्स पैकेज की तरह जो कभी भी I/O को संभालने के अलावा कर्नेल मोड में नहीं जाता है। जबकि निश्चित रूप से जानने का एकमात्र तरीका मापना है, पाइप शायद कुछ दस धागे तक पर्याप्त हैं, जबकि आप शायद कुछ हज़ारों धागे तक पहुंचने के बाद उपयोगकर्ता स्तर के धागे चाहते हैं। वास्तव में जहां आज के कोड का उपयोग करके सीमाएं खींची जानी चाहिए, मुझे नहीं पता। अगर मैं जानना चाहता था, मैं उपाय होगा :-)

+0

मुझे लगता है कि मैं उलझन में हूँ। मुझे लगता है कि लिनक्स का एनपीटीएल कार्यान्वयन कर्नेल-स्तर है। क्या glibc उस पर शीर्ष पर उपयोगकर्ता-स्तरीय कार्यान्वयन प्रदान करता है? –

+0

@ वेई: मेरी गलती। संपादित। –

0

तुम भी socketpair, जो eventfd की तुलना में अधिक पोर्टेबल है, क्योंकि यह POSIX है इस्तेमाल कर सकते हैं।

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