- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •2.Системные вызовы
- •3.Примеры
- •2 Билет.
- •1.Управление процессами
- •2. Сигналы.
- •3 Билет
- •1.Обработка Сигнала
- •2) Группы процессов
- •3)Примеры
- •4 Билет
- •1)Посылка сигналов процессами
- •2)Межпроцессные комуникации
- •3)Примеры в качестве примера можно привести программу ,которая принимает сигналы о прерывании (sigint) и сама посылает их (в результате выполнения функции kill
- •5 Билет.
- •6 Билет.
- •7 Билет
- •1)Атомарные (неделимые) операции с каналами
- •2)Примечания к полудуплексным каналам
- •8 Билет
- •1)Именованные каналы (fifo: First In First Out): основные понятия
- •2)Операции с fifo
- •3) Примеры
- •9 Билет
- •1) Базовые понятия System V ipc
- •2) Идентификаторы ipc
- •10 Билет
- •11 Билет
- •1)Буфер сообщения
- •13 Билет
- •1)Системный вызов msgctl
- •2)Семафоры. Основные понятия
- •1)Системный вызов semget.
- •2) Системный вызов semop.
- •15 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •16 Билет
- •1) Системный вызов shmget
- •2) Системный вызов shmctl
- •3) Примеры
- •17 Билет
- •Системный вызов shmat
- •Системный вызов shmdt
- •18 Билет
- •Системный вызов mmap
- •19 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
- •21 Билет
- •1. Закрытие сокетов.
- •22 Билет.
- •1) Алгоритмы
- •2) Оценки эффективности алгоритмов.
- •3) Примеры
- •23 Билет
- •1.Ядро операционной системы
- •2.Системные вызовы
- •3.Примеры
- •24 Билет.
- •25 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •26 Билет
- •1) Группы процессов
- •2)Обработка Сигнала
- •3)Примеры
- •27 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •28 Билет.
- •29 Билет
- •1. Закрытие сокетов.
- •30 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
1)Системный вызов semget.
Системный вызов semget. Вызов используется для того, чтобы создать новое множество семафоров или получить доступ к старому.
int semget(key_t key, int nsems, int semflg);
Первый аргумент semget это ключ, который в нашем случае возвращается функцией ftok. Он сравнивается с ключами остальных множеств семафоров, присутствующих в системе. Вместе с этим решается вопросьо выборе между созданием и подключением к множеству семафоров вьзависимости от аргумента msgflg.
Аргумент nsems определяет число семафоров, которые требуется создать в новом множестве. Это количество принтеров в приведенномьвыше примере. Максимальное число семафоров определяется в файле linux/sem.h: #define SEMMSL 32 /* <= 512 */
Аргумент nsems игнорируется, если открывается существующая очередь.
2) Системный вызов semop.
int semop( int semid, struct sembuf *sops,unsigned nsops);
Первый аргумент semop есть значение ключа (в нашем случае возвращается semget). Второй аргумент это указатель на массив операций,выполняемых над семафорами, третий аргумент, em nsops, является количеством операций в этом массиве.
Аргумент sops указывает на массив типа sembuf. Эта структура описана
в linux/sem.h следующим образом:
/* системный вызов semop требует массив таких структур */
struct sembuf {ushort sem_num; /* индекс семафора в массиве */
short sem_op; /* операция над семафором */short sem_flg; /* флаги */};
Если sem_op отрицателен, то его значение вычитается из семафора(семафор уменьшается). Это соответствует получению ресурсов, которые контролирует семафор. Если IPC_NOWAIT не установлен, то вызывающий процесс засыпает, пока семафор не выдаст требуемое количество ресурсов (пока другой процесс не освободит их).
Если sem_op положителен, то его значение добавляется к семафору.
Это соответствует возвращению ресурсов множеству семафоров приложения. Ресурсы всегда нужно возвращать множеству семафоров, если они больше не используются. Наконец, если sem_op равен нулю, то вызывающий процесс будет усыплен пока значение семафора не станет нулем. Это 23 соответствует ожиданию того, что ресурсы будут использованы на 100%.
Хорошим примером был бы демон, запущенный с правами суперпользователя, динамически регулирующий размеры множества семафоров, если оно достигло стопроцентного использования.
Чтобы пояснить вызов semop, вспомним пример комнаты с принтерами. Пусть мы имеем только один принтер, способный выполнять за один
раз только одно задание. Мы создаем множество семафоров из одного семафора (только один принтер) и устанавливаем его начальное значение
в 1 (только одно задание за один раз).
Каждый раз, посылая задание на принтер, нам нужно сначала убедиться, что он свободен. Мы делаем это, пытаясь получить от семафора единицу ресурса. Давайте заполним массив sembuf, необходимый для выполнения операции:
struct sembuf sem_lock = { 0, -1, IPC_NOWAIT };
Трансляция вышеописанной инициализации структуры добавит -1 к семафору 0 из множества семафоров. Другими словами, одна единица ресурсов будет получена от конкретного (нулевого) семафора из нашего множества. IPC_NOWAIT установлен, поэтому либо вызов пройдет немедленно, либо будет провален, если принтер занят. Рассмотрим пример инициализации sembuf вызовом semop:
if(semop(sid, &sem_lock, 1) == -1)
perror("semop");
Третий аргумент (nsops) говорит, что мы выполняем только одну (1)
операцию (есть только одна структура sembuf в нашем массиве операций).
Аргумент sid является IPC идентификатором для нашего множества семафоров.
Когда задание на принтере выполнится, мы должны вернуть ресурсы
обратно множеству семафоров, чтобы принтером могли пользоваться другие.
struct sembuf sem_unlock = { 0, 1, IPC_NOWAIT };
Трансляция вышеописанной инициализации структуры добавляет 1 к
семафору номер 0 множества семафоров. Другими словами, одна единица
ресурсов будет возвращена множеству семафоров.
