русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Семафоры


Дата добавления: 2014-11-28; просмотров: 922; Нарушение авторских прав


Механизм семафоров, реализованный в UNIX-системах, является обобщением классического механизма семафоров, предложенного известным голландским спе-


330________________ Глава 10. Краткий обзор современных операционных систем

циалистом профессором Дейкстрой. Семафор в операционной системе семейства UNIX состоит из следующих элементов:

- значения семафора;

- идентификатора процесса, который хронологически последним работал с се­мафором;

- числа процессов, ожидающих увеличения значения семафора;
- числа процессов, ожидающих нулевого значения семафора.

Для работы с семафорами имеются следующие три системных вызова: - semget — создание и получение доступа к набору семафоров; - semop — манипулирование значениями семафоров (именно этот системный вызов позволяет с помощью семафоров организовать синхронизацию процес­сов);

- semctl — выполнение разнообразных управляющих операций над набором се­
мафоров.

Системный вызов semget имеет следующий синтаксис:

id = semget(key. count, flag);

Здесь параметры key и flag определяют ключ объекта и дополнительные флаги. Параметр count задает число семафоров в наборе семафоров, обладающих одним и тем же ключом. После этого индивидуальный семафор идентифицируется деск­риптором набора семафоров и номером семафора в этом наборе. Если к моменту выполнения системного вызова semget набор семафоров с указанным ключом уже существует, то обращающийся процесс получит соответствующий дескриптор, но так и не узнает о реальном числе семафоров в группе (хотя позже это все-таки можно узнать с помощью системного вызова semctl). Основным системным вызовом для манипулирования семафором является semop:

oldval = semopdd. oplist, count):

Здесь id — это ранее полученный дескриптор группы семафоров, oplist — массив описателей операций над семафорами группы, a count — размер этого массива. Значение, возвращаемое системным вызовом, является значением последнего об­работанного семафора. Каждый элемент массива oplist имеет следующую структуру:



- номер семафора в указанном наборе семафоров; - операция; - флаги.

Если проверка прав доступа проходит нормально и указанные в массиве oplist но­мера семафоров не выходят за пределы общего размера набора семафоров, то сис­темный вызов выполняется следующим образом. Для каждого элемента массива oplist значение соответствующего семафора изменяется в соответствии со значе­нием поля операции, как показано ниже.

- Если значение поля операции положительно, то значение семафора увеличи­
вается на единицу, а все процессы, ожидающие увеличения значения семафо­
ра, активизируются (пробуждаются — в терминологии UNIX).


Семейство операционных систем UNIX____________________________________ 331

О Если значение поля операции равно нулю и значение семафора также равно нулю, выбирается следующий элемент массива oplist. Если же значение поля операции равно нулю, а значение семафора отлично от нуля, то ядро увеличи­вает на единицу число процессов, ожидающих нулевого значения семафора, причем обратившийся процесс переводится в состояние ожидания (засыпает — в терминологии UNIX).

□ Если значение поля операции отрицательно и его абсолютное значение меньше или равно значению семафора, то ядро прибавляет это отрицательное значение к значению семафора. Если в результате значение семафора стало нулевым, то ядро активизирует (пробуждает) все процессы, ожидающие нулевого значения этого семафора. Если же значение семафора оказывается меньше абсолютной величины поля операции, то ядро увеличивает на единицу число процессов, ожидающих увеличения значения семафора, и откладывает (усыпляет) теку­щий процесс до наступления этого события.

Интересно заметить, что основным поводом для введения массовых операций над семафорами было стремление дать программистам возможность избегать тупико­вых ситуаций, возникающих в связи с семафорной синхронизацией. Это обеспечи­вается тем, что системный вызов semop, каким бы длинным он ни был (по причине потенциально неограниченной длины массива oplist), выполняется как атомарная операция, то есть во время выполнения semop ни один другой процесс не может изменить значение какого-либо семафора.

