203.66K
Category: programmingprogramming

Семафоры в UNIX System V

1.

Семафоры в UNIX System V
Доклад подготовили
Суворов Иван
Дмитриев Вадим

2.

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

3.

Функции API семафоров
Создают набор семафоров
«Открывают» набор семафоров и получают
дескриптор, обозначающий данный набор
Увеличивают и уменьшают целочисленные
значения одного и более семафоров в наборе
Запрашивают значения одного и более семафоров в
наборе
Запрашивают и устанавливают управляющие
параметры набора семафоров

4.

Структура данных множества
семафоров
struct semid_ds {
struct ipc_perm sem_perm; /*разрешение на операции*/
time_t sem_otime;
semop()*/
time_t sem_ctime;
/*время последнего
вызова
/*время последнего изменения*/
struct sem *sem_base; /*указатель на первый семафор в
массиве*/
ushort sem_nsems;
};
/*количество семафоров в наборе*/

5.

Ключи System V
Ключ создаётся функцией ftok(3).
key_t ftok(const char *pathname, int
proj_id);
/* имя существующего файла (pathname)и
идентификатор процесса (proj_id) */

6.

Поля semid_ds
sem_perm Это пример структуры ipc_perm, котораф
описана в linux/ipc.h. Она содержит информацию о
доступе к множеству семафоров, включая права
доступа и информацию о создателе множества (uid и
т.д.).
sem_otime Время последней операции semop()
(подробнее чуть позже).
sem_ctime Время последнего изменения структуры.
sem_base Указатель на первый семафор в массиве.
sem_undo Число запросов undo в массиве

7.

Структура семафора
struct sem {
short sempid; /*pid последней операции*/
ushort semval; /*текущее значение,
неотрицательно*/
ushort semncnt; /*число процессов, ждущих
увеличения значения семафора*/
ushort semzcnt; /*число процессов, ждущих
значения семафора, равного 0*/
};

8.

Поля структуры sem
sem_pid ID процесса, проделавшего последнюю
операцию
sem_semval Текущее значение семафора
sem_semncnt Число процессов, ожидающих
освобождения требуемых ресурсов
sem_semzcnt Число процессов, ожидающих
освобождения всех ресурсов

9.

Функция semget()
int semget(key_t key, int nsems, int
oflag);
/* Возвращает неотрицательный идентификатор в
случае успешного завершения, –1 – в случае
ошибки */
Эта функция возвращает целое значение, называемое
идентификатором семафора, которое затем используется при
вызове функций semop и semctl.

10.

Функция semop()
int semop(int semid, struct
sembuf *opsptr, size_t nops);
/* Возвращает 0 в случае успешного
завершения, –1 – в случае ошибки */
Указатель opsptr указывает на массив структур
вида
struct sembuf {

11.

Выполняемая операция определяется следующим
образом:
Если значение sem_op положительно, оно добавляется к
semval
Если значение semop равно нулю, вызвавший поток
блокируется до тех пор, пока значение семафора (semval)
не станет равным нулю
Если значение sem_op отрицательно, вызвавший поток
блокируется до тех пор, пока значение семафора не
станет большим либо равным модулю sem_op. Это
соответствует запрашиванию ресурсов.

12.

Функция semctl()
int semctl(int semid, int
semnum, int cmd);
/* Возвращает неотрицательное
значение в случае успешного
завершения (см. в тексте). –1 – в
случае ошибки */
Первый аргумент (semid) представляет собой
идентификатор семафора, a semnum указывает
элемент набора семафоров (0, 1 и т. д. до nsems –1).

13.

Значения аргумента cmd
GETVAL — возвращает текущее значение semval
SETVAL — установка значения semval равным
arg.val
GETPID — функция возвращает текущее значение
поля sempid.
GETNCNT — функция возвращает текущее
значение поля semncnt.
GETZCNT — функция возвращает текущее
значение поля semzcnt.
GETALL — возвращаются значения semval для
English     Русский Rules