Похожие презентации:
Семафоры в 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_dssem_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.
Поля структуры semsem_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.
Значения аргумента cmdGETVAL — возвращает текущее значение semval
SETVAL — установка значения semval равным
arg.val
GETPID — функция возвращает текущее значение
поля sempid.
GETNCNT — функция возвращает текущее
значение поля semncnt.
GETZCNT — функция возвращает текущее
значение поля semzcnt.
GETALL — возвращаются значения semval для