Для этих четырех типов алгоритмов требуются различные уровни и типы синхронизации. Их диапазон довольно широк: от стратегии доступа, реализация которой требует минимальной синхронизации, до стратегии доступа, реализация которой требует максимальной синхронизации. Наша задача— реализовать эти стратегии, поддерживая целостность данных и удовлетворительную производительность системы. EREW — самая простая для реализации стратегия, поскольку она предполагает, по сути, только последовательную обработку. На первый взгляд самой простой может показаться стратегия CRCW, но она таит в себе массу трудностей. А ведь это только кажется, что если к памяти можно получить доступ без ограничений, то в ней и речь не идет о какой бы то ни было стратегии. Все как раз наоборот: CRCW — самая трудная для реализации стратегия, которая требует максимальной синхронизации.
Рис. 5.4. Стратегии доступа EREW, CREW, ERCW и CRCW |
Семафор — это механизм синхронизации, который можно использовать для управления отношениями между параллельно выполняющимися программными компонентами и реализации стратегий доступа к данным. Семафор — это переменная специального вида, которая может быть доступна только для выполнения узкого диапазона операций. Семафор используется для синхронизации доступа процессов и потоков к разделяемой модифицируемой памяти или для управления доступом к устройствам или другим ресурсам. Семафор можно рассматривать как ключ к ресурсам. Этим ключом может владеть в любой момент времени только один процесс или поток. Какал бы задача ни владела этим ключом, он надежно запирает (блокирует) нужные ей ресурсы для ее монопольного использования. Блокирование ресурсов заставляет другие задачи, которые желают воспользоваться этими ресурсами, ожидать до тех пор, пока они не будут разблокированы и снова станут доступными. После разблокирования ресурсов следующая задача, ожидающая семафор, получает его и доступ к ресурсам. Какал задача будет следующей, определяется стратегией планирования, действующей для данного потока или процесса.
Операции по управлению семафором
Как упоминалось выше, к семафору можно получить доступ только с помощью специальных операций, подобных тем, которые выполняются с объектами. Это операции декремента, P(), и инкремента, V(). Если объект Mutex представляет собой семафор, то логика реализации операций P (Mutex)и V (Mutex) м ожет выглядеть таки м образо м:
P(Mutex)
if (Mutex > 0) {
Mutex--;
} else {
Блокирование по объекту Mutex;
}
V(Mutex)
if(Oчepeдь доступа к объекту Mutex не пуста){
Передача объекта Мьютекс следующей задаче;
} else {
Mutex++;
}
Реализация зависит от конкретной систе м ы. Эти операции неделимы, т.е. их невозможно прервать. Если операцию P() попытаются выполнить сразу несколько задач, то лишь одна из них получит разрешение продолжить работу. Если объект Mutexбыл уже декре м ентирован, то задача будет заблокирована и зай м ет м есто в очереди. Операци я V() вызываетс я задачей, которая и м еет доступ к объекту Mutex.Если получения доступа к объекту Мьютексожидают дру г ие задачи, он «передается » следующей задаче из очереди. Если очередь задач пуста, объект Mutexинкрементируетс я.
Операции с семафором могут иметь другие имена:
Операци я P():lock()
Операци я V():unlock()
Значение семафора зависит от его типа. Двоичный семафор будет иметь значение 0 или 1. Вычислительный семафор (определяю щ ий лимиты ресурсов для процессов, получающих доступ к ним) может иметь некоторое неотрицательное целочисленное значение.
Стандарт POSIX определяет несколько типов семафоров. Эти семафоры испо л ьзуются процессами или потоками. Типы семафоров (а также их некоторые основные операции) перечислены в табл. 5.1.
Таблица5 .1. Типы семафоров, определенные стандартом POSIX
Тип семафора |
Пользователь |
Описание |
Мьютексный семафор |
Процессы или потоки |
Механизм, используемый для реализации взаимного исключения в критическом разделе кода |
Блокировка для обеспечения чтения и записи |
Процессы или потоки |
Механизм, используемый д л я реализации стратегии доступа для чтения и записи среди потоков |
Условная переменная |
Процессы или потоки |
Механизм, используемый д л я уведом л ения потоков о том, что произош л о событие. |
|
|
Событийный мьютекс остается заблокированным потоком до тех пор, пока не будет получен соответствующий сигнал |
Несколько условных переменных |
Процессы или потоки |
Аналогичен событийному мьютексу, но включает несколько событий или условий |
Операционные системы, которые не противоречат спецификации Single UNIX Specification или стандарту POSIX Standard, поддерживают реализацию семафоров, которые являются частью библиотеки libpthread (соответствующие функции объявлены в заголовке pthread. h).
Читать дальше