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


Когда в синхронизации нет необходимости

Некоторые подходы к проектированию ядра, обсуждавшиеся в предыдущей главе, в определенной степени облегчают синхронизацию потоков ядра. Приведем их краткий обзор:
- все обработчики прерываний подтверждают получение прерывания на программируемом контроллере прерываний, а также отключают линию IRQ. То же самое прерывание больше не возникает, пока не завершится обработчик;
- обработчики прерываний, softirq-функции и тасклеты не могут быть ни вытеснены, ни блокированы, поэтому их выполнение не может быть приостановлено на долгое время. В худшем случае возможна некоторая задержка из-за других прерываний, возникших по ходу выполнения этих функций (это и есть вложенное выполнение трактов ядра);
- тракт ядра, обрабатывающий прерывание, не может быть прерван трактом, выполняющим функцию отложенного выполнения или служебную процедуру системного вызова;
- softirq-функции и тасклеты не могут чередоваться на одном процессоре;
- один тасклет не может выполняться одновременно на нескольких процессорах.
Каждое из этих решений можно рассматривать как своего рода ограничение, которое можно эксплуатировать для облегчения кодирования некоторых функций ядра.

Приведем несколько примеров возможных упрощений:

- нет необходимости кодировать обработчики прерываний и тасклеты как реентерабельные функции;
- процессорные переменные, к которым обращаются только 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 без про...

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

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

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

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

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

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

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