2010-05-08 12 views
9

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

कि नोट पर, अगर मैं जमीन से सॉफ्टवेयर लिख रहा हूँ वैसे भी, मैं अतिरिक्त प्रयास और अपना काम-स्विचिंग को लागू कर सकते हैं। प्रत्येक कार्य को भागों में विभाजित करें, राज्य को बीच में सहेजें, और उसके बाद एक थ्रेड के भीतर उनमें से स्विच करें। या, अगर मुझे पता चलता है कि कई सीपीयू कोर हैं, तो मैं सिर्फ प्रत्येक कार्य को अलग थ्रेड पर दे सकता हूं और सभी ठीक होंगे।

दूसरा समाधान उपलब्ध सीपीयू कोर की संख्या के अनुरूप ढलने का लाभ करता है, लेकिन मैनुअल कार्य स्विच वास्तव में तेजी से ओएस कोर में एक से हो जाएगा? विशेष रूप से अगर मैं TaskManager और ITask, आदि के साथ पूरी चीज़ जेनेरिक बनाने की कोशिश कर रहा हूं?

स्पष्टीकरण: मैं एक विंडोज डेवलपर हूं इसलिए मुझे मुख्य रूप से इस ओएस के उत्तर में दिलचस्पी है, लेकिन यह अन्य ओएस के बारे में भी जानना सबसे दिलचस्प होगा। जब आप अपना उत्तर लिखते हैं, तो कृपया बताएं कि यह कौन सा ओएस है।

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

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

इस प्रकार मैन्युअल कार्य स्विचिंग के बारे में मेरा विचार। इस तरह से कोई 32 "आभासी" थ्रेड बना सकता है जिसे इष्टतम के रूप में कई वास्तविक धागे में मैप किया जाएगा, और "संदर्भ स्विचिंग" मैन्युअल रूप से किया जाएगा। सवाल यह है कि - क्या मेरे मैनुअल "संदर्भ स्विचिंग" का ओवरहेड ओएस संदर्भ स्विचिंग से कम होगा?

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

+0

आप किस ओएस में रूचि रखते हैं? यह ओएस में * व्यापक रूप से * भिन्न होता है। –

+1

मैं मूल रूप से एक विंडोज प्रोग्रामर हूं, लेकिन अन्य ओएस के बारे में भी सुनना दिलचस्प होगा। मैंने सवाल को ओएस-अज्ञेयवादी बनाने की कोशिश की। –

+0

@ विल्क्स इस सवाल से इसकी प्रकृति कभी भी ओएस अज्ञेयवादी नहीं हो सकती है। – Cromulent

उत्तर

5

मैं नहीं दिख रहा है कि कैसे एक मैनुअल कार्य स्विच तेजी से हो सकता है के बाद से ओएस गिरी अभी भी अन्य प्रक्रियाओं स्विचन है भी चल रहा है राज्य के बाहर तुम्हारा में भी शामिल है। एक समयपूर्व अनुकूलन और प्रयास की संभावित भारी अपशिष्ट की तरह लगता है।

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

यदि आप वास्तव में सीपीयू बाध्य हैं, तो CPU की संख्या का पता लगाएं और कई धागे शुरू करें। आपको लगभग 100% सीपीयू उपयोग देखना चाहिए। यदि नहीं, तो आप पूरी तरह से सीपीयू बाध्य नहीं हैं और शायद उत्तर एन + एक्स धागे शुरू करना है। बहुत आईओ बाध्य प्रक्रियाओं के लिए, आप सीपीयू गिनती (यानी उच्च ट्रैफिक वेबसर्वर 1000+ धागे चलाते हैं) के एक (बड़े) एकाधिक शुरू करेंगे।

अंत में, संदर्भ के लिए, विंडोज और लिनक्स शेड्यूलर दोनों हर मिलीसेकंड यदि किसी अन्य प्रक्रिया को चलाने के लिए की जरूरत है की जाँच करने के जगा। तो, यहां तक ​​कि एक निष्क्रिय प्रणाली पर आप प्रति सेकंड 1000+ संदर्भ स्विच देखेंगे। भारी लोड सिस्टम पर, मैंने बिना किसी महत्वपूर्ण मुद्दों के 10,000 प्रति सेकंड प्रति सीपीयू देखा है।

+0

दूसरे शब्दों में, भले ही मैंने एकल-कोर सिस्टम पर 32 सीपीयू-बाउंड धागे की तरह बनाया हो, फिर भी एक थ्रेडेड समाधान की तुलना में मंदी नगण्य होगी? –

+0

मुझे नहीं लगता कि ओवरहेड नगण्य होगा, मेरा मतलब था कि एक सीपीयू बड़ी संख्या में संदर्भ स्विच को संभाल सकता है और अभी भी काम पूरा कर सकता है। ओवरहेड निर्धारित करने के लिए आपको कुछ परीक्षण चलाने की आवश्यकता होगी और यदि आप इसके साथ ठीक हैं। यह इस प्रक्रिया पर कितना समय चलता है - 10 सेकंड लगने वाले कार्य के लिए ओवरहेड के 1ms, शायद इससे कोई फर्क नहीं पड़ता; हो सकता है कि ओवरहेड का 1 सेकंड होगा।सिस्टम पर CPU की संख्या प्राप्त करना बहुत आसान है; आपके पास पहले से ही एक एल्गोरिदम है जो अलग होना आसान है, इसलिए _any_ ओवरहेड स्वीकार्य नहीं हो सकता है और आपको केवल एक कोर सिस्टम पर एकल थ्रेड किया जाना चाहिए। – AngerClown

3

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

मैं नहीं पता है क्या आपके आवेदन करता है, लेकिन जब तक आप कई गणना बाध्य कार्य है, मुझे शक है कि इस संदर्भ स्विच सबसे अनुप्रयोगों में एक महत्वपूर्ण टोंटी हैं। यदि आपके कार्य I/O पर अवरुद्ध हैं, तो आपको ओएस को बाहर करने की कोशिश करने से अधिक लाभ नहीं मिलेगा।

+0

स्वाभाविक रूप से यह केवल सीपीयू-बाध्य प्रक्रियाओं पर लागू होता है। मेरा मतलब कुछ और नहीं था। लेकिन यहां तक ​​कि जब आपके पास सीपीयू-बाध्य प्रक्रिया होती है और आप मल्टी-कोर सीपीयू का लक्ष्य रखते हैं, तो आप अपनी प्रक्रिया कैसे लिखते हैं ताकि यह उपलब्ध सभी कोरों का बेहतर उपयोग करने की गारंटी हो, चाहे 2 या 32 हों? –

+0

ओपनएमपी कोर की संख्या में स्वचालित रूप से चीजों को स्केल करने में बहुत आसान बनाता है। विंडोज एपीआई थ्रेड पूल प्रदान करता है, जो प्रोसेसर उपलब्धता और उपयोग के अनुसार स्वचालित रूप से बढ़ने और घटने के लिए माना जाता है। या यदि आप कोर की संख्या जानना चाहते हैं तो http://stackoverflow.com/questions/150355/programmatically-find-the-number-of-cores-on-a- माचिन देखें। –

5

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

मैं सलाह देता हूं कि इस पर अपना प्रयास न करें।

संबंधित मुद्दे