• Сетевая система

    Надежная сетевая система на сайте www.brigo.ru

    brigo.ru





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


Функция dosoftirqO

Функция do softirqO читает битовую маску sofitirq-функций локального процессора и выполняет функции отложенного выполнения, которые соответствуют установленным битам. При выполнении sofitirq-функций могут "всплыть” новые висящие sofitirq-функции. Чтобы обеспечить малое время задержки таких функций, функция do softirqO продолжает работать, пока все висящие sofitirq-функции не будут выполнены. Этот подход, однако, может привести к тому, что функция do softirqO будет работать достаточно долго, задерживая процессы режима пользователя. По этой причине функция do softirqO выполняет фиксированное количество итераций, а затем возвращает управление. Оставшиеся висящие sofitirq-функции, если таковые имеются, будут в свое время обработаны потоком ядра ksofitirqd, описанным в следующем разделе.

Приведем краткое описание действий, выполняемых функцией:

1. Инициализирует счетчик итераций значением .
2. Копирует битовую маску sofitirq-функций локального процессора (выбранную макросом local softirq pending () ) В локальную переменную pending.
3. Вызывает функцию iocai_bh_disabieо, чтобы увеличить счетчик sofitirq- функций. На первый взгляд кажется странным, что функции отложенного выполнения, должны быть запрещены перед началом их выполнения, но в этом есть глубокий смысл. Поскольку функции отложенного выполнения выполняются, в основном, при включенных прерываниях, по ходу
работы функции do softirqO может возникнуть прерывание. Когда функция do iRQO выполняет функцию irq exito, может стартовать еще один экземпляр функции do softirqO. Этого необходимо избежать,
поскольку функции отложенного выполнения должны выполняться на процессоре последовательно. Поэтому первый экземпляр функции do softirq запрещает выполнение функций отложенного выполнения,чтобы любой новый экземпляр этой функции закончил работу после шага функции do sof tirq .
4. Сбрасывает битовую карту softirq-функций локального процессора, чтобы новые softirq-функции могли быть активизированы (битовая маска уже сохранена в локальной переменной pending на шаге ).
5. Вызывает функцию iocai_irq_enabie, чтобы включить локальные прерывания.
6. Для каждого установленного бита в локальной переменной pending вызывает соответствующую softirq-функцию. Вспомним, что адрес softirq- функции С ИНДеКСОМ п ХраНИТСЯ В Переменной softirq_vec [n] ->action.
7. Вызывает функцию locai irq disabieо, чтобы отключить локальные прерывания.
8. Копирует битовую маску softirq-функций локального процессора в локальную переменную pending и еще раз уменьшает счетчик итераций.
9. Если переменная pending не равна 0 (то есть хотя бы одна softirq-функция была активизирована после начала последней итерации) и счетчик итераций все еще положителен, функция возвращается к шагу .
10. Если имеются висящие softirq-функции, функция вызывает функцию wakeup softirqdo, чтобы разбудить поток ядра, который отвечает за выполнение softirq-функций на локальном процессоре
11. Вычитает 1 из счетчика softirq-функций, тем самым разрешая выполнение функций отложенного выполнения.

Предыдущая страница | 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 без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...