2011-03-23 8 views
8

हाल ही में मैं सोच रहा हूं: वे केवल एक धागे में कई 'धागे' को कैसे कार्यान्वित करते हैं?केवल एक थ्रेड में चल रहे कई 'धागे' को कार्यान्वित करने के लिए

मेरा मतलब है, वे कोड के कई समानांतर चलने वाले टुकड़ों को केवल एक थ्रेड में कैसे कार्यान्वित करते हैं? वे 'धागे' की स्थिति को कैसे बचाते हैं, एक बाधा उत्पन्न करते हैं और सीपीयू को अगले में पास करते हैं?

मुझे लगता है कि स्कैला-अभिनेता इसे कार्यान्वित करते हैं। पर कैसे?

इसका उत्तर JVM या C के लिए दिया जा सकता है, इससे कोई फर्क नहीं पड़ता। मैं वास्तव में इसके सिद्धांत को सीखना चाहता हूं।

+1

कोरआउट, हुह? –

उत्तर

1

ऐसा करने का एक तरीका यह है कि उपयोगकर्ता कोड में थ्रेडिंग पैकेज स्वयं को कर्नेल से कुछ प्रकार के टाइमर इंटरप्ट के लिए पंजीकृत करता है। जब भी यह इस तरह के बाधा प्राप्त करता है, तो यह कर्नेल को सभी कर्नेल धागे के निष्पादन को रोकने के लिए कह सकता है जो स्वयं कई अलग-अलग धागे चला रहे हैं। उन थ्रेडों में से प्रत्येक के लिए, टाइमर इंटरप्ट कोड उन धागे के लिए ढेर का निरीक्षण कर सकता है, एक सहायक स्थान में महत्वपूर्ण जानकारी (रजिस्टर्स, स्टैक पॉइंटर, प्रोग्राम काउंटर इत्यादि) रिकॉर्ड कर सकता है, फिर सिम्युलेट किए गए किसी अन्य के लिए संग्रहीत जानकारी में लोड हो सकता है धागे उस वास्तविक धागे पर चल रहे हैं। फिर यह सिम्युलेटेड थ्रेड चलाने वाले कर्नेल थ्रेड को फिर से शुरू कर सकता है। इस तरह, आप एकल कर्नेल थ्रेड पर चल रहे एकाधिक थ्रेड के बीच संदर्भ स्विचिंग अनुकरण कर सकते हैं।

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

यह सिर्फ एक शुरुआत है - यहां कई अन्य विवरण हैं (क्या होगा यदि अनुरूपित धागे में से एक ब्लॉकिंग I/O ऑपरेशन करने का प्रयास करता है? आप केवल कर्नेल थ्रेड को अवरुद्ध नहीं कर सकते हैं, क्योंकि इससे सभी को रोक दिया जाएगा नकली धागे!), लेकिन यह विचार का सारांश है।

3

क्या आपका मतलब जावा में किसी एक्जिक्यूटर्स सेवा या अनुसूचित एक्सेलसर्स सेवा में कार्य करना है?

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

यदि आप अधिक जानकारी जानना चाहते हैं तो आपको कोड को दिलचस्प पढ़ने में मिल सकता है।

+0

मैं अधिक निष्पक्षता के साथ कुछ सोच रहा था, जैसे कि टाइम स्लाइसिंग और .. –

+0

@ जोस लील, क्या आप धागे की तरह हैं? जब आपके पास थ्रेड/थ्रेड पूल और धागे में हल्के वजन वाले कार्य होते हैं जो पहले से ही एक सीपीयू साझा कर सकते हैं, तो थ्रेड के अंदर धागे आपको क्या प्राप्त करेंगे? –

2

उपयोग coroutines

+0

मुझे लगता है कि प्रश्न 1 कर्नेल थ्रेड पर एन थ्रेड के प्रीपेप्टिव मल्टीथ्रेडिंग को कार्यान्वित करने के तरीके के बारे में अधिक है। – templatetypedef

6

मुझे लगता है कि तुम यहाँ coroutines और green threads भ्रमित कर रहे हैं।

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

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

4

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

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

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

2

Akka library अभिनेता मॉडल का वास्तव में अच्छा कार्यान्वयन है। यह एक बहुत अच्छा सीधा जावा एपीआई है (स्कैला के अलावा), और the doc is pretty good

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