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