Семафоры. Последовательность системных вызовов. 


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



ЗНАЕТЕ ЛИ ВЫ?

Семафоры. Последовательность системных вызовов.



Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам. Семафоры используются при передаче данных через разделяемую память.

Семафоры лучше всего предствлять себе как счетчики, управляющие

доступом к общим ресурсам. Чаще всего они используются как блокирующий

механизм, не позволяющий одному процессу захватить ресурс, пока этим

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

трудные для восприятия из всех трех видов IPC-объектов. Для полного

понимания, что же такое семафор, мы их немного пообсуждаем, прежде чем

переходить к системным вызовам и операционной теории.

Слово семафор в действительности является старым

железнодорожным термином, соответствующим "рукам", не дающим

траекториям каров пересекаться на перекрестках. То же самое можно сказать и

про семафоры. Семафор в положении ON (руки пондяты вверх) если

ресурс свободен и в положении OFF (руки опущены) если ресурс

недоступен (надо ждать).

Для работы с семафорами определены следующие функции: semget, semop, semctl.

Значение sem_op   Смысл
Положительное число Увеличить значение указанного семафора на эту величину
Отрицательное число Уменьшить значение указанного семафора на эту величину
  Проверять равенство значения семафора нулю

 

 

Параметры функции semget.

Прототип функции semget имеет следующий вид:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget (key_t key, int пит_sem, int flag);

Эта функция "открывает" набор семафоров, идентификатор которого задан значением аргумента key, и возвращает неотрицательный целочисленный дескриптор. Его можно использовать в других вызовах семафоров для запроса я

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

Если значение аргумента key — положительное целое, рассматриваемый вызов пробует открыта набор семафоров, ключевой идентификатор которого совпадает с указанным значением. Если же значением key является макрос IPC_PRIVATE, вызов создает новый набор семафоров, который будет использоваться исключительно вызывающим процессом. Такие "частные" семафоры обычно выделяются родительским процессом, создающим затем один или несколько порожденных процессов. Родительский и порожденные процессы пользуются этими семафорами для синхронизации своей работы.

При нулевом значений аргумента flag вызов прерывает свою работу, если отсутствует набор семафоров, ключевой идентификатор которого совпадал бы с заданным значением key; в противном случае возвращается дескриптор этого

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

IРС_СREAT и числовых значений прав доступа к новому набору для чтения и записи.

Значение num_sem может быть равно нулю, если флаг IPC_CREAT в аргументе flag не указан, или числу семафоров во вновь создаваемом наборе.

Для гарантированного создания нового набора семафоров можно указать одновременно с флагом IPC_CREAT флаг IPC_EXCL. Тогда вызов будет успешно выполнен только в том случае, если он создаст новый набор с заданным значением

В случае неудачи этот вызов возвращает -1.

Параметры функции semop.

Прототип функции semop имеет следующий вид:

#include<sys/types.h>
#include<sys/ipc.h>
#inciude<sys/sem.h>
int semop (int semfd,struc sembuf* opPtr, int len);

С помощью этой функции можно изменять значение одного или нескольких семафоров в наборе (указанном аргументом semfd) и/или проверять равенство их значений нулю. Аргумент opPtr — это указатель на массив объектов типа struct sembuf, каждый из которых задает одну операцию (запрос или изменение значения). Аргумент len показывает, сколько элементов имеется в массиве, указанном аргументом opPtr.

Тип данных struct sembuf определяется в заголовке <sys/sem.h>: struct sembuf{

short sem_num;//индекссемафора short sem_op; // операция над семафором short sem_flg; //флаг(и) операции };

Переменная sem_op может иметь следующие значения.

Для работы с семафорами определены следующие функции: semget, semop и semctl.

Если вызов semop попытается уменьшить значение семафора до отрицательного числа или посчитает, что значение семафора равно нулю, когда на самом деле это не так, то ядро заблокирует вызывающий процесс. Этого не произойдет в том случае, если в полях sem_flg элементов массива, где semop меньше или равно нулю, указан флаг IPC NOWAIT.

В случае успешного выполнения этот вызов возвращает нуль, а в случае
неудачи -1.

 

 

Параметры функции semctl.

Прототип функции semctl имеет следующий вид:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl(int semfd, int num, int cmd, union semun arg);

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

Значение semfd — это дескриптор набора семафоров, который берется из вызова функции semget.

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

Аргумент arg — это объект типа union, который может использоваться для задания или выборки управляющих параметров одного или нескольких семафоров набора в соответствии с аргументом cmd. Тип данных union semun
определяется в заголовке <sys/sem.h>

union semun{

int val; //значение семафора

struct semid_ds *buf; //управляющие параметры набора

ushori *array{ // массив значении семафоров

IPC_STAT Копировать управляющие параметры набора в объект, указанный аргументом arg_buf. У вызывающего процесса должно быть право на чтение набора

IPC SET Заменить управляющие параметры набора семафоров данными, определенными в объекте, на который указывает аргумент arg.buf. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права привилегированного пользователя, создателя или назначенного владельца набора. Этот вызов может устанавливать U1D владельца набора и идентификатор его группы, а также права доступа

IPC RMID Удалить семафор из системы. Чтобы выполнить эту операцию, вызывающий процесс должен иметь права привилегированного пользователя, создателя или назначенного владельца набора

GETALL Скопировать все значения семафоров в массив, на который указывает arg.array

SETALL Установить все значения семафоров равными значениям, содержащимся в массиве, на который указывает arg.anay

GETVAL Возвратить значение семафора с номером num. Аргумент arg не используется

SETVAL Установить значение семафора с номером num, равным значению, указанному в arg.val

GETPID Возвратить идентификатор процесса, который выполнял операции над семафором с номером num последним. Аргумент arg не используется.

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

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

В случае успешного выполнения этот вызов возвращает значение, соответствующее конкретному cmd, а в случае неудачи — -1.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-06; просмотров: 196; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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