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