2010-11-10 18 views
31

क्या कोई प्रीपेप्टिव थ्रेडिंग मॉडल और गैर प्रीपेप्टिव थ्रेडिंग मॉडल के बीच अंतर को समझा सकता है?प्रीपेप्टिव थ्रेड्स बनाम गैर प्रीपेप्टिव थ्रेड्स

मेरी समझ के अनुसार:

  • गैर पूर्वक्रमिक सूत्रण मॉडल: एक बार एक धागा शुरू कर दिया है यह या रोका नहीं जा सकता जब तक धागा अपने कार्य को पूरा कर लिया है नियंत्रण अन्य थ्रेड को हस्तांतरित नहीं किया जा सकता है।
  • प्रीपेप्टिव थ्रेडिंग मॉडल: रनटाइम को किसी भी समय एक थ्रेड से दूसरे में नियंत्रण और हाथ नियंत्रण करने की अनुमति है। लोअर प्राथमिकता धागे पर उच्च प्राथमिकता धागे को प्राथमिकता दी जाती है।

किसी कृपया:

  1. के बारे में बताएं, तो समझ सही है।
  2. दोनों मॉडलों के फायदे और नुकसान बताएं।
  3. उपयोग करने के लिए एक उदाहरण वास्तव में सहायक क्या होगा।
  4. यदि मैं किसी भी विकल्प का उल्लेख किए बिना लिनक्स (सिस्टम वी या पर्थ्रेड) में कोई थ्रेड बना देता हूं (क्या कोई है ??) डिफ़ॉल्ट रूप से इस्तेमाल किया गया थ्रेडिंग मॉडल प्रीपेप्टिव थ्रेडिंग मॉडल है?

उत्तर

