2010-05-27 8 views
9

मैं सी ++ में लिनक्स पर थ्रेडेड एप्लिकेशन पर काम कर रहा हूं जो वास्तविक समय होने का प्रयास करता है, दिल की धड़कन पर कार्रवाई करता है, या जितना संभव हो सके इसके करीब।क्या मेरा धागा ओएस को यह तय करने में मदद कर सकता है कि संदर्भ कब इसे स्विच कर सकता है?

प्रैक्टिस में, मुझे लगता है कि ओएस मेरे धागे को बदल रहा है और दूसरी बार दसवें तक की देरी कर रहा है, जबकि इसे बाहर निकाला जाता है, जिससे दिल की धड़कन अनियमित हो जाती है।

क्या कोई तरीका है कि मेरा धागा ओएस को संकेत दे सकता है कि अब इसे संदर्भित करने के लिए एक अच्छा समय है? मैं दिल की धड़कन करने के बाद यह कॉल सही कर सकता हूं, और इस प्रकार बीमार समय के संदर्भ स्विच के कारण देरी को कम कर सकता हूं।

+1

"एक दूसरे के दसवें तक की देरी का कारण बनता है" मुझे सच में संदेह है कि ओएस द्वारा संदर्भ स्विचिंग आपको 100ms देरी कर रही है। मैं शर्त लगाता हूं कि यहां कुछ और चल रहा है। – JonM

+4

यदि आप एक स्थिर प्रतिक्रिया समय चाहते हैं, तो आपको वास्तव में आरटी धागे की आवश्यकता है (और, आरटी-सक्षम कर्नेल हो सकता है) – osgx

उत्तर

5

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

यदि आप लिनक्स में "वास्तविक समय होने का प्रयास" करने के अपने लक्ष्य के बारे में गंभीर हैं, तो सबसे पहले, आपको वास्तविक समय sched_setscheduler सेटिंग (SCHED_FIFO या SCHED_RR, FIFO पसंदीदा) का उपयोग करना चाहिए। दूसरा, लिनक्स के लिए पूर्ण प्रीपेशन पैच प्राप्त करें (kernel.org से यदि आपका डिस्ट्रो एक आपूर्ति नहीं करता है। यह आपको डिवाइस ड्राइवर थ्रेड को फिर से निर्धारित करने और हार्ड डिस्क या ईथरनेट ड्राइवर थ्रेड के मुकाबले अपने धागे को निष्पादित करने की क्षमता भी देगा। तीसरा, रीयल-टाइम एप्लिकेशन को डिज़ाइन और सेट अप करने के तरीके पर अधिक संकेतों के लिए RTWiki और अन्य संसाधन देखें।

यह किसी भी सभ्य डेस्कटॉप सिस्टम पर सिस्टम लोड के बावजूद 10 माइक्रो सेकंड प्रतिक्रिया समय के तहत आपको प्राप्त करने के लिए पर्याप्त होना चाहिए। मेरे पास एक एम्बेडेड सिस्टम है जहां मैं केवल 60 हमें प्रतिक्रिया निष्क्रिय करता हूं और 150 हमें भारी डिस्क/सिस्टम लोड के तहत निचोड़ता है, लेकिन यह अभी भी आप जो वर्णन कर रहे हैं उससे तेज तीव्रता के आदेश हैं।

0

मैं लिनक्स के लिए भी निश्चित नहीं हूं, लेकिन विंडोज़ पर यह समझाया गया है कि you can't ask the system to not interrupt you for several reasons (पहले पैराग्राफ ज्यादातर)। मेरे सिर से, कारणों में से एक हार्डवेयर इंटरप्ट्स है जो किसी भी समय हो सकता है और जिस पर आपका कोई नियंत्रण नहीं है।

EDIT कुछ लोगों ने अभी sched_yield का उपयोग करने का सुझाव दिया है और फिर उसका जवाब हटा दिया है। हालांकि यह आपकी पूरी प्रक्रिया के लिए समय छोड़ देगा। आपको कर्नेल को संकेत देने के लिए sched_setscheduler का भी उपयोग कर सकते हैं।

3

आप इस तरह के yield के रूप में विभिन्न आदेशों के साथ निष्पादन को रोकने के लिए वर्तमान क्रियान्वित धागा बता सकते है।

बस थ्रेड को रोकने के लिए थ्रेड को गैर-हानिकारक है, 999 बार यह अच्छा अंतराल प्रदान कर सकता है और 1 बार ऐसा नहीं करता है।

आप शायद वास्तविक परिणामों के लिए पर वास्तविक समय शेड्यूलिंग देखना चाहेंगे। यह साइट http://www2.net.in.tum.de/~gregor/docs/pthread-scheduling.html थ्रेड शेड्यूलिंग के बारे में शोध करने के लिए एक अच्छी प्रारंभिक जगह प्रतीत होती है।

1

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

आप अपने "दिल की धड़कन" पाने के लिए ध्वज पर कताई नहीं कर रहे हैं?

1

setitimer() जैसे टाइमर फ़ंक्शन का उपयोग कर सही हैं? सही ???

यदि नहीं, तो आप इसे सब गलत कर रहे हैं।

आपको एक टाइमर अंतराल निर्दिष्ट करने की आवश्यकता हो सकती है जो आपको वास्तव में आवश्यकतानुसार थोड़ा छोटा है। यदि आप रीयल-टाइम शेड्यूलर प्राथमिकता और टाइमर का उपयोग कर रहे हैं, तो आपकी प्रक्रिया लगभग हमेशा समय पर जागृत होगी।

मैं हमेशा समय पर कहूंगा, लेकिन लिनक्स अभी तक एक पूर्ण वास्तविक समय ओएस नहीं है।

+0

'setitimer' को' timer_create' के पक्ष में बहिष्कृत किया गया है। –

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

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