Когда два или более процесса требуют специального доступа к разделяемому ресурсу, они вынуждены устроить состязание за управление данным блоком кода. Базовой формой блокировки в Linux является циклическая блокировка.
Циклическая блокировка (spinlock) получила свое имя благодаря тому факту, что она выполняется циклически или крутится (spin), ожидая наступления блока. Благодаря такой работе циклической блокировки желательно не вставлять в циклически блокируемый код никаких повторных блокировок. Иначе может произойти ступор системы.
В Linux 2.6 реализовано новое неявное приоритетное прерывание обслуживания ядра. Когда задача ядра получает управление процессором, его обслуживание может приоритетно прерываться только другой задачей ядра, если она не содержит никаких блокировок. Каждая задача имеет поле preempt__count, помечающее задачу как приоритетно прерываемую. Счетчик увеличивается каждый раз, когда задача блокируется, и уменьшается, когда разблокируется. Функция schedule () отключает приоритетное прерывание обслуживания, когда определяет, какую задачу запустить следующей.
Жогда ядро завершает обработку задачи пользовательского пространства и готово пере-лвп> управление задаче пользовательского пространства, оно сперва проверяет, какой за-jne можно передать управление. Это не должна быть задача пользовательского пространства, которая передает управление ядру. Например, если задача А порождает сис-шный вызов, после завершения системного вызова ядро передает управление системой жиаче В.
Каждая задача в системе имеет флаг «необходимости перепланировки», который усевается, когда задачу следует перепланировать:
include/linux/sched.h
Проще всего понять явное приоритетное прерывание обслуживания в ядре. Оно происхо-JW в пространстве ядра, когда код ядра вызывает schedule (). Код ядра может schedule () двумя способами: либо с помощью прямого вызова schedule (), шао с помощью блокировки.
Когда происходит явное приоритетное прерывание обслуживания в ядре, как, например, в драйвере устройства, ожидающем в wait_queue, управление просто передается и для выполнения выбирается новая задача.
Приритетное прерывание обслуживания - это переключение одной задачи на другую. Ми упоминали как schedule () и scheduler_tick() решают, на какую задачу далее, но мы еще не описали, как Linux решает, когда выполнить. В ядре 2.6 представлено приоритетное прерывание обслуживания, швчающее, что как программы пользовательского пространства, так и программы ядра могут быть переключены в одно и то же время. Так как в Linux 2.6 при-iqpiiLiHoe прерывание обслуживания является стандартным, мы опишем, как работает прерывание обслуживания для ядра и пользовательских задач в Linux.