सीपीयू कैसे जानता है कि आईओ लंबित है?


17

मैं iowaitशीर्ष उपयोगिता आउटपुट में दिखाए गए गुण को नीचे दिखाए गए अनुसार देख रहा हूं ।

top - 07:30:58 up  3:37,   1 user,  load average: 0.00, 0.01, 0.05
Tasks:  86 total,   1 running,   85 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

iowait आम तौर पर निम्नानुसार परिभाषित किया जाता है:

"यह वह समय है जिसके दौरान CPU निष्क्रिय है और कुछ IO लंबित है।"

यह मेरी समझ है कि एक प्रक्रिया एक ही सीपीयू पर चलाई जाती है। डी-शेड्यूल्ड हो जाने के बाद या तो इसने अपने टाइम स्लॉट का उपयोग किया है या ब्लॉक होने के बाद, इसे अंततः किसी एक सीपीयू पर फिर से शेड्यूल किया जा सकता है।

आईओ अनुरोध के मामले में, एक सीपीयू जो एक प्रक्रिया को निर्बाध नींद में रखता है, iowaitसमय पर नज़र रखने के लिए जिम्मेदार है । अन्य सीपीयू उनके अंत के निष्क्रिय समय के समान ही रिपोर्ट कर रहे होंगे क्योंकि वे वास्तव में निष्क्रिय हैं। क्या यह धारणा सही है?

इसके अलावा, यह मानते हुए कि एक लंबा IO अनुरोध है (जिसका अर्थ है कि प्रक्रिया में अनुसूचित होने के कई अवसर थे, लेकिन IO पूरा नहीं होने के कारण अनुसूचित नहीं हुआ), CPU को कैसे पता चलता है कि "लंबित IO" है? उस तरह की जानकारी कहां से प्राप्त की गई है? एक सीपीयू बस कैसे पता लगा सकता है कि एक आईओ को पूरा करने के लिए कुछ समय सोने के लिए कुछ प्रक्रिया रखी गई थी क्योंकि कोई भी सीपीयू उस प्रक्रिया को सोने के लिए डाल सकता था। "लंबित आईओ" की इस स्थिति की पुष्टि कैसे की जाती है?


3
"एक प्रक्रिया एक ही सीपीयू पर चलाई जाती है"। ज़रुरी नहीं। एक सीपीयू कोर पर एक धागा चलाया जाता है, लेकिन आधुनिक प्रक्रियाओं में कई धागे होते हैं और आधुनिक सीपीयू में कई कोर होते हैं।
15

@MSalters और फिर भी, जबकि एक एकल धागा किसी भी बिंदु पर केवल एक कोर पर निष्पादित कर सकता है, जिस समय कोर जिस पर निष्पादित होता है वह संदर्भ स्विच के बाद बदल सकता है।
JAB

1
इस बात बाधा अनुरोध (IRQ) कहा जाता है, लेकिन यह शायद अधिक हार्डवेयर की तुलना में हम में रुचि रखने वाले रहे हैं।
mathreadler

जवाबों:


33

CPU को इसका कोई भी पता नहीं है, जो कार्य अनुसूचक करता है।

आपके द्वारा बोली गई परिभाषा कुछ भ्रामक है; द करेंटprocfs(5) मैनपेज की अधिक सटीक परिभाषा है, जिसमें केवेट हैं:

iowait (लिनक्स 2.5.41 के बाद से)

(5) I / O के पूरा होने का समय। यह मान विश्वसनीय नहीं है, निम्नलिखित कारणों से:

  1. सीपीयू I / O के पूरा होने का इंतजार नहीं करेगा; iowaitवह समय है जब एक कार्य I / O के पूरा होने की प्रतीक्षा कर रहा है। जब कोई CPU बकाया कार्य I / O के लिए निष्क्रिय अवस्था में जाता है, तो इस CPU पर एक और कार्य निर्धारित किया जाएगा।

  2. मल्टी-कोर CPU पर, I / O के पूर्ण होने की प्रतीक्षा करने वाला कार्य किसी भी CPU पर नहीं चल रहा है, इसलिए iowaitप्रत्येक CPU की गणना करना मुश्किल है।

  3. इस फ़ील्ड में मान कुछ स्थितियों में घट सकता है।

iowaitसामान्य रूप से I / O के इंतजार में बिताए गए समय को मापने की कोशिश करता है। यह एक विशिष्ट सीपीयू द्वारा ट्रैक नहीं किया जाता है, न ही यह हो सकता है (ऊपर 2 बिंदु - जो भी आप के बारे में सोच रहे हैं) से मेल खाता है। यह सीपीयू के अनुसार मापा जाता है , जहाँ तक संभव हो।

कार्य अनुसूचक "जानता है" वहां I / O लंबित है, क्योंकि यह जानता है कि इसने किसी दिए गए कार्य को निलंबित कर दिया है क्योंकि यह I / O की प्रतीक्षा कर रहा है। के in_iowaitक्षेत्र में इसे प्रति कार्य ट्रैक किया जाता है task_struct; आप के लिए देख सकते in_iowaitमें अनुसूचक कोर को देखने के लिए कि यह कैसे, सेट पर नज़र रखी और मंजूरी दे दी है। लिनक्स लोड औसत पर ब्रेंडन ग्रेग के हाल के लेख में उपयोगी पृष्ठभूमि जानकारी शामिल है। जब कोई टाइमर टिक होता है, तब iowaitप्रवेश होता है /proc/stat, जो तब समाप्त होता है top, जब सीपीयू निष्क्रिय होता है, और वर्तमान प्रक्रिया "चालू" होती है; आप इसे शेड्यूलर के CPU टाइम-ट्रैकिंग कोडaccount_idle_time में देख सकते हैं

तो एक और अधिक सटीक परिभाषा होगी "इस CPU पर I / O के इंतजार में बिताया गया समय, जब करने के लिए कुछ भी बेहतर नहीं था" ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.