Защита структуры, к которой обращаются обработчики исключений
Если к структуре обращаются только обработчики исключений, конфликты одновременного обращения легко понять и предотвратить. Самыми распространенными исключениями, вызывающими проблемы синхронизации, являются служебные процедуры системных вызовов . При их выполнении процессор работает в режиме ядра, обслуживая программу режима пользователя. Таким образом, структура, к которой обращаются только обработчики исключений, обычно представляет ресурс, который может быть назначен одному или нескольким процессам.
Конфликты одновременного обращения предотвращаются с помощью семафоров, потому что эти примитивы позволяют процессам спать, пока ресурс не станет доступным. Обратите внимание, что семафоры работают одинаково хорошо как в однопроцессорных, так и в многопроцессорных системах.
Вытеснение в ядре не создает проблем. Если процесс, обладающий семафором, вытесняется, новый процесс, работающий на том же процессоре, может попытаться получить семафор. Если это произойдет, новый процесс будет переведен в состояние сна, а старый, в конце концов, освободит семафор. Единственным случаем, в котором вытеснение в ядре должно быть явно отключено, является обращение к процессорным переменным. Это обсуждалось в разд. "Процессорные переменные” ранее в этой главе.
Защита структуры, к которой обращаются обработчики прерываний
Предположим, к некоторой структуре обращается только верхняя половина” обработчика прерываний. мы узнали, что каждый обработчик прерываний сериализован по отношению к самому себе, т. е. он не может выполняться параллельно сам себе. Следовательно, обращение к структуре не требует применения примитивов синхронизации.
Однако картина меняется, если к структуре обращаются несколько обработчиков прерываний. Один обработчик может прервать другой, а в многопроцессорных системах разные обработчики могут выполняться параллельно. Без синхронизации совместная структура данных может быть легко испорчена.
В однопроцессорных системах конфликты нужно предотвращать отключением прерываний во всех критических областях обработчика прерываний. Никакие менее радикальные меры не помогут, потому что другие примитивы синхронизации не справятся с задачей. Семафор может блокировать процесс, поэтому его нельзя применять в обработчике прерываний. Спин-блокировка, наоборот, может "подвесить” систему: если обработчик прерываний, обратившийся к структуре, сам будет прерван, он не сможет освободить блокировку, а новый обработчик будет ждать окончания плотного” цикла спин- блокировки.
Как всегда, в многопроцессорных системах требования еще выше. Конфликтов одновременного обращения нельзя избежать простым отключением локальных прерываний. Действительно, если прерывания отключены на одном процессоре, обработчики прерываний могут быть выполнены на других. Самым удобным способом предотвращения конфликтов является отключение локальных прерываний (чтобы другие обработчики прерываний, выполняемые на том же процессоре, не мешали) в комбинации с захватом спин- блокировки чтения/записи, защищающей структуру данных. Обратите внимание, что эти дополнительные спин-блокировки не подвесят” систему, потому что, даже если обработчик прерываний обнаружит, что спин-бло- кировка занята, обработчик прерываний на другом процессоре, владеющий спин-блокировкой, в конце концов, освободит ее.
В ядре Linux применяется ряд макросов, которые комбинируют отключение и включение локальных прерываний с получением и освобождением спин- блокировок. В однопроцессорных системах эти макросы лишь включают и отключают локальные прерывания и вытеснение в ядре.
Предыдущая страница | 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 | Следующая страница