मेरे पास एक लिनक्स सिस्टम पर चलने वाला थ्रेड है जिसे मुझे सटीक अंतराल के रूप में निष्पादित करने की आवश्यकता है। जैसे एक बार हर एमएस निष्पादित करें।लिनक्स, सटीक प्रोग्राम समय की आवश्यकता है। शेड्यूलर प्रोग्राम अप
वर्तमान में यह
timerfd_create(CLOCK_MONOTONIC, 0)
साथ एक टाइमर बनाने, और फिर
timerfd_settime (fd, 0, &itval, NULL);
एक अवरुद्ध कॉल पढ़ के साथ एक struct में वांछित सोने का समय गुजर द्वारा किया जाता है इस टाइमर जो रुकती है पर किया जाता है थ्रेड निष्पादन और रिपोर्ट्स वेकअप कॉल खो गया।
समस्या यह है कि उच्च आवृत्तियों पर, सिस्टम समय सीमा खोने लगता है, भले ही CPU उपयोग 10% से कम हो। मुझे लगता है कि यह शेड्यूलर के कारण है जो ब्लॉकिंग कॉल को जांचने के लिए अक्सर थ्रेड को जागता नहीं है। क्या कोई ऐसा आदेश है जिसका उपयोग मैं शेड्यूलर को निश्चित अंतराल पर धागे को जागने के लिए कह सकता हूं, जहां तक यह संभव है? व्यस्त-प्रतीक्षा एक खराब विकल्प है क्योंकि सिस्टम कई अन्य कार्यों को संभालता है।
धन्यवाद।
क्या आप इसे रीयल-टाइम शेड्यूलर पर चला रहे हैं? मेरे अनुभव में जो मिलीसेकंड के आदेश पर अंतराल के लिए पर्याप्त होना चाहिए, जब तक आपके कर्नेल में कोई बुरी तरह से व्यवहार करने वाले ड्राइवर न हों। (बेशक, लिनक्स एक विशेषज्ञ आरटीओएस नहीं है, और इस बात की कोई गारंटी नहीं है कि आप कभी भी समय सीमा याद नहीं करेंगे।) –