एक धागे और एक फाइबर के बीच अंतर क्या है?


187

एक धागे और एक फाइबर के बीच अंतर क्या है? मैंने माणिक से फाइबर के बारे में सुना है और मैंने पढ़ा है कि वे अन्य भाषाओं में उपलब्ध हैं, क्या कोई मुझे सरल शब्दों में समझा सकता है कि एक धागे और फाइबर के बीच अंतर क्या है।

जवाबों:


162

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

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

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


7
क्या समानांतर में तंतुओं को निष्पादित करने के लिए कई थ्रेड्स का उपयोग करने का कोई तरीका है?
बारादे Bar

2
@ जैसन, जब आप ~ ~ फाइबर के साथ वर्तमान निष्पादन पथ केवल तब बाधित होता है जब फाइबर का निष्पादन होता है "और" फाइबर हमेशा अच्छी तरह से परिभाषित स्थानों में शुरू और बंद हो जाते हैं इसलिए डेटा अखंडता एक मुद्दे से बहुत कम है ", क्या आपका मतलब है कि चर साझा करते समय, हमें "लॉकिंग मैकेनिज्म" और वाष्पशील चर का उपयोग करने की आवश्यकता नहीं है? या क्या आपका मतलब है कि हमें अभी भी उन चीजों को करने की ज़रूरत है?
पचेरियर

@ बाराडे यह एक दिलचस्प सवाल है, क्या आपको इसका जवाब मिला?
मयूर

57

थ्रेड्स पूर्व-खाली शेड्यूलिंग का उपयोग करते हैं , जबकि फाइबर सहकारी शेड्यूलिंग का उपयोग करते हैं

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

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

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


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

43

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

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

(एक ही शब्द के लिए अन्य उपयोग हो सकते हैं; जैसा कि कहा गया है, यह Win32 की परिभाषा है।)


37

पहले मैं पृष्ठभूमि सामग्री के रूप में प्रक्रियाओं और थ्रेड्स के बीच अंतर के इस स्पष्टीकरण को पढ़ने की सिफारिश करूंगा ।

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

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

मॉडर्न ऑपरेटिंग सिस्टम्स में सेक्शन 11.4 "विंडोज विस्टा में प्रोसेस एंड थ्रेड्स", टैनानबाउम टिप्पणी:

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


4
यह सबसे पूर्ण उत्तर है।
बर्नार्ड

12

ध्यान दें कि थ्रेड्स और फाइबर के अलावा, विंडोज 7 उपयोगकर्ता-मोड निर्धारण का परिचय देता है :

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

थ्रेड्स, फाइबर और यूएमएस के बारे में अधिक जानकारी डेव प्रॉबर्ट: इनसाइड विंडोज 7 - यूजर मोड शेड्यूलर (यूएमएस) को देखकर उपलब्ध है ।


7

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


7

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

कुछ उपयोगी लिंक जो यह बताते हैं कि मैंने शायद बेहतर किया:


7

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

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


3

Win32 फाइबर की परिभाषा वास्तव में "ग्रीन थ्रेड" की परिभाषा है जो कि सन माइक्रोसिस्टम्स में स्थापित है। उपयोगकर्ता कोड / थ्रेड-लाइब्रेरी नियंत्रण के तहत उपयोगकर्ता स्पेस में निष्पादित थ्रेड को किसी प्रकार के थ्रेड पर शब्द फाइबर को बर्बाद करने की आवश्यकता नहीं है।

निम्नलिखित टिप्पणियों पर तर्क को स्पष्ट करने के लिए:

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

हमें यह मान लेना चाहिए कि प्रक्रियाएं धागे से बनी होती हैं और धागे धागे से बने होने चाहिए। मन में उस तर्क के साथ, धागे के अन्य प्रकार के लिए फाइबर का उपयोग करना गलत है।


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