टास्क मैनेजर कह रहा है कि सिस्टम एक हज़ार धागे के साथ चल रहा है


17

मैंने टास्क मैनेजर खोला और "सिस्टम" क्षेत्र के तहत देखा और देखा:

सूत्र: 1337

चूंकि मेरे पास हाइपर-थ्रेडिंग के साथ एक डुअल-कोर प्रोसेसर उपलब्ध है (जिसका अर्थ है चार धागे), 1000 + थ्रेड्स कैसे संभव है जब मेरा प्रोसेसर केवल चार होना चाहिए?


3
क्या ऐसा नहीं है कि वे इसे हाइपर -थ्रेडिंग क्यों कहते हैं ? :)
एक CVn

9
जी, क्या उन्होंने आखिरकार "मल्टीप्रोग्रामिंग" का आविष्कार किया है ??? (यह 1967 है, ठीक है?)
डैनियल आर हिक्स

10
क्या किसी ने सिर्फ 1337 होने के लिए संख्या बदल दी?
Erty Seidohl

11
चार डेस्क वाली कंपनी में 1337 कर्मचारी कैसे हो सकते हैं? आसान; कर्मचारी डेस्क का उपयोग करते हुए बदल जाते हैं
एरिक लिपर्ट

जवाबों:


50

सरल उत्तर यह है कि सभी धागे एक साथ निष्पादित नहीं होते हैं। फुलर स्पष्टीकरण के लिए, पर पढ़ें।

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

हालाँकि, कार्य अनुसूचक वास्तव में अनुप्रयोगों (प्रक्रियाओं) को शेड्यूल नहीं करता है, यह थ्रेड्स को शेड्यूल करता है । प्रत्येक एप्लिकेशन में कम से कम एक धागा होता है, लेकिन संभावित रूप से संबंधित या स्वतंत्र भागों में विभाजित करने के लिए बड़ी संख्या में थ्रेड्स का उपयोग कर सकता है। उदाहरण के लिए, एप्लिकेशन के लिए एक थ्रेड होना आम बात है जो उपयोगकर्ता इंटरफ़ेस को हैंडल करता है, और जब उपयोगकर्ता संभावित रूप से लंबे समय तक चलने वाला ऑपरेशन शुरू करता है, तो एक और थ्रेड बनाने के लिए (जो मुद्रण जैसी चीजें हो सकती हैं, स्प्रेडशीट को पुन: परिकलित करना, एक विकास का वातावरण बनाना) एक प्रतीक देखने, आदि आदि)। कुछ प्रोग्रामिंग वातावरण थ्रेड की कुछ मात्रा को अदृश्य-से-प्रोग्रामर से परिचित कराते हैं; उदाहरण के लिए, Java और .NET कचरा संग्रहण कर सकते हैंएक अलग थ्रेड में, जो प्रोग्रामर के तत्काल नियंत्रण से बाहर है। कुछ प्रोग्राम जल्दी से कई थ्रेड बनाते हैं और उन्हें पूल करते हैं, क्योंकि नए थ्रेड्स बनाना एक तुलनात्मक रूप से महंगा ऑपरेशन है (इसलिए आप जरूरी नहीं कि हर बार एक धागा बनाना चाहते हों)। कुछ भी जो पूर्वावलोकन करता है, आमतौर पर एक अलग थ्रेड में किया जाता है, इसलिए पूर्वावलोकन किए जाने के दौरान UI का शेष उत्तरदायी रहता है। और इसी तरह। एक साथ लिया गया, इसका मतलब यह है कि किसी भी समय सिस्टम पर थ्रेड्स की संख्या आसानी से कई बार हो सकती है।

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

कार्य प्रबंधक में आप जो थ्रेड काउंट देखते हैं, वह इनमें से किसी भी राज्य में थ्रेड्स की कुल संख्या है। उदाहरण के लिए, मैं जिस विंडोज 7 सिस्टम को टाइप कर रहा हूं, उसमें इस समय लगभग 70 प्रक्रियाएं शुरू हुई हैं, लेकिन लगभग 900 धागे हैं। विभिन्न कार्यों को संभालने के लिए सभी पृष्ठभूमि प्रक्रियाओं के साथ और कैसे वे संभवतः प्रत्येक धागे की एक भीड़ में उप-विभाजित होते हैं, यह एक अपमानजनक संख्या नहीं है।

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

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

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


11
मुझे प्यार है "विशेष रूप से उपयोगकर्ता इनपुट असाधारण धीमा है"
जॉन ड्वोरक

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

1
स्पष्टीकरण पूछने के लिए टिप्पणियाँ अच्छी हैं, लेकिन वे विस्तारित चर्चा के लिए अनुकूल नहीं हैं, और कुछ बिंदु पर पढ़ने के लिए कठिन हो जाते हैं। क्या आप इसके बजाय सुपर यूजर चैट पर ले जा सकते हैं ? धन्यवाद।
बजे

1
@ एसएलएचके मैंने एक कमरा बनाया, लेकिन इन टिप्पणियों में चर्चा को स्थानांतरित करने का कोई तरीका नहीं मिल सका, जो अच्छा होगा। क्या ऐसा कुछ है जिसे आप मैन्युअल रूप से मॉडरेटर के रूप में कर सकते हैं? chat.stackexchange.com/rooms/9547/…
एक CVn

