Linux Kernel (Ядро линукса) (часть 1)


Структуры данных для рабочих очередей

Основная структура, ассоциированная с рабочей очередью, — это дескриптор по имени workqueue struct, который среди прочих данных содержит массив из nr cpus элементов (это максимальное количество процессоров в системе). Каждый элемент является дескриптором типа cpu_workqueue_struct
Поле worklist структуры cpu workqueue struct ЯВЛЯетСЯ ГОЛОВОЙ Двунаправ- ленного списка, в котором собраны висящие функции из рабочей очереди. Каждая висящая функция представлена структурой work struct

Функции рабочей очереди

Функция create workqueue (fffooff) принимает в качестве параметра строку СИМВОЛОВ И возвращает адрес дескриптора workqueue_struct для только что созданной рабочей очереди. Кроме того, функция создает п рабочих потоков названных в соответствии со строкой, переданной в качестве параметра: foo/0, foo/1 И Т. Д. Функция create_singlethread_workqueueработает аналогично, но создает только один рабочий поток, независимо от количества процессоров. Чтобы разрушить рабочий поток, ядро вызывает функцию destroy workqueueO, которая принимает в качестве параметра указатель на массив workqueue_struct.

Функция queue work ставит в рабочую очередь функцию (уже упакованную внутрь дескриптора work struct). В качестве параметров она принимает указатель wq на дескриптор workqueue struct и указатель work на дескриптор work struct.

Функция queue work выполняет следующие действия:

1. Проверяет, не находится ли уже в очереди функция, подлежащая постановке в очередь (поле work->pending равно 1). Если находится, происходит возврат управления.
2. Добавляет дескриптор work struct в список рабочей очереди и устанавливает переменную work->pending в единицу.
3. Если рабочий ПОТОК СПИТ в очереди more_work дескриптора сри_ workqueue struct, принадлежащего локальному процессору, функция будит его.
Функция queue delayed work практически идентична функции queue work , но она принимает третий параметр, задающий задержку по времени в системных тактах. Она используется для обеспечения минимальной задержки перед выполнением висящей функции. На практике функция queue delayed work полагается в своей работе на программный таймер в поле timer дескриптора work struct, когда нужно отложить фактическую постановку дескриптора work struct в рабочую очередь. Функция cancei_ deiayed worko отменяет функцию из рабочей очереди, ранее запланированную к выполнению, при условии, что соответствующий дескриптор work struct еще не был занесен в список рабочей очереди.
Каждый рабочий поток непрерывно выполняет цикл внутри функции worker thread , причем большую часть времени поток спит в ожидании работы. Будучи разбуженным, ОН вызывает функцию run_workqueue , которая удаляет каждый дескриптор work struct из списка рабочей очереди данного потока и выполняет соответствующую висящую функцию. Поскольку функции из рабочей очереди могут блокироваться, рабочий поток может вернуться в состояние сна и даже мигрировать на другой процессор после пробуждения.
Иногда ядру приходится ждать, пока выполнятся все висящие функции рабочей очереди. Функция flush workqueue принимает адрес дескриптора workqueue struct и блокирует вызвавший процесс, пока не закончится выполнение всех висящих функций из рабочей очереди. Однако функция flush workqueue не ждет завершения функций, добавленных в рабочую очередь после ее вызова, причем для распознавания только что добавленных
ВИСЯЩИХ функций ИСПОЛЬЗуюТСЯ ПОЛЯ remove sequence И insert sequence Де- СКрИПТОра cpu_workqueue_struct.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...