Як CPU знає, що очікується IO?


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 загалом визначається наступним чином:

"Це час, протягом якого процесор не працює, і очікується деякий вихід IO."

Наскільки я розумію, що процес запускається в одному процесорі. Після того як він буде відкладений або через те, що він використав свій часовий проміжок, або після його блокування, він може з часом бути запланованим знову на будь-якому одному процесорі.

У випадку запиту вводу-виводу, за відстеження iowaitчасу відповідає центральний процесор, який переводить процес у режим безперебійного сну . Інші процесори звітували б у той самий час, що й у режимі очікування, коли вони справді простоюють. Чи правильне це припущення?

Крім того, якщо припустити, що існує тривалий запит на введення вводу (тобто процес мав декілька можливостей для планування, але його не планували, оскільки IO не був завершений), як CPU знає, що існує "очікуваний IO"? Звідки береться така інформація? Як CPU може просто з'ясувати, що деякий процес був увімкнути деякий час, щоб IO завершився, оскільки будь-який із процесорів міг перевести цей процес у режим сну. Як підтверджується такий статус "очікуваного вводу-виводу"?


3
Msgstr "Процес запускається на одному процесорі". Не зовсім. Нитка запускається на одному ядрі процесора, але сучасні процеси мають кілька потоків, а сучасні процесори мають декілька ядер.
MSalters

@MSalters І навіть тоді, хоча один потік може виконуватись лише на одному ядрі в будь-який момент часу, ядро, яке він виконує, може змінюватися після переключення контексту.
JAB

1
Є ця річ, яка називається запит на переривання (IRQ), але це, можливо, більше обладнання, ніж нас цікавить.
mathreadler

Відповіді:


33

ЦП не знає нічого з цього, як і планувальник завдань.

Визначення, яке ви цитуєте, є дещо оманливим; ток procfs(5)сторінка керівництво має більш точне визначення, із застереженнями:

iowait (з Linux 2.5.41)

(5) Час очікування завершення вводу / виводу. Це значення не є надійним з наступних причин:

  1. ЦП не чекатиме завершення вводу-виводу; iowaitце час, який чекає завдання на завершення вводу / виводу. Коли процесор переходить у стан очікування для вводу-виводу невирішеного завдання, на цьому процесорі планується інше завдання.

  2. У багатоядерному процесорі завдання, що чекає завершення вводу-виводу, не виконується на жодному процесорі, тому iowaitобчислювальний процесор важко обчислити.

  3. Значення в цьому полі може зменшуватися за певних умов.

iowaitнамагається виміряти час, витрачений на очікування вводу-виводу. Це не відстежується з допомогою конкретного процесора, і не може бути (пункт 2 вище - що також відповідає тому , що вас цікавить). Він вимірюється на центральний процесор, хоча, наскільки це можливо.

Планувальник завдань "знає", що очікує на введення / виведення, оскільки він знає, що він призупинив задане завдання, оскільки він чекає вводу / виводу. Це відслідковується для кожного завдання в in_iowaitобласті task_struct; ви можете шукати in_iowaitв ядрі планувальника, щоб побачити, як його встановити, відстежити та очистити. Недавня стаття Брендана Грегга про середні завантаження Linux включає корисну довідкову інформацію. iowaitЗапис в /proc/stat, яка є те , що в кінці кінців в top, збільшується кожного разу , коли кліщ таймер враховується і поточний процес «на» CPU знаходиться в режимі очікування; ви можете побачити це, шукаючи account_idle_timeв коді відстеження часу CPU планувальника .

Отже, більш точним було б визначення часу, витраченого на цей процесор на очікування вводу / виводу, коли нічого кращого робити не було ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.