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

       

Up


Мы подробно рассмотрели, что происходит, когда ядро пытается приобрести семафор, а также что происходит, когда это не удается. Теперь настало время рассмотреть другую сторону этого уравнения: что происходит при освобождении семафора. Эта часть сравнительно проста.

Атомарное увеличение значения count семафора.

Если результат— меньше или равен 0, какой-то процесс ждет активизации. Функция up переходит вперед к строке .

В функции up применяется такой же прием, как и в функции down: все последующие действия выполняются в отдельной секции ядра, а не в самой функции up. Адрес конца функции up помещается в стек и функция up переходит к функции __up_wakeup (не рассматривается). Она выполняет такие же манипуляции с регистрами, как и в функции __down_failed, и вызывает функцию __up, которая рассматривается ниже.


Функция __up отвечает за активизацию всех процессов, ждущих данный семафор.

Вызов функции wake_one_more (не рассматривается в этой книге), которая проверяет, не ждут ли какие-то процессы данный семафор и, если да, увеличивает значение члена waking, чтобы подать им сигнал, что они могут попытаться захватить семафор.

Используется макрокоманда wake_up (строка ), которая просто вызывает функцию __wake_up (строка ) для активизации всех ждущих процессов.



Содержание раздела