Наконец, среди флагов-параметров системного вызова semop может содержаться флаг с символическим именем IPC_NOWAIT, наличие которого заставляет ядро UNIX не блокировать текущий процесс, а лишь сообщать в ответных параметрах о воз­никновении ситуации, приведшей к блокированию процесса в случае отсутствия флага IPC_NOWAIT. Мы не будем обсуждать здесь возможности корректного завер­шения работы с семафорами при незапланированном завершении процесса; заме­тим только, что такие возможности обеспечиваются.

Системный вызов semctl имеет следующий формат:

semctKid. number, cmd, arg):

Здесь id — это дескриптор группы семафоров, number — номер семафора в группе, cmd — код операции, arg — указатель на структуру, содержимое которой интерпре­тируется по-разному в зависимости от операции. В частности, с помощью вызова semctl можно уничтожить индивидуальный семафор в указанной группе. Однако детали этого системного вызова настолько громоздки, что лучше рекомендовать в случае необходимости обращаться к технической документации используемого варианта операционной системы.

Программные каналы

Мы уже познакомились с программными каналами в главе 7. Рассмотрим этот механизм еще раз, так сказать, в его исходном, изначальном толковании.

Программные каналы (pipes) в системе UNIX являются очень важным средством взаимодействия и синхронизации процессов. Теоретически программный канал


332________________ Глава 10. Краткий обзор современных операционных систем

позволяет взаимодействовать любому числу процессов, обеспечивая дисциплину FIFO (First In First Out — первый пришедший первым и выбывает). Другими сло­вами, процесс, читающий из программного канала, прочитает те данные, которые были записаны в программный канал раньше других. В традиционной реализации программных каналов для хранения данных использовались файлы. В современ­ных версиях операционных систем семейства UNIX для реализации программных каналов применяются другие средства взаимодействия между процессами (в час­тности, очереди сообщений).

В UNIX различаются два вида программных каналов — именованные и неимено­ванные. Именованный программный канал может служить для общения и синх­ронизации произвольных процессов, знающих имя данного программного канала и имеющих соответствующие права доступа. Неименованным программным кана­лом могут пользоваться только породивший его процесс и его потомки (необяза­тельно прямые).

Для создания именованного программного канала (или получения к нему досту­па) используется обычный файловый системный вызов open. Для создания же не­именованного программного канала существует специальный системный вызов pipe (исторически более ранний). Однако после получения соответствующих дескрип­торов оба вида программных каналов используются единообразно с помощью стан­дартных файловых системных вызовов read, write и close.

Системный вызов pipe имеет следующий синтаксис:

pipe(fdptr);

Здесь fdptr — это указатель на массив из двух целых чисел, в который после созда­ния неименованного программного канала будут помещены дескрипторы, пред­назначенные для чтения из программного канала (с помощью системного вызова read) и записи в программный канал (с помощью системного вызова write). Деск­рипторы неименованного программного канала — это обычные дескрипторы фай­лов, то есть такому программному каналу соответствуют два элемента таблицы открытых файлов процесса. Поэтому при последующих системных вызовах read и write процесс совершенно не обязан отличать случай использования программных каналов от случая использования обычных файлов (собственно, на этом и основа­на идея перенаправления ввода-вывода и организации конвейеров).

Для создания именованных программных каналов (или получения доступа к уже существующим каналам) используется обычный системный вызов open. Основ­ным отличием от случая открытия обычного файла является то, что если имено­ванный программный канал открывается для записи и ни один процесс не открыл тот же программный канал для чтения, то обращающийся процесс блокируется до тех пор, пока некоторый процесс не откроет данный программный канал для чте­ния. Аналогично обрабатывается открытие для чтения.

Запись данных в программный канал и чтение данных из программного канала (не­зависимо от того, именованный он или не именованный) выполняются с помощью системных вызовов read и write. Отличие от случая использования обычных файлов состоит лишь в том, что при записи данные помещаются в начало канала, а при чте­нии выбираются (освобождая соответствующую область памяти) из конца канала.


Семейство операционных систем UNIX___________________________________ 333

Окончание работы процесса с программным каналом (независимо от того, имено­ванный он или не именованный) производится с помощью системного вызова close.



<== предыдущая лекция | следующая лекция ==>
Файловая система | Очереди сообщений


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 3.116 сек.