1
दुर्भाग्यवश नहीं। एक स्वचालित माइग्रेशन प्रक्रिया है जिसे मैन्युअल रूप से ट्रिगर नहीं किया जा सकता है, लेकिन हम टिप्पणियों को चैट रूम में स्थानांतरित नहीं कर सकते हैं। हम यहाँ टिप्पणी को कुछ समय के लिए रहने देंगे, लेकिन मैं दूसरों को आपके द्वारा बनाए गए चैट रूम में चर्चा के लिए प्रोत्साहित करूंगा।
6'13

18

1037 वाहनों के साथ चार लेन वाले राजमार्ग के बारे में सोचें।

आपके ओएस को बहुत सारी सेवाओं के लिए काम करने के लिए बहुत अधिक चलने वाली प्रक्रियाओं की आवश्यकता है। यहां तक ​​कि सबसे सरल चित्रमय कार्यक्रमों के लिए मल्टीथ्रेडेड प्रोग्रामिंग की आवश्यकता होगी। जब आप सोचते हैं कि आपके बहुत सारे प्रोग्राम खुल गए हैं तो आपको लगता है कि कंप्यूटिंग पावर संसाधनों को साझा करने की आवश्यकता है।

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


8
"यहां तक ​​कि सबसे सरल चित्रमय कार्यक्रमों के लिए मल्टीथ्रेडेड प्रोग्रामिंग की आवश्यकता होगी।" गलत। एकल-थ्रेडेड GUI अनुप्रयोगों को लिखना पूरी तरह से संभव है; विंडोज 95 तक, सभी इरादों और उद्देश्यों के लिए हर किसी ने इस तरह से किया। यह कुछ कार्यों को और अधिक जटिल बनाता है (उदाहरण के लिए, पृष्ठभूमि मुद्रण कई थ्रेड्स के साथ तुच्छ है, लेकिन एकल थ्रेडेड अनुप्रयोग में निश्चित रूप से गैर-तुच्छ है, खासकर यदि आप स्मृति के रूप में विवश हैं जैसा कि तब था), लेकिन इसमें बहुत बड़ा अंतर है " X को Y "और" X के लिए Y "की आवश्यकता है।
बजे एक CVn

8
@ माइकलकॉर्जलिंग: "विंडोज 95 तक, सभी इरादों और उद्देश्यों के लिए हर किसी ने इस तरह से किया" * - वास्तव में? यहां तक ​​कि 80 के दशक में मोटिक्स चलाने वाले निक्स सिस्टम पर?
लार्स

@LarsH अच्छा बिंदु, और एक मैं टिप्पणी में संपादित करने के लिए बहुत देर से सोचा। लेकिन यह इस बिंदु को नकारता नहीं है: अर्थात्, यह संभव है कि सिंगल-थ्रेडेड GUI एप्लिकेशन लिखना संभव हो। आपको इसके लिए मल्टीथ्रेडिंग की आवश्यकता नहीं है, हालांकि यह प्रोग्रामर पर कुछ कार्यों (काफी) को आसान बनाता है।
बजे एक CVn

@ माइकलकॉर्जलिंग: मैं मानता हूं, यह आपकी बात को नकारता नहीं है, जो एक मान्य है। (मुझे नहीं लगता कि अप्रोगो का गलत बयान या तो उनकी बात को नकार देता है।)
लार्स

एक उदाहरण के रूप में @ MichaelKjling ने जो कहा, एक प्रोग्रामिंग भाषा के रूप में Visual Basic (.NET से पहले) का कोई बहु-सूत्रण समर्थन नहीं था । सब कुछ एक ही धागे पर चलता था। यदि आप लंबे समय से चल रहे ऑपरेशन के बीच में उपयोगकर्ता इनपुट को संसाधित करना चाहते हैं, तो आप कॉल DoEventsकरेंगे, जो संदेश कतार को संसाधित करेगा - लेकिन यह एक ही थ्रेड पर किया गया था और सभी संदेशों को संसाधित होने तक लंबे समय तक चलने वाले ऑपरेशन को अवरुद्ध करेगा। । (बेशक, आप Win32 API फ़ंक्शंस को कॉल कर सकते हैं और / या अतिरिक्त प्रक्रियाएँ बना सकते हैं, लेकिन उस बिंदु पर आप निम्न-स्तरीय भाषाओं में से एक का उपयोग कर सकते हैं।)
बॉब

5

हमें अपने आप को वापस लेना चाहिए और खुद से पूछना चाहिए: एक एकल सीपीयू वाले कंप्यूटर के दो धागे कैसे हो सकते हैं?

थ्रेड्स सॉफ़्टवेयर इकाइयाँ हैं, हार्डवेयर नहीं। एक और धागा रखने के लिए, आपको बस उन वस्तुओं के लिए मेमोरी की आवश्यकता होती है जो धागे को बनाते हैं, जैसे कि डिस्क्रिप्टर संरचना और स्टैक।

ऑपरेटिंग सिस्टम कई बार थ्रेड्स के बीच स्विच करता है, जैसे कि कुछ इंटरप्ट के अंदर (जैसे टाइमर में रुकावट) या जब थ्रेड ऑपरेटिंग सिस्टम में कॉल करते हैं।

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

"हाइपरथ्रेडिंग" द्वारा भ्रमित न हों , जो किसी विशेष हार्डवेयर सुविधा के लिए इंटेल का नाम है।

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