27
  1. नहीं, आपकी समझ पूरी तरह से सही नहीं है। गैर-प्रीपेप्टिव (उर्फ सहकारी) थ्रेड आमतौर पर अन्य धागे को खत्म करने से पहले चलाने के लिए मैन्युअल रूप से उपज उत्पन्न करते हैं (हालांकि यह होने के लिए yield() (या जो कुछ भी) को कॉल करने के लिए उस धागे पर है।
  2. थ्रेडिंग को रोकना आसान है। सहकारी धागे कम ओवरहेड है।
  3. आम तौर पर प्रीemptive का उपयोग करें। यदि आपको लगता है कि आपके डिज़ाइन में बहुत सारे थ्रेड-स्विचिंग ओवरहेड हैं, तो सहकारी धागे एक संभावित अनुकूलन होंगे। कई (अधिकांश?) स्थितियों, हालांकि यह न्यूनतम भुगतान के साथ काफी बड़ा निवेश होगा।
  4. हां, डिफ़ॉल्ट रूप से आपको प्रीपेप्टिव थ्रेडिंग मिल जाएगी, हालांकि यदि आप सीटीएचड्स पैकेज के लिए चारों ओर देखते हैं, तो यह सहकारी थ्रेडिंग का समर्थन करता है। कुछ पर्याप्त लोग (अब) चाहते सहकारी धागे कि मुझे यकीन है कि यह पिछले एक दशक हालांकि भीतर अपडेट किए जाने के नहीं कर रहा हूँ ...
+2

उपज() के बारे में सिर्फ एक नोट: लिनक्स पर इसका उपयोग न करें क्योंकि इसका परिणाम भयानक प्रदर्शन में होता है। एक उपजित थ्रेड थ्रेड शेड्यूल के बहुत पीछे धकेल दिया जाता है, इसलिए थ्रेड तब तक निर्धारित नहीं होगा जब तक कि पूरे सिस्टम में बाकी सब कुछ * का मौका न हो। –

+0

मेरी समझ में जब मुख्य प्रक्रिया दो धागे बनाती है, तो वे समानांतर में निष्पादित होंगे। तो क्या "गैर प्रीपेप्टिव थ्रेडिंग मॉडल" निष्पादन को बनाता है, (finish_thread_1) -> (finish_thread_2) -> मुख्य()? मेरा मतलब है कि थ्रेड 1 समाप्त होने के बाद पूरी तरह से थ्रेड 2 पूरा होने के बाद शुरू होगा, मुख्य() विधि कॉल करेगी। क्या ये सही है? यदि ऐसा है तो "गैर प्रीपेप्टिव थ्रेड" का उपयोग क्या है? – rakeshNS

+0

@ राकेशंस: गैर-प्रीपेप्टिव (सहकारी) धागे का मतलब है कि एक धागा तब तक चलता है जब तक कि यह कुछ फ़ंक्शन को कॉल न करे जो स्विच को किसी अन्य थ्रेड पर अनुमति देता है। कुछ मामलों में, यह एक स्पष्ट 'उपज' समारोह है। दूसरों में, अन्य धागे चलाने की इजाजत देना कुछ अन्य कार्यों में निहित है।उदाहरण के लिए, 16-बिट विंडोज़ में, जब आप 'GetMessage' कहलाते हैं, तो अन्य थ्रेड/प्रक्रियाएं चल सकती हैं (उन्हें प्रक्रिया माना जाता था, लेकिन वे सभी एक पता स्थान साझा करते थे ...) –

13

गैर-प्रीपेप्टिव धागे को सहकारी धागे भी कहा जाता है। इनमें से एक उदाहरण पीओई (पर्ल) है। एक और उदाहरण क्लासिक मैक ओएस (ओएस एक्स से पहले) है। सहकारी धागे का सीपीयू का विशेष उपयोग तब तक होता है जब तक वे इसे नहीं देते। शेड्यूलर फिर चलाने के लिए एक और धागा उठाता है।

प्रीपेप्टिव थ्रेड स्वेच्छा से सीपीयू को सहकारी लोगों की तरह छोड़ सकते हैं, लेकिन जब वे नहीं करते हैं, तो यह उनसे लिया जाएगा, और शेड्यूलर एक और धागा शुरू करेगा। POSIX & SysV धागे इस श्रेणी में आते हैं।

सहकारी धागे के बड़े फायदे अधिक दक्षता (कम से कम एकल मशीनों पर) और समेकन की आसान हैंडलिंग हैं: जब आप नियंत्रण प्राप्त करते हैं तो यह केवल तब मौजूद होता है, इसलिए लॉकिंग की आवश्यकता नहीं होती है।

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

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

+0

Win16 भी सहकारी थ्रेडिंग देना चाहिए। –

+1

@johnc मैंने आपके संपादन को वापस ले लिया है। "अस्तित्व" का उद्देश्य वहां होता है-समरूपता (एक साथ चलने वाले एकाधिक थ्रेड) तभी मौजूद होते हैं जब आप स्पष्ट रूप से उपज द्वारा चलाए जाने वाले किसी अन्य धागे को चलाने की अनुमति देते हैं। "निकास" समझ में नहीं आता है। मुझे यह भी यकीन नहीं है कि आपने क्यों बदला * * * * नहीं है * ... – derobert

+1

@derobet यह ठीक है। यह एक सुझाव दिया गया था जो उस समय समझ में आता था, हालांकि सुझाव में एक टाइपो के कारण, मैंने इसे फिर से संपादित किया। उस समय मैंने 'उपज' शब्द को 'अस्तित्व' के साथ 'निकास' शब्द से जोड़ा था। ईमानदार होने के लिए, यह टाइपो था; 'नहीं है -> नहीं है' (या इसी तरह) जिसने मुझे सुझाव स्वीकार करने और संपादित करने का कारण बताया। मैं क्षमा चाहता हूं कि सही वर्तनी के लिए मेरे जुनून ने मुझे आपके जवाब को गड़बड़ कर दिया – johnc

5

आप गैर रिक्तिपूर्व यह है कि इस प्रक्रिया मतलब यह नहीं है ऐसा नहीं करता है का उपयोग करते हैं जब प्रक्रिया I/O की प्रतीक्षा कर रही है तो संदर्भ स्विच करता है। प्रेषक शेड्यूलिंग मॉडल के अनुसार एक और प्रक्रिया का चयन करेगा। इस मॉडल में हमें प्रक्रिया पर भरोसा करना है।

गैर रिक्तिपूर्व:

1.less संदर्भ स्विच = सिर पर कम कि गैर रिक्तिपूर्व मॉडल

2.It को संभालने के लिए है क्योंकि यह पर संभाला जा सकता है आसान में समझदार हो सकता है एकल-कोर प्रोसेसर

रिक्तिपूर्व:

लाभ:

1.In इस मॉडल हम प्राथमिकता दी जाती है हमें अधिक नियंत्रण में मदद कर सकते प्रक्रिया

चलाने पर

2. हम देख सकते हैं बेहतर संगामिति

3. हम एक प्रणाली संभाल कर सकते हैं पूरे सिस्टम को रोके बिना फोन

नुकसान:

1. हम लॉक करने के लिए जटिल एल्गोरिथ्म की जरूरत है और हम महत्वपूर्ण अनुभाग समस्या है कि

2. अक्सर एक बड़ा ओवरहेड जिसे हमें

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