कल्पना कीजिए कि मेरे पास दो (तीन, चार, जो कुछ भी) कार्य हैं जिन्हें समानांतर में चलाना है। अब, ऐसा करने का आसान तरीका अलग-अलग धागे बनाना और इसके बारे में भूलना होगा। लेकिन एक सादे पुराने एकल कोर सीपीयू पर जिसका मतलब बहुत से संदर्भ स्विचिंग होगा - और हम सभी जानते हैं कि संदर्भ स्विचिंग बड़ी, बुरी, धीमी, और आम तौर पर केवल बुराई है। इसे टालना चाहिए, है ना?एक संदर्भ स्विच कितना महंगा है? ओएस थ्रेड पर भरोसा करने के बजाय मैनुअल टास्क स्विच को कार्यान्वित करना बेहतर है?
कि नोट पर, अगर मैं जमीन से सॉफ्टवेयर लिख रहा हूँ वैसे भी, मैं अतिरिक्त प्रयास और अपना काम-स्विचिंग को लागू कर सकते हैं। प्रत्येक कार्य को भागों में विभाजित करें, राज्य को बीच में सहेजें, और उसके बाद एक थ्रेड के भीतर उनमें से स्विच करें। या, अगर मुझे पता चलता है कि कई सीपीयू कोर हैं, तो मैं सिर्फ प्रत्येक कार्य को अलग थ्रेड पर दे सकता हूं और सभी ठीक होंगे।
दूसरा समाधान उपलब्ध सीपीयू कोर की संख्या के अनुरूप ढलने का लाभ करता है, लेकिन मैनुअल कार्य स्विच वास्तव में तेजी से ओएस कोर में एक से हो जाएगा? विशेष रूप से अगर मैं TaskManager
और ITask
, आदि के साथ पूरी चीज़ जेनेरिक बनाने की कोशिश कर रहा हूं?
स्पष्टीकरण: मैं एक विंडोज डेवलपर हूं इसलिए मुझे मुख्य रूप से इस ओएस के उत्तर में दिलचस्पी है, लेकिन यह अन्य ओएस के बारे में भी जानना सबसे दिलचस्प होगा। जब आप अपना उत्तर लिखते हैं, तो कृपया बताएं कि यह कौन सा ओएस है।
अधिक स्पष्टीकरण: ठीक है, इसलिए यह किसी विशेष एप्लिकेशन के संदर्भ में नहीं है। यह वास्तव में एक सामान्य सवाल है, स्केलेबिलिटी के बारे में मेरी संगीत पर परिणाम। यदि मैं चाहता हूं कि मेरा आवेदन भविष्य के CPUs (और आज के विभिन्न CPUs) को स्केल और प्रभावी रूप से उपयोग करने के लिए चाहता है तो मुझे इसे बहुप्रचारित बनाना होगा। लेकिन कितने धागे? यदि मैं लगातार धागे की संख्या बना देता हूं, तो प्रोग्राम उन सभी CPUs पर उप-निष्पादन करेगा जो समान संख्या में कोर नहीं हैं।
आदर्श रूप में धागे की संख्या रनटाइम पर निर्धारित किया जाएगा, लेकिन कुछ कार्य है कि वास्तव में कार्यावधि में भागों में से मनमाना संख्या में विभाजित किया जा सकता है। हालांकि कई कार्यों को डिजाइन समय पर धागे की एक बहुत बड़ी निरंतर संख्या में विभाजित किया जा सकता है। इसलिए, उदाहरण के लिए, यदि मेरा प्रोग्राम 32 धागे को जन्म दे सकता है, तो यह पहले से ही 32-कोर CPUs के सभी कोर का उपयोग करेगा, जो भविष्य में अभी तक बहुत दूर है (मुझे लगता है)। लेकिन एक साधारण सिंगल-कोर या ड्यूल-कोर सीपीयू पर इसका मतलब बहुत से संदर्भ स्विचिंग होगा, जो चीजों को धीमा कर देगा।
इस प्रकार मैन्युअल कार्य स्विचिंग के बारे में मेरा विचार। इस तरह से कोई 32 "आभासी" थ्रेड बना सकता है जिसे इष्टतम के रूप में कई वास्तविक धागे में मैप किया जाएगा, और "संदर्भ स्विचिंग" मैन्युअल रूप से किया जाएगा। सवाल यह है कि - क्या मेरे मैनुअल "संदर्भ स्विचिंग" का ओवरहेड ओएस संदर्भ स्विचिंग से कम होगा?
स्वाभाविक रूप से, यह उन प्रक्रियाओं पर लागू होता है जो सीपीयू-बाउंड हैं, जैसे गेम। आपके रन-ऑफ-द-मिल सीआरयूडी एप्लिकेशन के लिए इसका बहुत कम मूल्य है। इस तरह का एक आवेदन सबसे अच्छा एक थ्रेड (अधिकतम दो) के साथ बनाया जाता है।
आप किस ओएस में रूचि रखते हैं? यह ओएस में * व्यापक रूप से * भिन्न होता है। –
मैं मूल रूप से एक विंडोज प्रोग्रामर हूं, लेकिन अन्य ओएस के बारे में भी सुनना दिलचस्प होगा। मैंने सवाल को ओएस-अज्ञेयवादी बनाने की कोशिश की। –
@ विल्क्स इस सवाल से इसकी प्रकृति कभी भी ओएस अज्ञेयवादी नहीं हो सकती है। – Cromulent