2012-05-06 13 views
7

बेहतर क्या है: बनाम थ्रेड का चयन करें? लिनक्स में

मैं एक ऑटोक्लिकर बनाना चाहता हूं जिसमें एक कुंजी दबाए जाने पर सक्षम/अक्षम फ़ंक्शन होगा। जाहिर है, समांतर में चलने वाली 2 चीजें होनी चाहिए (क्लिकर स्वयं, और सक्षम/अक्षम फ़ंक्शन)

प्रत्येक कार्यान्वयन के विपक्ष और पेशेवर क्या हैं: ऑटो थ्रिलिंग फ़ंक्शन और अन्य मुख्य थ्रेड को संभालने वाले थ्रेड का उपयोग करना (सक्षम/अक्षम आदि के लिए ...) या syscall का उपयोग करके इनपुट/कीबोर्ड के लिए चयन करें और प्रतीक्षा करें?

+2

आप इसे किसी भी तरह से कर सकते हैं। क्या माप "बेहतर" परिभाषित करते हैं? –

+1

मैं सिर्फ यह जानना चाहता हूं कि प्रत्येक विकल्प – Jah

+1

@Jah के फायदे क्या हैं: फिर आपको यह पूछना चाहिए था कि, "बेहतर" कहने के बजाय। –

उत्तर

7

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

अधिकांश लोग थ्रेड का उपयोग सरल पाते हैं क्योंकि अधिकांश कोड सामान्य एकल थ्रेडेड कोड जैसा दिखता है। एकमात्र मुश्किल हिस्सा उन कुछ स्थानों पर है जहां आपको म्यूटेक्स या अन्य सिंक्रनाइज़ेशन तंत्र के माध्यम से इंटरथ्रेड संचार की आवश्यकता होती है।

आपके विशिष्ट मामले में ऐसा लगता है कि आपको केवल थोड़ी सी थ्रेड की आवश्यकता होगी, इसलिए मैं थ्रेड का उपयोग करके सरल प्रोग्रामिंग मॉडल के लिए जाऊंगा।

+5

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

1

आपके द्वारा किए जा रहे काम की मात्रा को देखते हुए, इससे कोई फर्क नहीं पड़ता।

उच्च प्रदर्शन अनुप्रयोगों के लिए, एक अंतर है। इन मामलों में, आपको एक साथ कई हज़ार कनेक्शन संभालने की आवश्यकता है; ऐसे मामलों में, आप नए धागे के लिए नए कनेक्शन बंद करते हैं।

कई हजार धागे बनाना महंगा है, इसलिए दक्षता के लिए चयन का उपयोग किया जाता है। वास्तव में kqueue या epoll जैसी विभिन्न तकनीकों का उपयोग इष्टतम स्विचिंग के लिए किया जाता है।

मुझे लगता है कि इससे कोई फर्क नहीं पड़ता, क्योंकि आप केवल एक बार धागा बनाने जा रहे हैं और आवेदन के जीवनकाल के लिए बिल्कुल दो धागे चल रहे हैं।

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