2012-05-12 3 views
6

मैं SCHED_FIFO के साथ प्रयोग कर रहा हूं और मुझे कुछ अप्रत्याशित व्यवहार दिखाई दे रहा है। जिस सर्वर का मैं उपयोग कर रहा हूं उसके पास 12 कोर हैं जिनमें हाइपर-थ्रेडिंग अक्षम है। सभी कॉन्फ़िगर करने योग्य इंटरप्ट को सीपीयू 0 पर चलाने के लिए सेट किया गया है।लिनक्स रीयल टाइम शेड्यूलिंग प्राथमिकताओं (SCHED_FIFO और SCHED_RR) का व्यावहारिक उपयोग?

मेरा प्रोग्राम प्रारंभिक प्राथमिकता कार्यों के लिए थ्रेड बनाता है, जो पीएचड्रेड लाइब्रेरी का उपयोग करके सीपीयू एफ़िनिटी सेट को कोर 0 पर सेट किए बिना शेड्यूलिंग पॉलिसी को बदलता है। पैरेंट थ्रेड उसके सीपीयू को सेट करता है कोर 3 और इसकी अपनी शेड्यूलिंग नीति SCHED_FIFO पर sched_setscheduler() का उपयोग करके पिड शून्य और प्राथमिकता 1 के साथ और फिर गैर-अवरोधक लूप चलाने के लिए शुरू होती है।

कार्यक्रम स्वयं ही चलता है। हालांकि, अगर मैं दूसरी बार सर्वर में लॉग इन करने का प्रयास करता हूं, जबकि प्रोग्राम टर्मिनल चला रहा है, तब तक मैं उत्तरदायी नहीं हूं जब तक कि मैं अपना प्रोग्राम बंद नहीं करता। ऐसा लगता है कि शेड्यूलर वास्तविक प्रक्रिया प्रक्रिया के समान कोर पर अन्य प्रक्रियाओं को चलाने की कोशिश कर रहा है।

  1. मुझे क्या याद आ रही है?
  2. क्या शेड्यूलर अभी भी एक वास्तविक समय प्रक्रिया चलाने वाले कोर पर अन्य प्रक्रियाओं को चलाने का प्रयास करेगा? यदि हां, तो क्या इसे रोकने का कोई तरीका है?
  3. माता-पिता में sched_setscheduler() के साथ शेड्यूलिंग नीति सेट करने से पहले बनाए गए बच्चे के व्यवहार को बदल दिया जाएगा?

अग्रिम धन्यवाद।

उत्तर

5

sched_setschedulerप्रक्रिया की शेड्यूलर सेट करता है, थ्रेड नहीं। देखें:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sched_setscheduler.html

आप एक धागा के लिए अनुसूचक सेट करना चाहते हैं, तो आप इससे पहले कि आप इसे बनाने के नया थ्रेड के लिए विशेषता वस्तु पर pthread_attr_setschedpolicy और pthread_attr_setschedparam कार्यों का उपयोग करने की आवश्यकता है।

मुझे यकीन है कि कैसे अधिक से अधिक अनुरूप लिनक्स इन आवश्यकताओं का सम्मान पर है नहीं कर रहा हूँ, लेकिन आप कम से कम आपका कोड सही विनिर्देश के, तो यह उन्हें आवश्यकतानुसार समायोजित है सुनिश्चित करते हुए बाहर शुरू कर देना चाहिए ...

+0

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

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