2010-04-07 45 views
11

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

+0

सभी टिप्पणियों के लिए हाय धन्यवाद। मुझे लगता है कि मैंने जवाब सीखा, जो नहीं है। कारण मैंने पूछा था: हमारा ऐप आईओ प्रतीक्षा राज्यों में बहुत समय बिताता है क्योंकि यह 500 जीबी की डेटा फ़ाइलों तक पहुंचता है जो प्रति घंटा बदलते हैं। मैं समानांतर आईओ करने के लिए बहुत सारे धागे का उपयोग करना चाहता हूं (हाँ फाइलर्स इसे संभाल सकते हैं ... वे पहले ही आईओ के 3200 उदाहरणों से आईओ को संभालने वाले हैं और यह अधिक काम को संभालने के लिए नहीं है, बल्कि दीवार के समय को कम करने के लिए है)। हमारे बक्से सभी एमपी हैं 8-64 "सीपीयू" वास्तविक कोर और हाइपरथ्रेडिंग की गिनती ... इसलिए मेरे पास एक साथ चलने वाले बहुत सारे धागे हो सकते हैं। – johnnycrash

+0

समांतर आईओ आमतौर पर प्रदर्शन को कम करता है, यह काफी महत्वपूर्ण हो सकता है। एक ड्राइव समानांतर में सामान नहीं कर सकती है (आपके RAID सेटअप के आधार पर एक निश्चित बिंदु से परे)। यदि आप प्रदर्शन को अधिकतम करना चाहते हैं, तो आप एक मुट्ठी भर आईओ थ्रेड (जितना संभव हो उतना बड़ा) डेटा कार्यकर्ता धागे से/से चाहते हैं। – leeeroy

+0

aio.h में देखें। असिंक्रोनस इनपुट आउटपुट @ स्लीयरॉय समांतर आईओ एक जीत हो सकती है क्योंकि यह ब्लॉक डिवाइस शेड्यूलर को वास्तव में शेड्यूल करने की अनुमति देता है और डिस्क पढ़ने/लिखने वाले सिर के स्वीप का बेहतर उपयोग करता है। प्लस ड्राइव का अपना कैश होता है और अपना स्वयं का शेड्यूलिंग करता है। किसी भी तरह से, एआईओ को भी वह लाभ प्राप्त करना चाहिए। – nategoose

उत्तर

8

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

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

हालांकि, अगर आप केवल अपने ही प्रक्रिया में धागे के बारे में परवाह कुछ भी करने को है, तो हाँ, उन्हें एक म्युटेक्स अपने चल रहे धागा धारण पर ब्लॉक होने में सक्षम नहीं होने के लिए पर्याप्त है।

मुश्किल बात यह है कि म्युटेक्स हड़पने के लिए जब भी आपके धागा अपनी बात करने की जरूरत है सभी अन्य सूत्र का समन्वय करने के लिए है।

+0

मूल रूप से कार्यकर्ता धागे और एक कार्य कतार का एक गुच्छा देखना चाहिए। जब मैं काम तैयार करता हूं और फिर धागे को आग लगाता हूं तो मेरे पास लगभग कोई लॉकिंग नहीं है। चरण 2 के लिए मैं धागे को कतार में अधिक काम जोड़कर समानता में वृद्धि करना चाहता हूं। ऐसा करने के लिए, थ्रेड को यह देखने के लिए एक सामान्य डेटा स्टोर की जांच करनी है कि डेटा मौजूद है या नहीं। कोई भी डेटा नहीं = कतार के लिए काम। यह वह फ़ंक्शन है जो सामान्य डेटा स्टोर की जांच करता है जिसे मुझे डर है कि बहुत कुछ एक्सेस किया जाएगा। मुझे लगता है कि मुझे सिर्फ उस हिस्से को बनाने की ज़रूरत है जिसे पूरी तरह से पुनः लिखने के साथ अतिरिक्त छोटे लॉक करने की आवश्यकता है। – johnnycrash

+0

मैं इसी तरह की चीजें करने के लिए इस http://asgaard.homelinux.org/svn/threadqueue/ का उपयोग कर रहा हूं। आप नंबर बंद कर देते हैं। कार्यकर्ता धागे जो आप चाहते हैं, और उन्हें थ्रेड्यूयू के माध्यम से काम करते हैं, जो ब्लॉक करते हैं और कतार में डेटा जोड़ने तक प्रतीक्षा करते हैं।यदि आपके पास कोर की तुलना में अधिक कार्यकर्ता धागे नहीं हैं, तो उनके बीच विवाद न्यूनतम होना चाहिए। – nos

1

आप नहीं कर सकते। यदि आप अपने थ्रेड को कभी भी अनुरोध जारी करने और अन्य धागे भूख से नहीं रोक पाएंगे।

सबसे अच्छा तुम कर सकते हो

अपने धागे प्राथमिकता सेट कर दिया जाता है, ताकि अनुसूचक कम प्राथमिकता धागे के साथ यह चुनाव करेगा।

+0

डांग। थ्रेड प्राथमिकता एक समस्या है जब तक कि मैं फ़ंक्शन दर्ज नहीं करता हूं और तब बाहर निकलता हूं जब मैं बाहर निकलता हूं। इसके अलावा, चक्र के मामले में वह लागत क्या होगी। कार्यकर्ता धागे वे हैं जिनके बारे में मैं चिंता कर रहा हूं और उनमें से बहुत सारे होंगे। – johnnycrash

1

