धागे बनाम Async


82

मैं प्रोग्रामिंग के थ्रेडेड मॉडल बनाम इस अतुल्यकालिक मॉडल को वास्तव में अच्छे लेख से पढ़ रहा हूं। http://krondo.com/blog/?p=1209

हालांकि, लेख में निम्नलिखित बातों का उल्लेख है।

  1. जब भी कोई I / O हो, कार्यों के बीच स्विच करके एक async प्रोग्राम केवल एक सिंक प्रोग्राम को बेहतर बनाएगा।
  2. थ्रेड्स को ऑपरेटिंग सिस्टम द्वारा प्रबंधित किया जाता है।

मुझे याद है कि रेडी-क्यू और वेटिंग-क्यू (अन्य कतारों के बीच) के बीच टीसीबी को स्थानांतरित करके थ्रेड्स को ऑपरेटिंग सिस्टम द्वारा प्रबंधित किया जाता है। इस मामले में, थ्रेड्स या तो इंतजार करने में समय बर्बाद नहीं करते हैं?

उपर्युक्त के प्रकाश में, थ्रेडेड प्रोग्रामों पर एस्किंस कार्यक्रमों के क्या फायदे हैं?


5
नहीं, मेरा मतलब था थ्रेडेड बनाम एसिंक्स। मैंने केवल एक बिंदु का उल्लेख किया क्योंकि यह कुछ ऐसा था जिसे मैंने लेख से समझा था।

जवाबों:


78
  1. ऐसा कोड लिखना बहुत मुश्किल है जो थ्रेड सुरक्षित हो। एसिंक्रोनस कोड के साथ, आप ठीक से जानते हैं कि कोड एक कार्य से अगली में कहां स्थानांतरित होगा और दौड़ की स्थिति कितनी कठिन है।
  2. थ्रेड्स उचित मात्रा में डेटा का उपभोग करते हैं क्योंकि प्रत्येक थ्रेड को अपना स्टैक होना चाहिए। Async कोड के साथ, सभी कोड एक ही स्टैक को साझा करते हैं और स्टैक को कार्यों के बीच स्टैक को लगातार खोल देने के कारण छोटा रखा जाता है।
  3. थ्रेड्स OS संरचनाएँ हैं और इसलिए प्लेटफ़ॉर्म के समर्थन के लिए अधिक मेमोरी हैं। अतुल्यकालिक कार्यों के साथ ऐसी कोई समस्या नहीं है।

12
थोड़ा विस्तार करने के लिए: 1. थ्रेडेड कोड का I / O हिस्सा अपेक्षाकृत आसान है, लेकिन दौड़ की स्थिति के बिना थ्रेड्स (ताले / कतारों / आदि का उपयोग करके) के बीच साझा स्थिति को प्रबंधित करना मुश्किल है। एक Async मॉडल का उपयोग करने का मतलब है कि आपने कम समय में एक ही समय पर चल रहा है, इसलिए दौड़ को आसानी से टाला जाता है। 2/3। प्रत्येक थ्रेड स्टैक के कम से कम एक मेमोरी पेज (4KB या 8KB आमतौर पर) का उपभोग करेगा, साथ ही उस थ्रेड की स्थिति से संबंधित अन्य डेटा संरचनाओं के लिए कुछ अज्ञात मात्रा में मेमोरी।
डोबेस वैंडर्मर

12

धागे बनाने के दो तरीके हैं:

तुल्यकालिक सूत्रण - माता-पिता एक (या अधिक) बच्चे के धागे बनाता है और फिर प्रत्येक बच्चे को समाप्त करने के लिए इंतजार करना चाहिए। सिंक्रोनस थ्रेडिंग को अक्सर फोर्क-जॉइन मॉडल के रूप में जाना जाता है ।

एसिंक्रोनस थ्रेडिंग - माता-पिता और बच्चे एक दूसरे के समवर्ती / स्वतंत्र रूप से चलाते हैं। बहुस्तरीय सर्वर आमतौर पर इस मॉडल का अनुसरण करते हैं।

संसाधन - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720


7
  1. मान लें कि आपके पास 2 कार्य हैं, जिसमें कोई भी IO (मल्टीप्रोसेसर मशीन पर) शामिल नहीं है। इस स्थिति में थ्रेड आउट Asyncform। क्योंकि सिंगल थ्रेडेड प्रोग्राम की तरह Async आपके कार्यों को क्रम में निष्पादित करता है। लेकिन थ्रेड्स दोनों कार्यों को एक साथ निष्पादित कर सकते हैं।

  2. मान लें कि आपके पास 2 कार्य हैं, जिसमें IO शामिल हैं (मल्टीप्रोसेसर मशीन पर)। इस स्थिति में दोनों Async और थ्रेड्स कम या ज्यादा एक ही प्रदर्शन करते हैं (प्रदर्शन कोर की संख्या, शेड्यूलिंग, कार्य को गहन करने की प्रक्रिया के आधार पर भिन्न हो सकते हैं)। इसके अलावा, Async मल्टी थ्रेडेड प्रोग्राम पर प्रोग्राम की कम मात्रा, कम ओवरहेड और कम जटिल लेता है।

यह काम किस प्रकार करता है? थ्रेड 1 कार्य 1 को निष्पादित करता है, क्योंकि यह IO की प्रतीक्षा कर रहा है, इसे IO प्रतीक्षा कतार में ले जाया जाता है। इसी तरह थ्रेड 2 टास्क 2 को निष्पादित करता है, क्योंकि इसमें IO भी शामिल है, इसे IO को प्रतीक्षा कतार में ले जाया जाता है। जैसे ही यह IO अनुरोध हल हो जाता है, इसे तैयार कतार में ले जाया जाता है ताकि अनुसूचक निष्पादन के लिए थ्रेड को शेड्यूल कर सके।

Async टास्क 1 को कार्यान्वित करता है और इसे IO पूरा करने के लिए इंतजार किए बिना इसे टास्क 2 के साथ जारी रखता है फिर यह दोनों टास्क के IO को पूरा करने के लिए इंतजार करता है। यह IO पूरा होने के क्रम में कार्यों को पूरा करता है।

वेब सेवा कॉल, डेटाबेस क्वेरी कॉल आदि कार्यों के लिए सबसे अच्छा अनुकूल Async, प्रक्रिया गहन कार्यों के लिए थ्रेड्स।

नीचे दिए गए वीडियो के बारे में बताते हैं Async vs Threaded modelऔर यह भी कि कब उपयोग करना है, https://www.youtube.com/watch?v=kdzL3r-yJZY

आशा है कि यह उपयोगी है।


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

4

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

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

ध्यान दें कि एकल-प्रोसेसर प्रणाली पर, अतुल्यकालिक कार्यक्रम जैसा कि यहां परिभाषित किया गया है, थ्रेडेड प्रोग्राम के बराबर हैं।


0

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


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

0

http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling देखें

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.