2013-07-19 4 views
5

आरआर शेड्यूलिंग नीति में क्या होगा यदि कम प्राथमिकता थ्रेड एक म्यूटेक्स को लॉक करता है और शेड्यूलर द्वारा हटा दिया जाता है क्योंकि एक और उच्च प्राथमिकता थ्रेड प्रतीक्षा कर रहा है?यूनिक्स में थ्रेड शेड्यूलिंग

क्या यह कम प्राथमिकता वाले थ्रेड द्वारा लॉक जारी करेगा?

उदाहरण के लिए आरआर शेड्यूलिंग नीति में प्राथमिकताओं 10,20 और 30 के साथ प्रक्रिया में चल रहे 3 धागे पर विचार करें।

अब किसी दिए गए समय पर कम प्राथमिकता धागा 1 ताले म्यूटेक्स और अभी भी निष्पादन का मतलब कर रहा है जबकि उच्च प्राथमिकता धागा पॉप हो जाता है और थ्रेड 1 द्वारा आयोजित म्यूटेक्स पर भी इंतजार कर रहा है। अब थ्रेड 2 तस्वीर में आता है जिसकी भी आवश्यकता है थ्रेड द्वारा लॉक किया गया वही म्यूटेक्स 1.

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

या धागा प्राथमिकता इस तरह से सेट की जानी चाहिए कि उच्च प्राथमिकता किसी को कम प्राथमिकता वाले किसी के म्यूटेक्स पर निर्भर नहीं करेगी?

क्या कोई भी मुझे बता सकता है कि प्रक्रिया स्तर पर शेड्यूलिंग कैसे काम करती है? हम प्रक्रिया के लिए प्राथमिकता कैसे निर्धारित करते हैं?

+0

समस्या "बहुत सारे धागे, पर्याप्त कोर नहीं" थी, लेकिन बहु-कोर क्रांति जल्दी से उस समस्या को उलट रही है। थ्रेड प्राथमिकताएं तब उपयोगी होती हैं जब आपको चुनने की आवश्यकता होती है कि कौन सा धागा चलाना है, न कि जब चिप डिजाइनर सोच रहे हैं कि कोई अतिरिक्त कोर अभी भी कुछ उपयोगी कर सकता है। – MSalters

उत्तर

5

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

"कम प्राथमिकता का एक लॉक रखता है जो एक उच्च प्राथमिकता धागा 'जरूरतों' को प्राथमिकता उलटा कहा जाता है, और यह कंप्यूटर सिद्धांत में एक प्रसिद्ध परिदृश्य है।

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

संपादित करें:

एक म्युटेक्स (या अन्य इसी तरह के ताले) की बात यह है कि यह एक बार में एक ही संसाधनों तक पहुँचने से दो धागे से बचाता है। उदाहरण के लिए, हम कुछ सुंदर लंबी प्रोसेसिंग (जटिल गणित, एक सीरियल पोर्ट या नेटवर्क ड्राइव से डेटा लाने, या कुछ ऐसे) के साथ पांच अलग-अलग चर अपडेट करना चाहते हैं, लेकिन अगर हम केवल दो चर करते हैं, तो कुछ अन्य प्रक्रिया इन्हें एक अवैध परिणाम मिलेगा, फिर हम स्पष्ट रूप से लॉक के "जाने" नहीं दे सकते।

उच्च प्राथमिकता धागा को केवल सभी पांच चर अद्यतन करने और कम प्राथमिकता लॉक के लिए प्रतीक्षा करनी है।