क्यों नहीं बस प्रतिस्पर्धा धागे ब्लॉक, तो अनुसूचक शेड्यूल करने के लिए छोड़ दिया कुछ भी नहीं लेकिन अपने रहने वाले धागा होगा है? शेड्यूलर अनुमान लगाने वाले दूसरे डिजाइन को जटिल क्यों करें?

+0

वैसे मैं सोच रहा था कि अगर थ्रेड ए ने थ्रेड ए के टाइम्सलाइस के अंत में संसाधन बंद कर दिया तो इसे पूर्ववत किया जा सकता था। शेड्यूलर तब अन्य सभी कार्यकर्ता धागे के माध्यम से चक्र चलाएगा, मान लें कि 50 हैं। चूंकि इस फ़ंक्शन को हिट होने की संभावना है, इसलिए 50 में से प्रत्येक थ्रेड कम समय के लिए निष्पादित हो सकता है, फिर ब्लॉक करें। इसलिए मुझे लगता है कि प्रीपेप्टिव शेड्यूलर के कारण मेरे पास केवल 50 संदर्भ स्विच थे। अनावश्यक अपशिष्ट – johnnycrash

2

आपको अपने sw को आर्किटेक्ट करना चाहिए ताकि आप शेड्यूलर पर निर्भर न हों जो आपके ऐप के दृष्टिकोण से "सही" चीज़ कर रहा हो। शेड्यूलर जटिल है। यह वही करेगा जो यह सोचता है कि सबसे अच्छा है।

संदर्भ स्विच सस्ते हैं। आप कहते हैं

मैं संदर्भ स्विच के साथ सीपीयू चक्र बर्बाद कर दूंगा।

लेकिन आपको इसे इस तरह से नहीं देखना चाहिए। म्यूटेक्स की बहु-थ्रेडेड मशीनरी और अवरुद्ध/प्रतीक्षा प्रक्रियाओं का उपयोग करें। मशीनरी आपके लिए उपयोग करने के लिए है ...

+0

हाँ, मैं सहमत हूं। मैं पहिया को फिर से शुरू नहीं करना चाहता हूं। मैं सिर्फ यह जानना चाहता हूं कि अधिकतम चक्र को कैसे उपयोग किया जाए। मैंने कहीं पढ़ा है कि एक म्यूटेक्स को लॉक किया जा सकता है और दूसरी बार हजारों बार ऑर्डर कर दिया जा सकता है। मुझे जो चाहिए वह बहुत धीमा है। आप वास्तुकला के बारे में सही हैं। दुर्भाग्यवश मेरे पास 20 वर्ष पुराना कोड है, इसलिए मेरी पहली योजना कुछ ऐसा करने की कोशिश की गई थी जो न्यूनतम परिवर्तनों के साथ काम करे। इसलिए मोचन के बारे में सवाल। इसके अलावा, यह memmap का बहुत उपयोग करता है। मेरा अनुमान है कि memmap 4k भाग पर malloc कॉल करता है। मेरे पास 64 एक साथ memmaps हो सकता है जो सभी को 50 बार मॉलोक करना चाहते हैं। – johnnycrash

+0

खैर, mmap malloc को कॉल नहीं करता है, यह कर्नेल में स्मृति पृष्ठों में गलती होगी। इसके अलावा, कितने हजार/सेकंड बहुत धीमी है? बिना किसी विवाद के म्यूटेक्स को लॉक करना/अनलॉक करना कई लाख/सेकेंड के क्रम में किया जा सकता है, जब विवाद और धागे को अवरुद्ध करना होता है, हालांकि यह धीमा हो जाता है। – nos

+0

@ लैरी के क्या आप कृपया दावा कर सकते हैं कि "संदर्भ स्विच सस्ते हैं"? – Bacon

1

लिनक्स के तहत वास्तविक समय शेड्यूलिंग में देखें। मैंने इसे कभी नहीं किया है, लेकिन यदि आपको वास्तव में इसकी आवश्यकता है तो यह उतना करीब है जितना आप उपयोगकर्ता एप्लिकेशन कोड में प्राप्त कर सकते हैं।

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

+0

धन्यवाद। मैं कर्नेल के बारे में चिंतित नहीं हूं, मेरी प्रक्रिया में बस अन्य धागे। तो उन तरह के इंटरप्ट ठीक रहेगा। मेरी प्रक्रिया में एक और धागा चलाने के लिए एक बाधा है जो मैं चिंतित हूं। – johnnycrash

+0

जो शब्द आप उपयोग कर रहे हैं, वे आप जो चाहते हैं उससे मेल नहीं खाते हैं, और मुझे यकीन नहीं है कि आप जो चाहते हैं वह वास्तव में आप चाहते हैं। आप सहकारी मल्टीथ्रेडिंग चाहते हैं या आप कुछ और चाहते हैं। क्या आपका मतलब यह है कि थ्रेड ए को ताला एक्स रखता है, फिर कोई अन्य थ्रेड जो लॉक एक्स को निष्पादित करना चाहता है, निष्पादित कर सकता है, क्योंकि यह बहुत अधिक है कि थ्रेड सिंक्रनाइज़ेशन चीजें क्या हैं। आपको बस अपना कोड सही ढंग से डिजाइन करना होगा; सही समय/स्थान पर ताले को बुलाकर छोड़ना। यदि आपका मतलब है कि जब थ्रेड ए लॉक एक्स रखता है तो कोई अन्य थ्रेड निष्पादित नहीं कर सकता है, आपको सिग्स्टॉप – nategoose

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