Шрифт:
Давайте рассмотрим упрощенную основную часть функции
Эта функция выполняет следующие действия в бесконечном цикле.
• Поток переводит себя в состояние ожидания (флаг состояния устанавливается в значение
• Если связанный список действий пуст, то поток вызывает функцию
• Если список не пуст, то поток не переходит в состояние ожидания. Вместо этого он устанавливает свое состояние в значение
• Если список не пустой, то вызывается функция
Функция
Эта функция просматривает в цикле все элементы списка отложенных действий и выполняет для каждого элемента функцию, на которую указывает поле
• Если список не пустой, получить следующий элемент списка.
• Получить указатель на функцию (поле
• Удалить полученный элемент из списка и обнулить бит ожидания в структуре элемента.
• Вызвать полученную функцию.
• Повторить указанные действия.
Взаимоотношения между различными, рассмотренными в этом разделе структурами достаточно запутанные. На рис. 7.1 показана диаграмма, которая эти взаимоотношения поясняет.
Рис. 7.1. Соотношения между отложенными действиями, очередями, действий и рабочими потоками
На самом верхнем уровне находятся рабочие потоки. Может существовать несколько типов рабочих потоков. Для каждого типа рабочих потоков существует один рабочий поток для каждого процессора. Различные части ядра при необходимости могут создавать рабочие потоки. По умолчанию выполняются только рабочие потоки events (события). Каждый рабочий поток представлен с помощью структуры
Например, давайте будем считать, что в дополнение к обычному типу рабочих потоков events был создан еще один тип рабочих потоков — falcon. Также имеется в распоряжении четырехпроцессорный компьютер. Следовательно, выполняется четыре потока типа events (соответственно, определено четыре экземпляра структуры
На самом нижнем уровне находятся отложенные действия. Драйвер создает отложенное действие, которой должно выполниться позже. Действия представлены структурами
Большинство драйверов использует существующие по умолчанию рабочие потоки, которые называются events. Они просты в реализации и в использовании. Однако в некоторых, более серьезных ситуациях необходимо создавать новые специальные рабочие потоки. Например, драйвер файловой системы XFS создает два новых типа рабочих потоков.