Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 65 стр.

UptoLike

Составители: 

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