Тема: Синхронизация процессов. Взаимоисключающий доступ к общим ресурсам. Семафоры. — КиберПедия 

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

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

2017-11-16 240
Тема: Синхронизация процессов. Взаимоисключающий доступ к общим ресурсам. Семафоры. 0.00 из 5.00 0 оценок
Заказать работу

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

Теоретические сведения.

Как известно, семафор представляет собой неотрицательную целую неделимую переменную, над которой возможны только два вида операций: Р (операция уменьшения значения семафора на 1) и V (операция увеличения значения семафора на 1).

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

Реализация взаимного исключения с помощью семафоров.

Для реализации взаимного исключения, например, предотвращения возможности одновременного изменения двумя или более процессами общих данных, создается двоичный (с возможными значениями 0 и 1) семафор S. Начальное значение этого семафора - 1. Критические секции кода (секции, которые могут одновременно выполняться только одним процессом) обрамляются "скобками" Р (S) (в начале секции) и V (S) (в конце секции). Процесс, входящий в критическую секцию, выполняет операцию Р (S) и переводит семафор в 0. Если в критической секции уже находится другой процесс, то значение семафора уже 0, тогда второй процесс, желающий войти в критическую секцию, блокируется в своей Р-операции до тех пор, пока процесс, находящийся в критической секции в данный момент, не выйдет из нее, выполнив на выходе операцию V (S).

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

Для обеспечения синхронизации создается двоичный семафор S с начальным значением 0. Значение 0 означает, что событие, еще не наступило. Процесс, сигнализирующий о наступлении события, выполняет операцию V (S), устанавливающую семафор в 1. Процесс, ожидающий наступления события, выполняет операцию Р (S). Если к этому моменту событие уже произошло, ожидающий процесс продолжает выполняться, если же событие еще не произошло, процесс переводится в состояние ожидания до тех пор, пока сигнализирующий процесс не выполнит v (S).

 

В случае, если одного и того же события ожидают несколько процессов, процесс, успешно выполнивший операцию Р (S), должен вслед за ней выполнить V (S), чтобы продублировать сигнал о событии для следующего ожидающего процесса.

Использование семафора в качестве счетчика ресурсов

Если у нас имеется N единиц некоторого ресурса, то для контроля его распределения создается общий семафор S с начальным значением N. Выделение ресурса сопровождается операцией Р (S), освобождение - операцией v (S). Значение семафора, таким образом, отражает число свободных единиц ресурса. Если значение семафора 0, то есть, свободных единиц больше не остается, то очередной процесс, запрашивающий единицу ресурса будет переселен в ожидание в операции Р (S) до тех пор, пока какой- либо из использующих ресурс процессов не освободит единицу ресурса, выполнив при ЭТОМ V(S).

Системные вызовы Unix/Linux для работы с семафорами

В ОС Unix/Linux механизм семафоров обслуживается тремя системными вызовами:

semget, semctl, semop.

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

Semget

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

Синтаксис

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

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

Описание

semget возвращает идентификатор массива из nsem семафоров, связанного с ключом, значение которого задано аргументом key. Если массива семафоров, связанного с таким ключом, нет и в параметре semflg имеется значение IPC_CREATE или значение ключа задано IPC_PRIVATE, создается новый массив семафоров. Значение ключа IPC_PRIVATE гарантирует уникальность идентификации нового массива семафоров.

Значение параметра semflg формируется как логическое ИЛИ одного из значений: IPC_CREATE (создать новый массив семафоров) или IPC EXCL (получить идентификатор существующего массива) и9 бит прав доступа (см. chmod).

Возвращаемое значение

При успешном завершении возвращается неотрицательное целое число - идентификатор множества семафоров. В случае ошибки возвращается -1 и устанавливается код ошибки errno.

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

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

 

Semctl

управляющие операции над семафорами

Синтаксис

include <sys/types. h>

include <sys/ipc.h>

include <sys/sem.h>

#if defined (__GNU_LIBRARY__) &&!defined(_SEM_SEMUN_UNDEFINED)

/* union semun определен включением */

#else

/* в соответствии с X/OPEN мы должны определить его сами */

