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


Спин-блокировки

Одним из широко применяемых приемов синхронизации является блокирование. Когда управляющий тракт ядра должен обратиться к совместно используемой структуре или войти в критическую область, ему необходимо получить блокировку”. Ресурс, защищенный блокировкой, аналогичен ресурсу, находящемуся в комнате, дверь которой заперта на замок, когда внутри кто-то находится. Если управляющий тракт ядра желает обратиться к ресурсу, он пытается открыть дверь”, иначе говоря, получить блокировку. Ему это удается, только если ресурс свободен. Затем тракт пользуется ресурсом, сколько ему нужно, а дверь остается запертой. Когда тракт освобождает блокировку, дверь отпирается, и другой тракт ядра может войти в комнату.

Пять трактов ядра (РО, PI, Р2, РЗ и Р4) пытаются обратиться к двум критическим областям (С1 и С2). Тракт РО находится внутри области С1, а тракты Р2 и Р4 ждут своей очереди. В то же время тракт Р1 находится внутри области С2, а тракт РЗ ждет. Обратите внимание, что тракты РО иР1 могут выполняться параллельно. Замок критической области СЗ открыт, поскольку она не нужна никакому тракту.
Спин-блокировки— это специальный вид блокировок, разработанных для использования в многопроцессорной среде. Если тракт ядра обнаруживает, что спин-блокировка "открыта", он получает блокировку и продолжает свое выполнение. Если же потоку становится известно, что блокировка "закрыта" (захвачена) управляющим трактом ядра, работающим на другом процессоре, он "крутится" на одном месте, выполняя "плотный" цикл, пока блокировка не будет освобождена.

Цикл инструкций, выполняемых потоком при спин-блокировке, является "ожиданием без прекращения выполнения". Ожидающий тракт ядра продолжает выполняться процессором, хотя он впустую тратит время. Тем не менее спин-блокировки обычно оказываются очень удобными, поскольку многие ресурсы ядра запираются всего лишь на долю миллисекунды, а на освобождение процессора и последующее его получение у потока ушло бы гораздо больше времени.
В качестве общего правила вытеснение в ядре отключается в каждой критической области, защищенной спин-блокировками. В однопроцессорной системе блокировки сами по себе бесполезны, и примитивы— спин-блоки- ровки — просто отключают и включают вытеснение в ядре. Обратите внимание, что на этапе ожидания без прекращения выполнения вытеснение в ядре еще не отключено, и процесс, ожидающий освобождения спин-блокировки, может быть замещен процессом с более высоким приоритетом.

В Linux каждая спин-блокировка представлена структурой spiniock t, состоящей из двух полей:

- slock— кодирует состояние спин-блокировки: соответствует открытой спин-блокировке, а любое отрицательное значение и 0 — закрытой;
- break iock— флаг, сигнализирующий, что процесс ожидает освобождения блокировки без прекращения выполнения (присутствует, только если ядро поддерживает как симметричную многопроцессорную обработку, так и вытеснение в ядре).
Шесть макросов служат для инициализации, проверки и установки спин-блокировок. Все они основаны на атомарных операциях, и это является гарантией, что спин-блокировка будет обновлена корректно, даже если несколько процессов, работающих на разных процессорах, одновременно попытаются модифицировать его.

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