ВУЗ:
Составители:
64
Легко понять, что программы, управляющие внешними устройствами или
файловыми системами и вообще работающие с разделяемыми объектами, не могут быть
реентерабельными.
Во многих случаях оказывается выгодно рассматривать нереентерабельную
программу как разделяемый ресурс и распределять доступ к нему теми же способами,
что и к принтеру. Таким же образом микроядро организует доступ пользовательских
программ к модулям ОС.
Очень широкий класс проблем - проблемы синхронизации, возникающие при
попытках организовать взаимодействие нескольких программ.
Первая, самая простая из них, состоит в вопросе - если одна задача производит
данные, а вторая их потребляет, то как задача-потребитель узнает, что готова очередная
порция данных? Или, что еще интереснее, как она узнает, что очередная порция данных
еще не готова?
Типичный случай такого взаимодействия - асинхронное чтение с диска, когда
программа дает дисковому драйверу запрос: “читай с такого-то сектора в такой-то блок
памяти”, и продолжает заниматься своими делами.
Другая проблема называется проблемой критических секций. Например, одна
программа вставляет данные в разделяемый двунаправленный список, а другая достает
их оттуда. Те, кто знаком с алгоритмом вставки в список, легко поймут, что есть
момент, когда указатели элементов показывают вовсе не туда, куда надо. Попытка
произвести в этот момент какую-то другую операцию изменения списка приведет к
полному разрушению его структуры, а чтение или поиск закончатся аварией. Поэтому
изменяющая программа должна каким-то образом блокировать доступ к списку на
время изменения. Часто это делается теми же средствами, что и разделение ресурсов.
Большинство решений всех вышеперечисленных проблем сводится к созданию
какого-то средства, сообщающего программе, что произошло то или иное внешнее или
внутреннее событие. При этом программа может остановиться, ожидая заданного
события.
К методам синхронизации процессов относятся следующие средства Linux:
•сигналы;
•семафоры;
•блокировка участков файлов;
•гармонически взаимодействующие последовательные процессы.
Сигналы были рассмотрены в одной из предыдущих глав.
Семафоры
Если необходимо спроектировать простой и удобный механизм синхронизации,
лучше всего объединить проверку флага и засыпание процесса в единую операцию,
которая не может быть прервана исполнением другого процесса. Распространив эту
идею на случай взаимодействия более чем двух процессов, мы приходим к механизму,
известному под названием семафоров Дийкстры.
Семафор Дийкстры представляет собой целочисленную переменную, с которой
ассоциирована очередь ожидающих процессов. Пытаясь пройти через семафор, процесс
пытается вычесть из значения переменной 1. Если значение переменной больше или
равно 1, процесс проходит сквозь семафор успешно (семафор открыт). Если переменная
равна нулю (семафор закрыт), процесс останавливается и ставится в очередь.
Закрытие семафора соответствует захвату ресурса, доступ к которому
контролируется этим семафором. Процесс, закрывший семафор, захватывает ресурс.
Если ресурс захвачен, остальные процессы вынуждены ждать его освобождения.
Легко понять, что программы, управляющие внешними устройствами или файловыми системами и вообще работающие с разделяемыми объектами, не могут быть реентерабельными. Во многих случаях оказывается выгодно рассматривать нереентерабельную программу как разделяемый ресурс и распределять доступ к нему теми же способами, что и к принтеру. Таким же образом микроядро организует доступ пользовательских программ к модулям ОС. Очень широкий класс проблем - проблемы синхронизации, возникающие при попытках организовать взаимодействие нескольких программ. Первая, самая простая из них, состоит в вопросе - если одна задача производит данные, а вторая их потребляет, то как задача-потребитель узнает, что готова очередная порция данных? Или, что еще интереснее, как она узнает, что очередная порция данных еще не готова? Типичный случай такого взаимодействия - асинхронное чтение с диска, когда программа дает дисковому драйверу запрос: “читай с такого-то сектора в такой-то блок памяти”, и продолжает заниматься своими делами. Другая проблема называется проблемой критических секций. Например, одна программа вставляет данные в разделяемый двунаправленный список, а другая достает их оттуда. Те, кто знаком с алгоритмом вставки в список, легко поймут, что есть момент, когда указатели элементов показывают вовсе не туда, куда надо. Попытка произвести в этот момент какую-то другую операцию изменения списка приведет к полному разрушению его структуры, а чтение или поиск закончатся аварией. Поэтому изменяющая программа должна каким-то образом блокировать доступ к списку на время изменения. Часто это делается теми же средствами, что и разделение ресурсов. Большинство решений всех вышеперечисленных проблем сводится к созданию какого-то средства, сообщающего программе, что произошло то или иное внешнее или внутреннее событие. При этом программа может остановиться, ожидая заданного события. К методам синхронизации процессов относятся следующие средства Linux: •сигналы; •семафоры; •блокировка участков файлов; •гармонически взаимодействующие последовательные процессы. Сигналы были рассмотрены в одной из предыдущих глав. Семафоры Если необходимо спроектировать простой и удобный механизм синхронизации, лучше всего объединить проверку флага и засыпание процесса в единую операцию, которая не может быть прервана исполнением другого процесса. Распространив эту идею на случай взаимодействия более чем двух процессов, мы приходим к механизму, известному под названием семафоров Дийкстры. Семафор Дийкстры представляет собой целочисленную переменную, с которой ассоциирована очередь ожидающих процессов. Пытаясь пройти через семафор, процесс пытается вычесть из значения переменной 1. Если значение переменной больше или равно 1, процесс проходит сквозь семафор успешно (семафор открыт). Если переменная равна нулю (семафор закрыт), процесс останавливается и ставится в очередь. Закрытие семафора соответствует захвату ресурса, доступ к которому контролируется этим семафором. Процесс, закрывший семафор, захватывает ресурс. Если ресурс захвачен, остальные процессы вынуждены ждать его освобождения. 64
Страницы
- « первая
- ‹ предыдущая
- …
- 62
- 63
- 64
- 65
- 66
- …
- следующая ›
- последняя »