एक थ्रेड काम कैसे करता है?


15

जब आप एक धागा सोते हैं , तो वास्तव में क्या चल रहा है?

मैं देखता हूं कि एक थ्रेड को "एक निश्चित समय के लिए वर्तमान थ्रेड को रोक देता है" । लेकिन यह कैसे काम करता है?

हाउ थ्रेड। स्लीप () के अनुसार आंतरिक रूप से काम करता है और थ्रेड। स्लीप वास्तव में कैसे काम करता है? :

  • नींद की अवधि कुछ सिस्टम-विशिष्ट ग्रैन्युलैरिटी के अधीन होगी
  • नींद अवरुद्ध है
  • थ्रेड CPU को छोड़ देता है और उसका निष्पादन रोक देता है
  • सोते समय थ्रेड CPU समय का उपभोग नहीं कर रहा है

मैं सिर्फ आंतरिक और मौलिक यांत्रिकी को समझ नहीं सकता कि यह सब क्या है।

मैं समझता हूं कि कुछ ऐसा शेड्यूलर है जिसे थ्रेड्स के बीच स्विच करने के लिए जिम्मेदार है।

सूत्रों से प्रतीत होता है कि यह OS (या हार्डवेयर?) के अनुसार भिन्न होता है और अधिकांश थ्रेड्स 1ms - 60ms या तो सीपीयू स्विच करने से पहले कुछ क्रियाओं को करने के लिए दिए जाते हैं।

लेकिन जब एक धागा सोता है (उदाहरण के लिए, कई सेकंड), यह फिर से कैसे शुरू होता है? मुझे लग रहा है कि टाइमर किसी तरह शामिल है, क्या यह मदरबोर्ड की घड़ी है? क्या यह सीपीयू क्लॉक रेट से संबंधित है?

और यहां तक ​​कि अगर एक टाइमर शामिल है, तो सीपीयू को कैसे पता चलता है जब थ्रेड पर फिर से ध्यान देने का समय है? यदि यह तैयार है तो यह देखने के लिए धागे पर लगातार जांच नहीं करनी होगी? क्या यह प्रभावी रूप से मतदान नहीं है और इसलिए सीपीयू समय का उपभोग कर रहा है?

क्या एक थ्रेड भाषा-विशिष्ट सो रही है या ओएस इसके लिए जिम्मेदार है या यह सीपीयू-विशिष्ट चीज है?

क्या कोई कृपया मुझे इस बात की व्याख्या करेगा कि शेड्यूलर जैसी चीजों की बुनियादी व्याख्या और सीपीयू इस सब के दौरान क्या कर रहा है?


2
स्लीपिंग थ्रेड को जागृत करना एक बार फिर समयबद्ध रुकावटों द्वारा काम करता है, आमतौर पर एक बाधा घड़ी द्वारा उत्पन्न होता है, जो सीपीयू के मुख्य भाग से अलग एक हार्डवेयर घटक होता है जो निर्देशों को संसाधित करता है। जो मतदान की जरूरतों को टालता है। हो सकता है कि Quora पर यह स्पष्टीकरण कुछ बातों को स्पष्ट करे: quora.com/How-does-threading-work-at-CPU-level
Doc Brown

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

जवाबों:


11

उस कार्यक्रम के भीतर कोड की तुलना में एक कार्यक्रम चलाने में बहुत अधिक शामिल है।

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

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


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

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

7

जैसा कि डॉक्टर ब्राउन ने एक टिप्पणी में उल्लेख किया है, व्यवधान कुंजी हैं, न कि केवल सोने के लिए।

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

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

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

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

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

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


यह "आधुनिक" ऑपरेटिंग सिस्टम का काम करने का तरीका है। पुराने ऑपरेटिंग सिस्टम में, जैसे कि विंडोज़ 3 या मैक ओएस पर ओएस एक्स से पहले एक प्रक्रिया को ऑपरेटिंग सिस्टम पर उपज () नियंत्रण करना पड़ता था। दुर्भाग्य से अगर कोई प्रोग्राम किसी लूप में फंस जाता है या किसी तरह गतिरोध हो जाता है, तो इससे कभी भी नियंत्रण नहीं हो सकता है, और पूरा सिस्टम लटका रहेगा।
david25272

@ david25272 - मुझे लगता है कि मैं "पुराने" के बजाय "सरल" शब्द का उपयोग करूंगा, क्योंकि 1960 के दशक से सिस्टम थे जो प्रीमेप्टिव मल्टीटास्किंग करते थे। और जब यह सच है कि सहकारी मल्टीटास्किंग के लिए प्रोसेसर के अपने नियंत्रण को छोड़ने के लिए सक्रिय थ्रेड की आवश्यकता होती है (आमतौर पर एक अवरुद्ध प्रणाली कॉल करके, एक स्पष्ट उपज के बजाय), मुझे विश्वास नहीं होता कि कई सामान्य-उद्देश्य प्रोग्रामर हैं आज जो एक सहकारी सूत्रण मॉडल के साथ एक ओएस का उपयोग करते हैं।
kdgregory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.