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