Ядро Linux в комментариях


__Wait_event


    __wait_event переводит процесс в режим ожидания в очереди wq до тех пор, пока condition не станет истинным.

    Локальная переменная __wait связывается с очередью через вызов add_wait_queue (строка ). Следует отметить, что __wait хранится на стеке, а не в куче ядра — это один из типичных трюков, примененных в ядре. __wait удаляется из очереди ожидания перед завершением макроса, так что указатель на __wait в очереди оказывается всегда допустимым.

    Циклическая передача управления другим процессам до тех пор, пока не будет удовлетворено условие (см. ниже).

    Процесс переводится в состояние TASK_UNINTERRUPTIBLE (строка ), которое означает, что процесс находится в режиме ожидания и не должен из него выходить даже по сигналу. Сигналы описываются в , а состояния процессов — в .

    Если условие удовлетворяется, цикл может быть завершен.

    Заметьте, что если условие истинно при первом проходе цикла, присваивание в предыдущей строке оказывается излишним, поскольку установка состояния процесса выполняется еще раз после завершения цикла. Однако, __wait_event исходит из предположения, что к моменту начала выполнения макроса условие еще не удовлетворено. Нет ничего вредного в некоторой задержке установки переменной состояния процесса. В очень редких случаях может оказаться так, что условие было ложным в начале выполнения __wait_event и истинным в момент достижения строки . Такое изменение приведет к проблеме лишь в случае, если condition оценивается в фрагменте кода, где важную роль играет то, в какое состояние переходит процесс. Ничего подобного в коде ядра я не встречал.

    Вызов schedule (строка , см. ) для переключения ЦП на другой процесс. Возврат из вызова schedule не будет осуществлен до тех пор, пока процесс не получит ЦП вновь — это произойдет только после активизации процесса из очереди ожидания.

    Цикл завершен, так что условие удовлетворено. Процесс переводится в состояние TASK_RUNNING (строка ) и он готов продолжать свое выполнение.

    Процесс удаляется из очереди ожидания путем вызова remove_wait_queue (строка ).




    - Начало -  - Назад -  - Вперед -



    Книжный магазин