Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Theory 2.Architecture _Unix.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
239 Кб
Скачать
☆

6.7. Средства взаимодействия процессов

Все средства взаимодействия процессов, описанные нами в главе 9 части I, обеспечиваются в ОС Unix.

Программные каналы являются средством обеспечения взаимодействия между процессами. В старых реализациях Unix обеспечивались классические межпрограммные каналы, неименованные и именованные, описанные в разделе 9.6 части I. В новых версиях базовый интерфейс каналов остался тем же, но их внутренние механизмы изменились. Теперь программные каналы называются базирующимися на потоках и при создании канала создаются два разнонаправленных потока, по которым данные движутся по правилам FIFO.

Сигналы в Unix являются не столько средством взаимодействия между процессами, сколько средством взаимодействия между ядром и процессами. Сигналы посылаются ядром процессу, чтобы сообщить процессу о некотором событии, чаще всего представляющем собой возникновение некоторой нештатной ситуации. В Open Unix имеется 31 тип сигналов, которые можно разделить на группы:

  • сигналы, связанные с оборудованием, такие как: сигналы об ошибках на шинах передачи данных, ошибках при выполнении арифметических операций, ошибках доступа к памяти и т.п.;

  • сигналы, связанные с программными событиями: сигнал завершения процесса, сигналы от интервального таймера, сигналы, которыми процессы обмениваются между собой и т.п.;

  • сигналы, связанные с вводом-выводом, сигнализирующие о событиях в потоках ввода-вывода;

  • сигналы управления заданиями: приостановки и пуска процессов в группе, сигналы о событиях в процессе-потомке и т.п.;

  • сигналы управления ресурсами, сообщающие о превышении процессом лимитов использования ресурсов;

  • сигналы о событиях на легковесных процессах, обрабатываемые модулями библиотеки нитей.

Разделяемые области памяти являются весьма широко применяемым средством обмена данными между процессами. Один процесс создает разделяемую область памяти при помощи системного вызова shmget, другие - присоединяют область памяти к своему виртуальному адресному пространству при помощи системного вызова shmat.

Набор семафоров в Unix представляет собой множество традиционных общих семафоров, число которых задается при создании набора семафоров в системном вызове semget. Процесс, создавший набор семафоров, может выполнять над ним любые операции, и он определяет права управления любым семафором из набора (при помощи системного вызова semctl) для других процессов, использующих семафор. Каждый отдельный семафор состоит из следующих элементов:

  • значение семафора,

  • идентификатор последнего из процессов, работавших с семафором,

  • количество процессов, ожидающих увеличения значения семафора,

  • количество процессов, ожидающих момента, когда значение семафора станет равным 0.

Выполнение собственно семафорных операций над любым семафором из набора обеспечивается системным вызовом semop. Возможные операции над семафором:

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

  • уменьшение значения семафора на заданное число, если при этом значение семафора становится равным нулю, выводятся из состояния приостановки все процессы, ожидающие этого события;

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

Очереди сообщений в Unix полностью совпадают с очередями, описанными нами в разделе 9.7 части I. Тела сообщений сохраняются в адресном пространстве ядра. Заголовки сообщений в очереди составляют связный список, каждый элемент которого содержит:

  • указатель на следующее сообщение в списке;

  • тип сообщения;

  • размер тела сообщения;

  • адрес тела сообщения.

Каждая очередь описывается структурой, содержащей:

  • указатели на первое и последнее сообщения в очереди;

  • текущее число байт и текущее число сообщений в очереди;

  • максимальное число байт в очереди;

  • идентификаторы процессов, пославшего и получившего последнее сообщение в очередь/из очереди;

  • времена последней посылки сообщения и последнего получения сообщения.

Введение нитей потребовало также и введения средств синхронизации выполнения нитей внутри одного процесса. Системная библиотека нитей обеспечивает ряд специальных средств синхронизации. Эти средства используются только внутри одного процесса. Средства синхронизации нитей включают в себя:

Замок взаимного исключения (mutual exclusion lock). Операции установки замка и снятия замка идентичны скобкам критической секции.

Зацикленный замок (spin lock) - аналогичен простому замку, но вместо ожидания в приостановке обеспечивает занятое ожидание. Такие замки защищают нить от вытеснения с легковесного процесса при ожидании на замке.

Рекурсивный замок (recursive lock) - аналогичен простому замку, но исключает самоблокирование нити при рекурсивном входе в критическую секцию.

Замок чтения-записи (reader-writer lock) - обеспечивает нахождение в критической секции в каждый момент времени не более одной нити-"писателя" и любого числа нитей-"читателей".

Семафор - традиционный общий семафор с несколько ограниченными возможностями управления по сравнению с семафорами, применяемыми при взаимодействии процессов.

Барьер - средство, обратное замкам. Барьер создает "критическую секцию", в которую может войти только заданное количество нитей одновременно.

Переменная условия (condition variable) - аналог событий. Обеспечивает перевод нити в ожидания до тех пор, пока эта переменная не будет установлена в другой нити.

При освобождении нитей, ожидающих на средствах синхронизации, применяются следующие правила:

  • связанные нити пользуются абсолютным преимуществом перед мультиплексируемыми;

  • для освобождения выбирается нить с наивысшим приоритетом;

  • при равенстве приоритетов нити освобождаются в порядке FIFO.

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