Синхронизация процессов при помощи семафоров 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Синхронизация процессов при помощи семафоров



 

Когда процесс выдает запрос ввода-вывода, он блокирует себя в ожидании завершения соответствующей операции ввода-вывода. Заблокированный процесс должен быть активизирован каким-либо другим процессом. Подобное взаимодействие может служить при­мером функций, относящихся к протоколу блокирования/возобнов­ления.

Рассмотрим более общий случай, когда одному процессу необ­ходимо, например, чтобы он получал уведомление о наступлении некоторого события. Предположим, что какой-либо другой процесс может обнаружить, что данное событие произошло. Программа рис. 3 показывает, каким образом при помощи семафора можно реализовать простой механизм синхронизации (блокирования/во­зобновления) для двух процессов.

program блокированиевозобновления;

var событие: семафор;

procedure процессодин;

Begin

предшествующиеоператорыодин;

Р(событие);

прочиеоператорыодин

end;

procedure процессдва;

Begin

предшествующиеоператорыдва;

V(событие);

прочиеоператорыдва

end;

Begin

инициализациясемафора(событие,0);

Parbegin

процессодин;

процессдва parend

end;

Рис. 3. Синхронизация блокирования/возобновление процессов при помощи семафоров.

 

Здесь «процессодин» выполняет некоторые «предшествующие операторыодин», а затем операцию Р (событие). Ранее при инициализа­ции семафор был установлен в нуль, так что «процессодин» будет ждать. Со временем «процессдва» выполнит операцию V (событие), сигнализируя о том, что данное событие произошло. Тем самым «процессодин» получает возможность продолжить свое выполнение.

Отметим, что подобный механизм будет выполнять свои функ­ции даже в том случае, если «процессдва» обнаружит наступление события и просигнализирует об этом еще до того, как «процессодин» выполнит операцию Р (событие); при этом семафор переключится из 0 в 1, так что операция Р (событие) просто произведет обратное Переключение, из 1 в 0, и «процессодин» продолжит свое выполнение без ожидания.

 

 

Достаточное условие детерменированности Беристайна.

·
R(P) - набор входных переменных

· W(P) - набор выходных переменных

Если:

Пересечение W(P) и W(Q) пусто

Пересечение W(P) и R(Q) пусто

Пересечение R(P) и W(Q) пусто

Тогда выполнение P и Q детерминировано

Семафоры. Операция над семафорами.

Операции над семафорами

 

Системный вызов semop(2) производит операции над одним или более

семафорами из набора. Операции увеличивают или уменьшают значение

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

нулевым.

 

Аргументы этого системного вызова таковы:

 

semid Идентификатор набора семафоров, полученный от semget(2).

 

sops Адрес массива с элементом типа struct sembuf, задающих

операции над семафорами. По этому адресу должно размещаться

nsops таких структур. Эта структура определена следующим

образом:

 

sys/sem.h:

struct sembuf {

     ushort sem_num; /* semaphore */

     short sem_op; /* semaphore operation */

     short sem_flg; /* operation flags */

};

 

Поля этой структуры имеют следующий смысл:

 

sem_num Индекс семафора, над которым производится операция, в

         наборе.

 

sem_op Если это значение положительно, оно добавляется к

         текущему значению семафора. Обычно это означает

         разблокировку или освобождение соответствующего

         количества ресурсов.

         Если sem_op отрицательно, и его абсолютное значение

         больше текущего значения семафора, операция обычно

         блокируется. Иначе, из семафора просто вычитается

         абсолютное значение этого поля. Обычно это означает

         блокировку или захват соответствующего количества

         ресурсов.

         Если sem_op равен нулю, операция блокируется, пока

         семафор не станет нулевым.

 

sem_flg Это поле задает дополнительные флаги. Нулевое

         значение означает, что не задано никаких

         флагов.Допустимы следующие флаги:

 

         IPC_NOWAIT Если установлен этот флаг, и операция не

                    может быть выполнена, semop(2) возвращает

                    неуспех вместо блокировки, которая

                    происходит обычно. Этот флаг может быть

                    использован для анализа и изменения

                    значения семафора без блокировки.

         SEM_UNDO Если этот флаг установлен, при завершении

                    программы (как нормальном, так и

                    ненормальном), значение семафора  будет

                    установлено таким, какое оно было до

                    операции. Это защищает от "посмертной"

                    блокировки ресурса программой, которая

                    ненормально завершилась, не успев

                    освободить ресурс.

Замечание: При выполнении операции над несколькими

семафорами, значения семафоров не меняются, пока не окажется,

что все требуемые операции могут быть успешно выполнены.

Помните, что блокировка может произойти при работе без

IPC_NOWAIT, когда программа ожидает нулевого значения или

пытается выполнить вычитание.

 

nsops Количество структур в массиве, на который указывает sops.

nsops должен всегда быть больше или равен 1.

                 ОПЕРАЦИИ НАД СЕМАФОРАМИ

semop(2)

 

ИМЯ

 

     semop - операции над семафорами

 

ИСПОЛЬЗОВАНИЕ

 

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

 

int semop(int semid, struct smbuf *sops, unsigned nsops);

 

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

 

     успех - ноль

 

     неуспех - -1 и errno установлена

 

 



Поделиться:


Последнее изменение этой страницы: 2021-03-10; просмотров: 86; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.109.201 (0.01 с.)