union semun {

int val; /* значение для SETVAL */

struct semid_ds *buf; /* буфер для 1PC_STAT, IPC_SET */

unsigned short int *array; /* массив для GETALL, SETALL */

struct seminfo *_buf; /* буфер для 1PC_1NE'0 */

};

#endif

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

Описание

semctl выполняет управляющие операции над семафорами. Семафор задается аргументами semid - идентификатор массива семафоров и semnum - номер семафора в массиве (нумерация начинается с 0). Выполняемая операция задается аргументом cmd. Аргумент arg служит для передачи параметров операции.

Операции, выполняемые системным вызовом semctl, следующие:

IPC STAT Копировать информацию из структуры данных массива семафоров в структуру, на которую указывает arg. buf.

IPC_SET Присвоить следующим полям структуры данных массива семафоров соответствующие значения, находящиеся в структуре, на которую указывает arg. buf:

sem perm.uid

sem_perm.gid

sem_perm.mode /* Только младшие 9 бит */

IPC RMID Удалить массив семафоров.

GETVAL Получить значение определенного семафора.

SETVAL Установить значение определенного семафора. Значение

задается в arg. buf.

GETALL Получить значения всех семафоров массива в arg. buf. Аргумент semnum игнорируется

SETALL Установить значения всех семафоров массива. Значения задаются в arg. buf. Аргумент semnum игнорируется

GETNCNT Получить значение числа процессов, ожидающих, увеличения

значения определенного семафора.

GETZNCNT Получить значение числа процессов, ожидающих, когда

значение определенного семафора станет 0.

GEТРID Получить значение идентификатора определенного семафора.

 

Возвращаемое значение

В случае ошибки возвращается -1 и устанавливается код ошибки в errno.

При успешном завершении возвращается:

GETVAL значение семафора

GETVAL идентификатор семафора

GETNCNT число процессов

GETZCNT число процессов

 

Системный вызов semop выполняет прикладные семафорные операции: аналоги Р- и V- операций, а также проверки состояния семафора.

 

Semop (2)

управляющие операции над семафорами

Синтаксис

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

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

Описание

semop выполняет операции над выбранными элементами массива семафоров, задаваемого идентификатором semid. Каждый из nsops элементов массива, на который указывает sops, задает одну операцию над одним семафором и содержит поля:

short sem_num; /* Номер семафора */

short sem_op; /* Операция над семафором */

short sem_flg; /* Флаги операции */

Значение поля sem_op возможны следующие:

1. Если значение sem op отрицательно, то:

· Если значение семафора больше или равно абсолютной величине sem_op, то абсолютная величина sem_ор вычитается из значения семафора.

· В противном случае процесс переводится в ожидание до тех пор, пока значение семафора не станет больше или равно абсолютной величине sem_op.

2. Если значение sem ор положительно, то оно добавляется к значение семафора.

3. Если значение sem_op равно нулю, то:

· Если значение семафора равно нулю, то управление сразу же возвращается вызывающему процессу.

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

Флаг операции может принимать значения IPC_NOWAIT или/и SEM__UNDO. Первый из флагов определяет, что semop не переводит процесс в ожидание, когда этого требует выполнение семафорной операции, а заканчивается с признаком ошибки. Второй определяет, что операция должна откатываться при завершении процесса.

Возвращаемое значение

При успешном завершении возвращается 0. В случае ошибки возвращается -1 и устанавливается код ошибки в errno.

 

Семафоры в Unix/Linux не имеют внешних имен. При получении идентификатора семафора процесс пользуется числовым ключом. Разработчики несвязанных процессов могут договориться об общем значении ключа, который они будут использовать, но у них нет гарантии в том, что это же значение ключа не будет использовано кем-то еще. Гарантированно уникальный массив семафоров можно создать с использованием ключа IPC_PRIVATE, но такой ключ не может быть внешним. Поэтому семафоры используются, как правило, родственными процессами, которые имеют возможность передавать друг другу идентификаторы семафоров, например, через наследуемые ресурсы или через параметры вызова дочерней программы.

Постановка задачи.

Для заданной в Вашем варианте индивидуального задания предметной области разработайте программную модель ситуации предложенной преподавателем.


Поделиться с друзьями:

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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.