Когда процесс ожидает ввода-вывода, как состояние задачи обновляется до TASK_INTERRUPTABLE (то есть, заблокировано)?Как состояние процесса обновляется до состояния блокировки (TASK_INTERRUPTABLE)?
Представьте себе этот случай, процесс выдает запрос ввода-вывода блочному устройству. Согласно моему предыдущему thread, процесс, наконец, вызывает elv_add_request()
, чтобы добавить запрос в очередь ввода-вывода. Так что я думаю, в этом elv_add_request()
вызов, реализация будет что-то вроде:
elv_add_request(){
// Register IO_CALLBACK()
set_task_state(task, TASK_INTERRUPTABLE); // blocked
// flush IO request to disk
...
}
IO_CALLBACK(){
set_task_state(task, TASK_RUNNING); // IO completed, ready to run
}
Логика такова: Когда запрос ввода-вывода закончен, он будет использовать функции обратного вызова, чтобы уведомить ядро, что процесс готов Теперь. Имеет ли это смысл?
Если это так, то как осуществляется обратный вызов маханизма? Это функция CPU/hardware?