Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Семафоры, как средство взаимодействия процессов System VIPC. Понятие атомарной операции. Массив семафоров.




Для синхронизации доступа нескольких процессов к разделяемым ресурсам предназначены семафоры, т.е. семафоры не предназначены для передачи больших объемов данных, как FIFO или очереди. Семафоры разрешают или запрещают доступ к ресурсам. Пример: пусть разделяемый ресурс – файл. Необходимо блокировать доступ к нему других ресурсов, пока какой-то процесс использует его. Свяжем с ним целую величину(счетчик), который будет доступен всем процессам, т.е. д.б. ресурсом ядра. Допустим 1-доступность ресурса, 0-недоступность. Тогда процесс до начала работы проверяет счетчик, если ресурс занят, процесс ждет. =>после освобождения ресурса, процесс может работать с ресурсом, но должен заблокировать его для других процессов (счетчик=0). после завершения работы счетчик =1. Счетчик в примере играет роль семафора. Единственный способ обеспечить атомарность критических операций – работа в режиме ядра. Семафор будет представлять собой не один счетчик, а группу из нескольких, объединенных общими признаками( напр. дискриптором объекта). В Unix каждое из этих чисел может принимать любое неотрицательное значение. В нашем примере семафор – массив семафоров.

Системный вызов semget()

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget(key_t key, int nsems,int semflg);

Системный вызов semget предназначен для выполнения операции доступа к массиву IPC-семафоров и, в случае ее успешного завершения, возвращает дескриптор System V IPC для этого массива (целое неотрицательное число, однозначно характеризующее массив семафоров внутри вычислительной системы и использующееся в дальнейшем для других операций с ним).

Параметр key является ключом System V IPC для массива семафоров, т. е. фактически его именем из пространства имен System V IPC. В качестве значения этого параметра может использоваться значение ключа, полученное с помощью функции ftok(), или специальное значение IPC_PRIVATE. Использование значения IPC_PRIVATE всегда приводит к попытке создания нового массива семафоров с ключом, который не совпадает со значением ключа ни одного из уже существующих массивов и не может быть получен с помощью функции ftok() ни при одной комбинации ее параметров.

Параметр nsems определяет количество семафоров в создаваемом или уже существующем массиве. В случае, если массив с указанным ключом уже имеется, но его размер не совпадает с указанным в параметре nsems, констатируется возникновение ошибки.

Параметр semflg – флаги – играет роль только при создании нового массива семафоров и определяет права различных пользователей при доступе к массиву, а также необходимость создания нового массива и поведение системного вызова при попытке создания. Он является некоторой комбинацией (с помощью операции побитовое или – "|") следующих предопределенных значений и восьмеричных прав доступа:

IPC_CREAT — если массива для указанного ключа не существует, он должен быть создан

IPC_EXCL — применяется совместно с флагом IPC_CREAT. При совместном их использовании и существовании массива с указанным ключом, доступ к массиву не производится и констатируется ошибка, при этом переменная errno, описанная в файле <errno.h>, примет значение EEXIST

Вновь созданные семафоры инициируются нулевым значением.

Возвращаемое значение: Системный вызов возвращает значение дескриптора System V IPC для массива семафоров при нормальном завершении и значение -1 при возникновении ошибки.

Системный вызов semop()

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semop(int semid, struct sembuf *sops,int nsops);

Системный вызов semop предназначен для выполнения операций над семафрами.

Параметр semid является дескриптором System V IPC для набора семафоров, т. е. значением, которое вернул системный вызов semget() при создании набора семафоров или при его поиске по ключу.

Каждый из nsops элементов массива, на который указывает параметр sops, определяет операцию, которая должна быть совершена над каким-либо семафором из массива IPC семафоров, и имеет тип структуры struct sembuf, в которую входят следующие переменные:

short sem_num — номер семафора в массиве IPC семафоров (нумеруются, начиная с 0);

short sem_op — выполняемая операция;

short sem_flg — флаги для выполнения операции. В нашем курсе всегда будем считать эту переменную равной 0.

Unix допускает 3 операции над семафорами:

Если sem_op>0, то ресурс можно взять и значение семафора увеличить на эту величину.

Если sem_op=0, процесс блокируется (ожидание, пока семафор не станет равным нулю).

Если sem_op<0, процесс блокируется до тех пор, пока значение семафора не станет больше по модулю, чем sem_op, затем модуль sem_op вычитается из семафора.

Возвращаемое значение: Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.

Необходимо программировать структуры, определяющие операции запирание/освобождение ресурса, а только потом использовать их в semop.

Семафор для примера берем бинарный:

int i,id;

struct sembuf lock[2]={0,0,0;0,1,0};

struct sembuf unlock[1]={0,-1,0};

i=ftok(“/fm*f.rez”,”x”);

id=semget(I,1,0666|IPC_CREAT);

semop(id,lock,1);

Для запирания ресурса атомарно, будет производится действии: если ресурс занят(sem=1), выполнение приостанавливается до sem=1; доступ и запирание семафора sem=1.

//работа с файлом

semop(id,unlock,1); - unlock уменьшит текущее значение семафора на 1 и значение семафора станет равнм 0 и ресурс освободится.

Системный вызов semctl()

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, union semun arg);

Системный вызов semctl предназначен для получения информации о массиве IPC семафоров, изменения его атрибутов и удаления его из системы.

В нашем курсе мы будем применять системный вызов semctl только для удаления массива семафоров из системы. Параметр semid является дескриптором System V IPC для массива семафоров, т. е. значением, которое вернул системный вызов semget() при создании массива или при его поиске по ключу.

В качестве параметра cmd в рамках нашего курса мы всегда будем передавать значение IPC_RMID – команду для удаления сегмента разделяемой памяти с заданным идентификатором. Параметры semnum и arg для этой команды не используются, поэтому мы всегда будем подставлять вместо них значение 0.

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

Возвращаемое значение: Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.

 

 


Поделиться:

Дата добавления: 2015-01-14; просмотров: 85; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты