एक धागे और एक फाइबर के बीच अंतर क्या है? मैंने माणिक से फाइबर के बारे में सुना है और मैंने पढ़ा है कि वे अन्य भाषाओं में उपलब्ध हैं, क्या कोई मुझे सरल शब्दों में समझा सकता है कि एक धागे और फाइबर के बीच अंतर क्या है।
एक धागे और एक फाइबर के बीच अंतर क्या है? मैंने माणिक से फाइबर के बारे में सुना है और मैंने पढ़ा है कि वे अन्य भाषाओं में उपलब्ध हैं, क्या कोई मुझे सरल शब्दों में समझा सकता है कि एक धागे और फाइबर के बीच अंतर क्या है।
जवाबों:
सबसे सरल शब्दों में, थ्रेड्स को आमतौर पर प्रीमेप्टिव माना जाता है (हालांकि यह हमेशा सही नहीं हो सकता है, ऑपरेटिंग सिस्टम पर निर्भर करता है) जबकि फाइबर को हल्के वजन, सहकारी धागे माना जाता है। आपके आवेदन के लिए दोनों अलग-अलग निष्पादन पथ हैं।
थ्रेड्स के साथ: वर्तमान निष्पादन पथ किसी भी समय बाधित या पूर्वनिर्मित हो सकता है (ध्यान दें: यह कथन एक सामान्यीकरण है और हमेशा ओएस / थ्रेडिंग पैकेज / आदि के आधार पर सही नहीं हो सकता है)। इसका मतलब है कि थ्रेड्स के लिए, डेटा अखंडता एक बड़ा मुद्दा है क्योंकि डेटा के एक कबाड़ को अपडेट करने के बीच में एक थ्रेड को रोका जा सकता है, जिससे डेटा की अखंडता खराब या अपूर्ण स्थिति में रह सकती है। इसका अर्थ यह भी है कि ऑपरेटिंग सिस्टम एक ही समय में एक से अधिक थ्रेड चलाकर कई CPU और CPU कोर का लाभ ले सकता है और इसे डेटा एक्सेस की रक्षा के लिए डेवलपर तक छोड़ सकता है।
तंतुओं के साथ: वर्तमान निष्पादन पथ केवल बाधित होता है जब फाइबर पैदावार निष्पादित करता है (ऊपर के रूप में एक ही नोट)। इसका मतलब है कि फाइबर हमेशा अच्छी तरह से परिभाषित स्थानों में शुरू और बंद हो जाते हैं, इसलिए डेटा अखंडता एक मुद्दे से बहुत कम है। इसके अलावा, क्योंकि फाइबर को अक्सर उपयोगकर्ता स्थान में प्रबंधित किया जाता है, महंगा संदर्भ स्विच और सीपीयू राज्य परिवर्तन की आवश्यकता नहीं होती है, जिससे एक फाइबर से अगले अत्यंत कुशल में बदलाव होता है। दूसरी ओर, चूंकि कोई भी दो फाइबर एक ही समय में नहीं चल सकते हैं, केवल अकेले फाइबर का उपयोग करने से कई सीपीयू या कई सीपीयू कोर का लाभ नहीं होगा।
थ्रेड्स पूर्व-खाली शेड्यूलिंग का उपयोग करते हैं , जबकि फाइबर सहकारी शेड्यूलिंग का उपयोग करते हैं ।
एक थ्रेड के साथ, नियंत्रण प्रवाह किसी भी समय बाधित हो सकता है, और एक और थ्रेड संभाल सकता है। कई प्रोसेसर के साथ, आपके पास एक ही समय में ( एक साथ मल्टीथ्रेडिंग, या एसएमटी) चलने वाले कई धागे हो सकते हैं । नतीजतन, आपको समवर्ती डेटा एक्सेस के बारे में बहुत सावधान रहना होगा, और अपने डेटा को म्यूटेक्स, सेमाफोर्स, कंडीशन वैरिएबल और इसी तरह से सुरक्षित रखना होगा। यह अक्सर सही पाने के लिए बहुत मुश्किल है।
एक फाइबर के साथ, केवल जब आप इसे कहते हैं, तो नियंत्रण स्विच करता है, आमतौर पर एक फ़ंक्शन कॉल के साथ कुछ ऐसा होता है yield()
। इससे समवर्ती डेटा पहुंच आसान हो जाती है, क्योंकि आपको डेटा संरचनाओं या म्यूटेक्स की परमाणुता के बारे में चिंता करने की ज़रूरत नहीं है। जब तक आप उपज नहीं देते हैं, तब तक प्रीमेप्टेड होने और किसी अन्य फाइबर को आपके द्वारा काम कर रहे डेटा को पढ़ने या संशोधित करने की कोशिश करने का कोई खतरा नहीं है । नतीजतन, हालांकि, यदि आपका फाइबर एक अनंत लूप में जाता है, तो कोई अन्य फाइबर नहीं चल सकता है, क्योंकि आप उपज नहीं दे रहे हैं।
आप थ्रेड्स और फाइबर भी मिला सकते हैं, जो दोनों के सामने आने वाली समस्याओं को जन्म देता है। अनुशंसित नहीं है, लेकिन यह कभी-कभी सही तरीके से किया जा सकता है अगर सावधानी से किया जाए।
Win32 में, एक फाइबर उपयोगकर्ता-प्रबंधित थ्रेड का एक प्रकार है। एक फाइबर का अपना स्टैक और स्वयं का निर्देश सूचक आदि होता है, लेकिन फाइबर ओएस द्वारा निर्धारित नहीं होते हैं: आपको स्पष्ट रूप से स्विचटॉइबर को कॉल करना होगा। इसके विपरीत, थ्रेड्स, पूर्व-खाली रूप से ऑपरेशन सिस्टम द्वारा निर्धारित होते हैं। तो मोटे तौर पर फाइबर बोलना एक ऐसा धागा है जिसे एक सच्चे OS थ्रेड के बजाय एप्लिकेशन / रनटाइम स्तर पर प्रबंधित किया जाता है।
परिणाम यह है कि फाइबर सस्ता है और यह कि शेड्यूलिंग पर एप्लिकेशन का अधिक नियंत्रण है। यह महत्वपूर्ण हो सकता है यदि एप्लिकेशन बहुत अधिक समवर्ती कार्य बनाता है, और / या जब वे चलाते हैं तो निकटता से अनुकूलन करना चाहते हैं। उदाहरण के लिए, एक डेटाबेस सर्वर थ्रेड्स के बजाय फाइबर का उपयोग करना चुन सकता है।
(एक ही शब्द के लिए अन्य उपयोग हो सकते हैं; जैसा कि कहा गया है, यह Win32 की परिभाषा है।)
पहले मैं पृष्ठभूमि सामग्री के रूप में प्रक्रियाओं और थ्रेड्स के बीच अंतर के इस स्पष्टीकरण को पढ़ने की सिफारिश करूंगा ।
एक बार जब आप पढ़ते हैं कि यह बहुत सीधे आगे है। थ्रेड्स को कर्नेल में या तो यूजर स्पेस में लागू किया जा सकता है, या दोनों को मिलाया जा सकता है। फाइबर मूल रूप से उपयोगकर्ता अंतरिक्ष में लागू होने वाले धागे हैं।
मॉडर्न ऑपरेटिंग सिस्टम्स में सेक्शन 11.4 "विंडोज विस्टा में प्रोसेस एंड थ्रेड्स", टैनानबाउम टिप्पणी:
यद्यपि तंतुओं को सहकारी रूप से निर्धारित किया जाता है, यदि तंतुओं को निर्धारित करने वाले कई सूत्र हैं, तो यह सुनिश्चित करने के लिए कि एक दूसरे के साथ तंतुओं का हस्तक्षेप न हो, इसके लिए बहुत सावधानी से सिंक्रनाइज़ेशन की आवश्यकता होती है। थ्रेड्स और फ़ाइबर्स के बीच इंटरैक्शन को सरल बनाने के लिए, केवल उतने ही थ्रेड बनाने के लिए उपयोगी होता है, जितना कि इन्हें चलाने के लिए प्रोसेसर होते हैं, और थ्रेड्स को केवल प्रत्येक उपलब्ध प्रोसेसर के एक अलग सेट पर, या यहाँ तक कि सिर्फ एक प्रोसेसर को एफिनिटाइज़ करना होता है। प्रत्येक थ्रेड फ़ाइबर का एक विशेष उपसमूह चला सकता है, जो थ्रेड्स और फ़ाइबर्स के बीच एक से कई संबंधों को स्थापित करता है जो सिंक्रनाइज़ेशन को सरल करता है। यहाँ तक कि तंतुओं के साथ अभी भी कई कठिनाइयाँ हैं। अधिकांश Win32 लाइब्रेरीज़ पूरी तरह से फ़ाइबर से अनजान होते हैं, और ऐसे अनुप्रयोग जो फाइबर का उपयोग करने का प्रयास करते हैं जैसे कि वे थ्रेड थे, विभिन्न विफलताओं का सामना करेंगे। कर्नेल को तंतुओं का कोई ज्ञान नहीं है, और जब एक फाइबर कर्नेल में प्रवेश करता है, तो जिस थ्रेड पर यह निष्पादित हो रहा है वह ब्लॉक हो सकता है और कर्नेल प्रोसेसर पर एक मनमाना धागा शेड्यूल करेगा, जिससे यह अन्य फाइबर को चलाने के लिए अनुपलब्ध है। इन कारणों से फाइबर का उपयोग शायद ही कभी किया जाता है सिवाय अन्य प्रणालियों के कोड को पोर्ट करते हुए जिन्हें फाइबर द्वारा प्रदान की गई कार्यक्षमता की स्पष्ट रूप से आवश्यकता होती है।
ध्यान दें कि थ्रेड्स और फाइबर के अलावा, विंडोज 7 उपयोगकर्ता-मोड निर्धारण का परिचय देता है :
उपयोगकर्ता-मोड शेड्यूलिंग (UMS) एक लाइट-वेट मैकेनिज्म है जिसे एप्लिकेशन अपने स्वयं के थ्रेड को शेड्यूल करने के लिए उपयोग कर सकते हैं। कोई अनुप्रयोग सिस्टम शेड्यूलर को शामिल किए बिना उपयोगकर्ता मोड में UMS थ्रेड्स के बीच स्विच कर सकता है और कर्नेल में UMS थ्रेड ब्लॉक होने पर प्रोसेसर को पुनः प्राप्त कर सकता है। UMS थ्रेड्स फाइबर से भिन्न होते हैं, जिसमें प्रत्येक UMS थ्रेड का एकल थ्रेड संदर्भ साझा करने के बजाय उसका थ्रेड संदर्भ होता है। उपयोगकर्ता मोड में थ्रेड्स के बीच स्विच करने की क्षमता यूएमएस को थ्रेड पूल की तुलना में अधिक कुशल बनाती है, जो बड़ी संख्या में लघु-अवधि के काम की वस्तुओं के प्रबंधन के लिए होती है जिन्हें कुछ सिस्टम कॉल की आवश्यकता होती है।
थ्रेड्स, फाइबर और यूएमएस के बारे में अधिक जानकारी डेव प्रॉबर्ट: इनसाइड विंडोज 7 - यूजर मोड शेड्यूलर (यूएमएस) को देखकर उपलब्ध है ।
थ्रेड्स ओएस (पूर्व-खाली) द्वारा निर्धारित किए गए हैं। ओएस द्वारा किसी भी समय एक थ्रेड को रोका या फिर से शुरू किया जा सकता है, लेकिन फाइबर कमोबेश खुद को (सहकारी) और एक दूसरे को उपज देते हैं। यही है, प्रोग्रामर तब नियंत्रित करता है जब फाइबर अपना प्रसंस्करण करते हैं और जब वह प्रसंस्करण दूसरे फाइबर पर स्विच करता है।
थ्रेड्स आमतौर पर कर्नेल पर थ्रेड को बाधित करने के लिए भरोसा करते हैं ताकि यह या एक और धागा चला सकें (जिसे प्री-इप्टिव मल्टीटास्किंग के रूप में जाना जाता है) जबकि फाइबर को-ऑपरेटिव मल्टीटास्किंग का उपयोग करते हैं जहां यह फाइबर ही होता है जो इसके रनिंग को छोड़ देता है ताकि अन्य फाइबर चला सकते हैं।
कुछ उपयोगी लिंक जो यह बताते हैं कि मैंने शायद बेहतर किया:
मूल रूप से थ्रेड्स को हल्के प्रक्रियाओं के रूप में बनाया गया था। इसी तरह से, फाइबर एक हल्का धागा होता है, जो कि (एक-दूसरे को शेड्यूल करने के लिए, नियंत्रण उपज द्वारा) फाइबर पर निर्भर (सरल रूप से) होता है।
मुझे लगता है कि अगला कदम स्ट्रैंड्स होगा जहां आपको हर बार उन्हें एक संकेत भेजना होगा कि आप उन्हें एक निर्देश निष्पादित करना चाहते हैं (मेरे 5yo बेटे के विपरीत नहीं :-))। पुराने दिनों में (और अब भी कुछ एम्बेडेड प्लेटफार्मों पर), सभी धागे फाइबर थे, कोई पूर्व-उत्सर्जन नहीं था और आपको अच्छी तरह से व्यवहार करने के लिए अपने धागे लिखना था।
Win32 फाइबर की परिभाषा वास्तव में "ग्रीन थ्रेड" की परिभाषा है जो कि सन माइक्रोसिस्टम्स में स्थापित है। उपयोगकर्ता कोड / थ्रेड-लाइब्रेरी नियंत्रण के तहत उपयोगकर्ता स्पेस में निष्पादित थ्रेड को किसी प्रकार के थ्रेड पर शब्द फाइबर को बर्बाद करने की आवश्यकता नहीं है।
निम्नलिखित टिप्पणियों पर तर्क को स्पष्ट करने के लिए:
हमें यह मान लेना चाहिए कि प्रक्रियाएं धागे से बनी होती हैं और धागे धागे से बने होने चाहिए। मन में उस तर्क के साथ, धागे के अन्य प्रकार के लिए फाइबर का उपयोग करना गलत है।