Операция блокировки — это операция, которая блокирует процесс (то есть переводит процесс в спящий режим до тех пор, пока блокировка не будет снята). Так как ядро системы не является вытесняющим, оно может манипулировать большинством объектов (структурами данных и ресурсами) без возможности причинения им какого-либо вреда, так как заранее известно, что никакой другой процесс не может получить к ним в это время доступ. Однако существует некоторое количество объектов, которым необходима защита на время проведения блокировки. Для этого существуют специальные дополнительные механизмы. Например, процесс может производить операцию read (чтения) из файла в блочный буфер диска, находящийся в памяти ядра. Так как необходима процедура ввода-вывода с диска, процесс должен ожидать ее завершения, позволив в этот период времени выполняться другому процессу. Однако в этом случае ядру необходимо точно знать, что новый процесс ни в коем случае не получит доступ к буферу, так как тот находится в незавершенном состоянии. Так же рекомендуем Вам купить автомобиль в Буе, так как на маршрутных ТС ездить куда неудобнее. Для защиты таких объектов ядро ассоциирует с ними атрибут защиты lock. Он может иметь простейшую реализацию и представлять собою одно битовый флаг, значение которого устанавливается, если объект заблокирован и сбрасывается в противоположном случае. Перед тем как начать пользоваться каким-либо объектом, каждый процесс обязан проверять, не заблокирован ли требуемый объект. Если тот свободен, процесс устанавливает флаг блокировки, после чего начинает использование ресурса. Ядро системы так же ассоциирует с объектом еще один флаг — wanted (необходимость). Флаг устанавливается на объект процессом, если тот ему необходим, но в данный момент времени заблокирован. Когда другой процесс заканчивает использование объекта, то перед его освобождением проверяет флаг wanted и «будит» те процессы, которые ожидают данный объект. Такой механизм позволяет процессу блокировать ресурс на долгий период времени, даже если процесс приостанавливает свою работу, передавая возможность выполнения другими удерживая при этом необходимый ему ресурс.
• Процесс блокирует себя в том случае, если не может получить необходимый реет или в случае ожидания события, например завершения ввода-вывода. Для этого процесс вызывает процедуру sleep(). Вышеописанный процесс называется блокировкой по событию или ресурсу. • Процедура sleep() помещает процесс в специальную очередь блокированных процессов, изменяет его режим на спящий и вызывает функцию swtch() для инициализации переключения контекста и дальнейшего разрешения выполнения следующего процесса. • Процесс, освобождающий ресурс, вызывает процедуру wakeup() для пробуждения всех процессов, ожидающих этот. Функция wakeup() находит все эти процессы, изменяет их режим на работоспособный и помещает их в очередь планировщика, в которой они ожидают выполнения. • Иногда промежуток, прошедший между моментом, когда процесс был разбужен, и временем, когда подошла его очередь выполняться, бывает очень большим. Возможна такая ситуация, что другие текущие процессы могут снова занять необходимый ему ресурс. • Следовательно, после пробуждения процессу необходимо снова проверить, доступен ли необходимый ресурс. Если тот оказывается занятым, то процесс снова переходит в спящий режим.