कोई समस्या नहीं है कि एप्लिकेशन इस समस्या को "ठीक करने" के लिए कर सकता है - ताले को ज़रूरी ज़्यादा ज़्यादा ज़रूरी नहीं रखो [और यह हो सकता है कि हम वास्तव में ऊपर वर्णित समस्या को ठीक कर सकें, ताला के बाहर लंबी प्रसंस्करण, और लॉक के साथ केवल अंतिम "इसे 5 चर में स्टोर करें" करें। यह संभावित समय को कम करेगा कि उच्च प्राथमिकता धागा का इंतजार करना है, लेकिन यदि सिस्टम वास्तव में व्यस्त है, तो यह वास्तव में समस्या को ठीक नहीं करेगा।

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

+0

अब मैं समझ गया कि जो मैंने सोचा था वह वास्तविक दुनिया में हो सकता है। अब सवाल यह है कि ऑपरेटिंग सिस्टम इस प्राथमिक समायोजन का ख्याल रखता है या क्या हमें इसे अपने सॉफ्टवेयर में संभालना है। यदि ऐसा है तो कृपया मुझे एक छोटे से उदाहरण के लिए इंगित कर सकते हैं? म्यूटेक्स के बारे में आप सही लॉक केवल तभी दिए जाते हैं जब कोई प्रतिस्पर्धी उच्च प्राथमिकता धागा न हो। लेकिन मेरा सवाल यह है कि लॉक कम प्राथमिकता धागे द्वारा अधिग्रहित किया जाता है और फिर उच्च प्राथमिकता धागे की बारी आता है। – suresh

+0

@ सुरेश, स्टॉक लिनक्स कर्नेल AFAIK अस्थायी रूप से एक थ्रेड की प्राथमिकता में वृद्धि नहीं करता है ताकि एक उच्च प्राथमिकता धागा चाहता है। हालांकि, PREMPT_RT कर्नेल पैच ऐसा करता है। व्यक्तिगत रूप से मुझे लगता है कि यह एक बेहतर शेड्यूलर है, लेकिन जैसा कि मैं रीयल टाइम सिस्टम कर रहा हूं, मुझे लगता है कि ... अन्य यूनिक्स के लिए, मुझे नहीं लगता कि वहां बहुत कुछ है जो प्राथमिकता उलटा संकल्प करता है; यह वास्तविक समय की दुनिया में एक आदर्श है। – bazza

+0

मैट्स को +1, अच्छा जवाब – bazza

2

यदि उच्च प्राथमिकता धागे को कम प्राथमिकता धागे (म्यूटेक्स सेमफोर आदि) पर प्रतीक्षा करने की आवश्यकता है, तो निम्न प्राथमिकता धागा अस्थायी रूप से उच्च प्राथमिकता धागे के समान प्राथमिकता तक बढ़ाया जाता है।

+0

क्या यह कहीं "हमेशा" के रूप में परिभाषित किया गया है जिसे मैं नहीं जानता? मेरे ज्ञान के लिए "प्राथमिकता बूस्ट" एक चाल है जो कुछ स्थानों पर लागू की जाती है, लेकिन निश्चित रूप से सभी ओएस/शेड्यूलर में नहीं। –

+0

डिफ़ॉल्ट रूप से नहीं, आपको 'PTHREAD_PRIO_INHERIT' म्यूटेक्स विशेषता का उपयोग करने की आवश्यकता है। Http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_getprotocol.html –

+0

लिंक के लिए धन्यवाद .. यह स्पष्ट है कि यदि कोई थ्रेड PTHREAD_PRIO_INHERIT सेट के साथ उसी म्यूटक्स्ट की प्रतीक्षा कर रहा है तो वह थ्रेड जो एक ही म्यूटेक्स धारण कर रहा है प्रतीक्षा धागे की तुलना में उच्च प्राथमिकता पर निष्पादित करने के लिए किया जाएगा। असल में यह म्यूटेक्स के लिए प्राथमिकताओं को परिभाषित करके परेशान है। – suresh

0

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

इससे बचने के लिए हम सेमफोर का उपयोग कर सकते हैं जहां कोई अन्य धागा अनलॉक करने के लिए शुरू कर सकता है लेकिन म्यूटेक्स में यह संभव नहीं है।

+0

बिल्कुल आप क्या कह रहे हैं? मुझे लगता है कि वहां एक spurios "नहीं" है ... –

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