Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы по конспектам 2011.docx
Скачиваний:
13
Добавлен:
21.04.2019
Размер:
967.53 Кб
Скачать

46. Пространство имен

Множество возможных имен объектов конкретного типа IPC, использующихся для очередей сообщений, семафоров, разделяемой памяти. За каждым объектом закреплено имя – ключ. Эти имена генерирует ftok() (параметры: имя файла и идентификатор проекта).

#include <sys/types.h>

#include <sys/ipc.h>

key_t ftok(char *filename, char proj);

filename – имя сервера, должно существовать в момент создания ключа

Пространство имё создаётся для использования IPC неродственным процессам.

Для ссылок используются ID. У каждого свой уникальный ID.

Тип IPC

Пространство имен

Дескриптор

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

Канал pipe

-

Файловый дескриптор

pipe();

Канал FIFO

Имя файла

Файловый дескриптор

mknode();

Очередь сообщений

Ключ

Идентификатор

msgget(), msgctl()

Семафор

Ключ

Идентификатор

semctl(), semset()

Разделяемая память

Ключ

Идентификатор

shmget(), shmctl()

Ошибка – возврат «-1».

ФД нужны для идентификации файлов процессами.

Inode нужны для того, чтобы их различало ядро.

47. Сообщения

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

Процессы могут читать сообщения из различных очередей.

Атрибуты сообщений:

- тип сообщения (мультиплексный/немультиплексный);

- длина сообщений (байт, может быть = 0);

- сами данные (могут быть структурированы).

Хранится очередь в виде однонаправленного односвязного списка. Для каждой очереди ядро создает свою структуру.

msgid_ds ---------------------------------------- ipc_perm

msg_perm // permission – права доступа

msg_cbytes // число байт

msg_num // число сообщений в очереди

msg_first // первый объект в списке

msg_last // последний в списке

Функции:

msg_snd() – отправка сообщения;

msg_rcv() – прием сообщения;

msg_get()– создание очереди;

msg_ctl()– удаление очереди.

48. Семафоры

Семафоры – средство синхронизации доступа нескольких процессов к разделяемым ресурсам (функция разрешения/запрещения использования ресурса).

Требования к семафорам:

- должны быть размещены в АП ядра (любой процесс может получить доступ к нему);

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

Семафоры – системный ресурс. Операции над семафорами производятся посредством системных вызовов. В UNIX системах под семафором понимается группа семафоров.

Структура для описания семафоров sem_id_ds:

sem_id – идентификатор семафора;

sem_perm – права доступа;

sem_first – указатель на первый элемент;

sem_num – число семафоров в группе;

sem_oper - время последней операции;

sem_time – время последнего изменения и другие.

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

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

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

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

Структура sem_op – операции, определенные над семафором.

sem_op(int semid, struct sembuf *semop, size_t nops);

semid – идентификатор;

semop – указатель на структуру, содерж-ую 3 поля: номер в группе, операция, флаг операции.

struct sembuf{

short sem_num;

short sem_op;

short sem_flag;}

nops – количество операций над семафором, обычно – 3:

- если значение semop > 0 – добавляется значение, указанное в структуре sembuf.

- если значение semop = 0, процесс ожидает, пока семафор не обнулится;

- если значение semop < 0, процесс ожидает, пока значение семафора достигнет по абсолютной величине sem_op и обнуляет значение семафора.

ОС не накладывает ограничений на операции над семафорами, но для работы хватает и стандартных операций UNIX’а.

Применение семафоров с разделяемой памятью.