2012-06-19 13 views
8

के कारण कोई धागा या प्रक्रिया भूखा हो रही है, यह पता लगाने के लिए कि यह लिनक्स ओएस पर है। ऐप लाइब्रेरी के साथ सी ++ में ऐप लिखा गया है।ओएस शेड्यूलिंग

मुझे संदेह है कि प्रक्रिया में धागे में से एक कभी-कभी असामान्य रूप से लंबे समय (5 से 40 सेकंड) के लिए अवरुद्ध हो रहा है। यह ऐप उस समय कुछ बार छोड़कर दिन में ठीक से चलता है। भारी सॉकेट आने वाले डेटा के कारण बॉक्स पर चल रहे अन्य समान 5 ऐप्स भी हैं I/O बाध्य हैं।

मैं जानना चाहता हूं कि क्या कोई चीज है जो मैं प्रोग्रामेटिक रूप से कर सकता हूं यह देखने के लिए कि थ्रेड/प्रक्रिया को अपना समय टुकड़ा मिल रहा है या नहीं।

उत्तर

3

यदि कोई प्रक्रिया भूखा हो रही है, तो उस प्रक्रिया के लिए स्वयं निगरानी उस उत्पादक नहीं होगी। लेकिन, अगर आप यह प्रक्रिया को नोटिस करना चाहते हैं तो यह थोड़ी देर में नहीं चला है, यह समय-समय पर times पर कॉल कर सकता है और अनुसूचित उपयोगकर्ता समय में सापेक्ष अंतर के साथ व्यतीत समय में सापेक्ष अंतर की तुलना कर सकता है (आप tms_utime और tms_cutime फ़ील्ड यदि आप उत्पादक समय के रूप में बच्चों के लिए प्रतीक्षा करना चाहते हैं, और आप tms_stime और tms_cstime फ़ील्ड्स में योग करेंगे यदि आप उत्पादक समय के लिए आपकी तरफ से कर्नेल समय बिताते हैं)। थ्रेड टाइम्स के लिए, मुझे पता है कि एकमात्र तरीका /proc फाइल सिस्टम से परामर्श करना है।

एक उच्च प्राथमिकता बाहरी प्रक्रिया या उच्च प्राथमिकता धागा प्रक्रिया के लिए उपयुक्त /proc/<pid>/stat प्रविष्टियों (और /proc/<pid>/task/<tid>/stat धागे के लिए) पढ़ने के द्वारा बाहरी रूप से प्रक्रियाओं (और धागे) की निगरानी कर सकता है। उपयोगकर्ता के समय stat फ़ाइल के 14 वें और 16 वें क्षेत्रों में पाए जाते हैं। सिस्टम के समय 15 वें और 17 वें क्षेत्रों में पाए जाते हैं। (फ़ील्ड की स्थिति मेरे लिनक्स 2.6 कर्नेल के लिए सटीक है।)

दो बार बिंदुओं के बीच, आप पारित होने वाले विलुप्त समय की मात्रा निर्धारित करते हैं (एक मॉनीटर प्रक्रिया या धागा आम तौर पर नियमित अंतराल पर जागृत होता है)। फिर उन समय बिंदुओं में संचयी प्रसंस्करण के समय के बीच का अंतर दर्शाता है कि उस समय ब्याज के धागे को कितना समय चलाना था। समय बीतने के समय प्रसंस्करण का अनुपात समय टुकड़ा का प्रतिनिधित्व करेगा।

एक जानकारी के अंतिम बिट: लिनक्स पर, मैं /proc/<pid>/task/ निर्देशिका में सही task की जांच के लिए वर्तमान धागे की tid प्राप्त करने के लिए निम्नलिखित का उपयोग करें:

tid = syscall(__NR_gettid); 

मैं यह कर, क्योंकि मैं नहीं कर सका gettid सिस्टम कॉल वास्तव में मेरे सिस्टम पर किसी भी पुस्तकालय द्वारा निर्यात किया गया है, भले ही इसे दस्तावेज किया गया हो। लेकिन, यह आपके लिए उपलब्ध हो सकता है।

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