ВУЗ:
Составители:
65
Закончив работу с ресурсом, процесс увеличивает значение семафора на
единицу, открывая его. При этом первый из стоявших в очереди процессов
активизируется, вычитает из значения семафора единицу, и снова закрывает семафор.
Если же очередь была пуста, то ничего не происходит, просто семафор остается
открытым. Тогда первый процесс, подошедший к семафору, успешно пройдет через
него.
Наиболее простым случаем семафора является двоичный семафор. Начальное
значение флаговой переменной такого семафора равно 1, и вообще она может
принимать только значения 1 и 0. Двоичный семафор соответствует случаю, когда с
разделяемым ресурсом в каждый момент времени может работать только одна
программа.
Семафоры общего вида могут принимать любые неотрицательные значения.
Это соответствует случаю, когда несколько процессов могут работать с ресурсом
одновременно, или когда ресурс состоит из нескольких независимых, но равноценных
частей - например, несколько одинаковых принтеров. При работе с такими семафорами
часто разрешают процессам вычитать и добавлять к флаговой переменной значения,
большие единицы. Это соответствует захвату/освобождению нескольких частей
ресурса.
При доступе к нескольким различным ресурсам с использованием семафоров
возникает специфическая проблема, называемая мертвой блокировкой (dead lock).
Рассмотрим две программы, использующие доступ к двум различным ресурсам.
Например, один процесс копирует данные со стримера на кассету Exabyte, а другой - в
обратном направлении. Доступ к стримеру контролируется семафором sem1, а к кассете
- семафором sem2.
Первая программа сначала закрывает семафор sem1, затем sem2. Вторая
программа поступает наоборот. Поэтому, если вторая программа получит управление и
защелкнет sem2 в промежутке между соответствующими операциями первой
программы, то мы получим мертвую блокировку - первая программа никогда не
освободит sem1, потому что стоит в очереди у sem2, занятого второй программой,
которая стоит в очереди у sem1, занятого первой... Все остальные программы,
пытающиеся получить доступ к стримеру или кассете, также будут становиться в
соответствующие очереди и ждать, пока администратор не убьет одну из зависших
программ.
Эта проблема может быть решена несколькими способами. Первый способ -
разрешить программе в каждый момент времени держать закрытым только один
семафор - прост и решает проблему в корне, но часто оказывается неприемлемым.
Более приемлемым оказывается соглашение, что семафоры всегда должны закрываться
в определенном порядке. Этот порядок может быть любым, важно только чтобы он
всегда соблюдался.
Третий, наиболее радикальный, вариант состоит в предоставлении
возможности объединить семафоры и/или операции над ними в неразделяемые группы.
При этом программа может выполнить операцию закрытия семафоров sem1 и sem2
единой командой, во время исполнения которой никакая другая программа не может
получить доступ к этим семафорам.
Можно показать, что любые проблемы взаимодействия и синхронизации
процессов могут - с большими или меньшими трудностями - быть решены при помощи
семафоров. На практике трудности иногда оказываются не то, чтобы слишком
большими, но нежелательными. Поэтому большинство ОС кроме семафоров
предоставляет и другие средства синхронизации.
Закончив работу с ресурсом, процесс увеличивает значение семафора на единицу, открывая его. При этом первый из стоявших в очереди процессов активизируется, вычитает из значения семафора единицу, и снова закрывает семафор. Если же очередь была пуста, то ничего не происходит, просто семафор остается открытым. Тогда первый процесс, подошедший к семафору, успешно пройдет через него. Наиболее простым случаем семафора является двоичный семафор. Начальное значение флаговой переменной такого семафора равно 1, и вообще она может принимать только значения 1 и 0. Двоичный семафор соответствует случаю, когда с разделяемым ресурсом в каждый момент времени может работать только одна программа. Семафоры общего вида могут принимать любые неотрицательные значения. Это соответствует случаю, когда несколько процессов могут работать с ресурсом одновременно, или когда ресурс состоит из нескольких независимых, но равноценных частей - например, несколько одинаковых принтеров. При работе с такими семафорами часто разрешают процессам вычитать и добавлять к флаговой переменной значения, большие единицы. Это соответствует захвату/освобождению нескольких частей ресурса. При доступе к нескольким различным ресурсам с использованием семафоров возникает специфическая проблема, называемая мертвой блокировкой (dead lock). Рассмотрим две программы, использующие доступ к двум различным ресурсам. Например, один процесс копирует данные со стримера на кассету Exabyte, а другой - в обратном направлении. Доступ к стримеру контролируется семафором sem1, а к кассете - семафором sem2. Первая программа сначала закрывает семафор sem1, затем sem2. Вторая программа поступает наоборот. Поэтому, если вторая программа получит управление и защелкнет sem2 в промежутке между соответствующими операциями первой программы, то мы получим мертвую блокировку - первая программа никогда не освободит sem1, потому что стоит в очереди у sem2, занятого второй программой, которая стоит в очереди у sem1, занятого первой... Все остальные программы, пытающиеся получить доступ к стримеру или кассете, также будут становиться в соответствующие очереди и ждать, пока администратор не убьет одну из зависших программ. Эта проблема может быть решена несколькими способами. Первый способ - разрешить программе в каждый момент времени держать закрытым только один семафор - прост и решает проблему в корне, но часто оказывается неприемлемым. Более приемлемым оказывается соглашение, что семафоры всегда должны закрываться в определенном порядке. Этот порядок может быть любым, важно только чтобы он всегда соблюдался. Третий, наиболее радикальный, вариант состоит в предоставлении возможности объединить семафоры и/или операции над ними в неразделяемые группы. При этом программа может выполнить операцию закрытия семафоров sem1 и sem2 единой командой, во время исполнения которой никакая другая программа не может получить доступ к этим семафорам. Можно показать, что любые проблемы взаимодействия и синхронизации процессов могут - с большими или меньшими трудностями - быть решены при помощи семафоров. На практике трудности иногда оказываются не то, чтобы слишком большими, но нежелательными. Поэтому большинство ОС кроме семафоров предоставляет и другие средства синхронизации. 65
Страницы
- « первая
- ‹ предыдущая
- …
- 63
- 64
- 65
- 66
- 67
- …
- следующая ›
- последняя »