A CPU não sabe nada disso, o agendador de tarefas faz.
A definição que você cita é um pouco enganosa; a procfs(5)
manpage atual tem uma definição mais precisa, com ressalvas:
iowait
(since Linux 2.5.41)(5) Time waiting for I/O to complete. This value is not reliable, for the following reasons:
The CPU will not wait for I/O to complete;
iowait
is the time that a task is waiting for I/O to complete. When a CPU goes into idle state for outstanding task I/O, another task will be scheduled on this CPU.On a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the
iowait
of each CPU is difficult to calculate.The value in this field may decrease in certain conditions.
iowait
tenta medir o tempo gasto esperando por E / S, em geral. Não é rastreado por uma CPU específica, nem pode ser (ponto 2 acima - que também corresponde ao que você está pensando). É medida por CPU, na medida do possível.
O agendador de tarefas "sabe" que há E / S pendente, porque sabe que suspendeu uma determinada tarefa porque está aguardando E / S. Isso é rastreado por tarefa no campo in_iowait
do task_struct
; você pode procurar in_iowait
no núcleo do agendador para ver como ele é definido, rastreado e limpo. O recente artigo de Brendan Gregg sobre as médias de carga do Linux inclui informações básicas úteis. A entrada iowait
em /proc/stat
, que é o que acaba em top
, é incrementada sempre que um tick do timer é contabilizado, e o processo atual “on” na CPU está ocioso; você pode ver isso procurando account_idle_time
no código de rastreamento de tempo da CPU do agendador .
Assim, uma definição mais precisa seria "tempo gasto com essa CPU esperando por E / S, quando não havia nada melhor para fazer" ...