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


Семафоры чтения/записи

Семафоры чтения/записи аналогичны спин-блокировкам чтения/записи, описанным ранее, с тем отличием, что ожидающий процесс приостанавливается, а не крутит” цикл, пока семафор не будет открыт.

Несколько управляющих трактов ядра могут одновременно получить семафор чтения/записи на чтение, но любой пишущий тракт должен иметь исключительный доступ к защищенному ресурсу. Поэтому семафор может быть получен на запись, только когда никакой другой тракт ядра не держит его ни на чтение, ни на запись. Семафоры чтения/записи повышают уровень параллельности в ядре, тем самым повышая общую производительность системы.
Ядро обрабатывает все процессы, ожидающие семафора чтения/записи строго по принципу первым вошел — первым вышел”. Каждый читающий или пишущий тракт ядра, обнаруживший, что семафор закрыт, ставится в конец очереди ожидания семафора. Когда семафор освобождается, ядро анализирует процессы в начале очереди. Первый процесс пробуждается в любом случае. Если это пишущий процесс, другие процессы в очереди продолжают спать. Если это читающий процесс, все следующие читающие процессы, вплоть до первого пишущего, тоже пробуждаются и получают блокировку. Читающие процессы, которые стоят в очереди после пишущего, продолжают спать.

Каждый семафор чтения/записи представлен структурой rw semaphore, состоящей из следующих полей:
- count— содержит два 16-битовых счетчика. Счетчик в старшем слове хранит в дополнительном коде сумму количества не ожидающих пишущих трактов (либо 0, либо 1) и количества ожидающих трактов ядра. Счетчик в младшем слове кодирует сумму неожидающих читающих и пишущих трактов;
- wait list — указывает на список ожидающих процессов. Каждый элемент этого списка является структурой rwsem waiter, включающей в себя указа
тель на дескриптор спящего процесса и флаг, показывающий, для чтения или записи нужен семафор этому процессу;
- wait iock— спин-блокировка, используемая для защиты очереди ожидания И самой структуры rw_semaphore.
Функция init rwsemO инициализирует структуру rw semaphore, обнуляя ПОЛе count, приводя спин-блокировку wait iock в состояние разблокировано” и инициализируя СПИСОК wait list пустым списком.

Функции down readO и down_write получают семафор чтения/записи на чтение и на запись соответственно. Аналогичным образом, функции up read и up write освобождают семафор чтения/записи, занятый процессом. Функции down_read_trylock И down_write_trylock аналогичны функ- ЦИЯМ down read И down write СООТВеТСТВеННО, НО ОНИ Не блокируют ПрО- цесс, если семафор занят. Наконец, функция downgrade write атомарно трансформирует блокировку для записи в блокировку для чтения. Реализация этих пяти функций имеет довольно объемистый код, но в нем легко разобраться, т. к. он аналогичен реализации обычных семафоров. Поэтому мы не станем описывать эти функции.

Предыдущая страница | 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...