2010-01-27 21 views
29

में कर्नेल थ्रेड बनाम वर्कक्यूज़ का उपयोग कब करें linux कर्नेल में कार्य शेड्यूल करने के कई तरीके हैं: टाइमर, टास्कलेट, कार्य कतार, और कर्नेल थ्रेड। एक बनाम दूसरे का उपयोग करने के लिए दिशानिर्देश क्या हैं?लिनक्स कर्नेल

वहाँ स्पष्ट कारक हैं: टाइमर कार्य करता है और tasklets सो नहीं सकता, इसलिए वे mutexes, हालत चर पर इंतजार नहीं कर सकता, आदि

चुनने जो तंत्र एक ड्राइवर में करने के लिए अन्य कारकों क्या हैं?

पसंदीदा तंत्र कौन से हैं?

उत्तर

26

जैसा कि आपने कहा, यह काम पर निर्भर करता है:

कार्य कतारों कर्नेल थ्रेड में काम स्थगित - अपने काम हमेशा प्रक्रिया संदर्भ में चलेंगे। वे समय सारिणी हैं और इसलिए सो सकते हैं।

आम तौर पर, कार्य कतारों या sotftirqs/tasklets के बीच कोई बहस नहीं है; यदि स्थगित काम को सोने की जरूरत है, तो काम कतारों का उपयोग किया जाता है, अन्यथा softirqs या tasklets का उपयोग किया जाता है। टास्कलेट इंटरप्ट हैंडलिंग के लिए भी अधिक उपयुक्त हैं (उन्हें कुछ आश्वासन दिए जाते हैं जैसे कि: अगले टिक के मुकाबले एक टास्कलेट कभी नहीं दौड़ता है, यह हमेशा खुद के संबंध में क्रमबद्ध होता है)।

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

उम्मीद है कि इससे मदद मिलती है।

+0

आप कर्नेल थ्रेड और कार्य कतार का उपयोग करने के बीच कैसे चयन करेंगे? –

+3

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

30
 
softirqs : deferred work runs in interrupt context 
tasklets : deferred work runs in interrupt context 
work queues : deferred work runs in process context 

softirqs : cannot run simultaneously on different CPU's 
tasklets : cannot run simultaneously on different CPU's 
work queues : can run simultaneously on different CPU's 

softirqs : cannot go to sleep 
tasklets : cannot go to sleep 
work queues : can go to sleep 

softirqs : cannot be preempted/schedule 
tasklets : cannot be preempted/schedule 
work queues : maybe be preempted/schedule 

softirqs : not easy to use 
tasklets : easy to use 
work queues : easy to use 
+11

असल में, सॉफ्टरक असीमित स्केलेबल हैं, यह है कि वे अलग-अलग CPUs पर एक साथ चल सकते हैं: "सॉफ़्टिरक कई CPUs पर एक साथ चल सकते हैं, भले ही वे एक ही प्रकार के हों। इस प्रकार, सॉफ्टइक्स पुनर्वित्त कार्य होते हैं और उन्हें स्पष्ट रूप से उनके डेटा संरचनाओं की रक्षा करनी चाहिए स्पिन ताले। उसी प्रकार के टास्कलेट हमेशा क्रमबद्ध होते हैं: दूसरे शब्दों में, एक ही प्रकार के टास्कलेट को एक ही समय में दो CPUs द्वारा निष्पादित नहीं किया जा सकता है। " देखें: http://www.91kaifa.com/doc/ulk/0596005652/understandlk-chp-4-sect-7.html – user1284631

+4

संपादित करें: क्रमशः, केवल उसी प्रकार * के कार्यलेट के लिए मान्य है। "विभिन्न प्रकार के टास्कलेट कई CPUs पर समवर्ती रूप से निष्पादित किया जा सकता है।" – user1284631

+2

अक्षीय सही है। और, एक वर्कक्यू में एक ही प्रकार का "काम आइटम" अगस्त 2012 से अलग-अलग CPUs पर एक साथ नहीं चल सकता है, क्योंकि वर्कक्यू अब गैर-पुनर्वित्तक है: http://lwn.net/Articles/511421/ – Dexuan

1

कर्नेल थ्रेड कार्य पंक्तियों के लिए आधार बनाते हैं। वे केवल एक ही प्रकार के कर्नेल सहायक रूटीन हैं जो प्रक्रिया संदर्भ में चलते हैं।

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