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

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

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

При этом для сервера необходимо:

- получение доступа к разделяемой памяти посредством семафора;

- запись данных в область разделяемой памяти;

- освобождение памяти в соответствие со значением семафора.

Для клиента:

- получение доступа к разделяемой памяти посредством семафора;

- чтение данных из области разделяемой памяти;

- освобождение памяти в соответствие со значением семафора.

Для организации клиент-серверного приложения с доступом к разделяемой памяти необходимо 2 семафора.

50. Сигналы

Сигналы – способ передачи уведомления о событии, произошедшем либо между процессами, либо между процессом и ядром. Сигналы очень ресурсоемки. Ограничены с точки зрения системных средств. Они малоинформативны. Являются простейшим способом IPC. Используются для генерации простейших команд, уведомлений об ошибке. Обработка сигнала похожа на обработку прерывания. Сигнал имеет собственное имя и уникальный номер. Максимальное количество сигналов – 32.

Сигнал SIGINT генерируется при нажатии клавиши del, Ctrl+C и т.д. Сигнал может быть отправлен процессу ядром или другим процессом. Это можно сделать посредством системного вызова.

#include <sys/types.h>

#include <signal.h>

int kill (pid_t pid, int sig);

Причины генерации сигналов:

  1. Ядро отправляет сигнал процессу при нажатии клавиши;

  2. Внутренние прерывания (деление на 0, обращение в недопустимую область памяти). Могут быть обработаны системой либо пользователем.

  3. Особые аппаратные ситуации (SIGALARM, например, таймеры);

  4. Особые программные ситуации;

  5. Управление заданиями (управление фоновыми и текущими задачами, например, сообщение потомка родителю о своём завершении);

  6. Превышение квот;

  7. Ответ на запрос по событию.

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

Возможные действия при получении сигнала:

- завершение процесса с сохранением образа процесса в ОЗУ;

- завершение процесса без сохранения образа процесса в ОЗУ;

- игнорирование сигнала;

- приостановка процесса;

- возобновление процесса при условии, что он был приостановлен.

Основные действиия при приёме сигналов:

  1. Завершение процесса с сохранением или без сохранения образа процесса в ОЗУ;

  2. Игнорирование сигнала;

  3. Приостановка процесса;

  4. Возобновление процесса при условии, что он был приостановлен;

  5. Блокировка сигнала (исключение SIGKILL, SIGSTOP).

  6. Действия на данный сигнал, согласно умолчанию.

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

Одно из возможных действий – диспозиция сигнала.

Две фазы существования сигнала:

  • генерация и отправка;

  • доставка и обработка.

Промежуточная стадия – ожидание доставки.

Генерация и отправка – в случае особых ситуаций, терминирование прерываний, системных вызовов, управления заданиями, ситуаций, когда возможна отправка сигналов по завершении временного интервала и уведомление (отправка сигнала по запросу самого процесса о каком-либо событии), нарушение квот.

Доставка и обработка.

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

Наиболее часты вариант – завершение процесса с сохранением образа в ОЗУ. Можно изменить действия по умолчанию на свой обработчик или указать системный. Можно заблокировать сигнал (отложить обработку на время).

Обработка.

Для обработки сигнала необходимо, чтобы на момент его получения процесс выполнялся. Фаза ожидания доставки может быть длительной. Могут существовать задержки между отправкой и доставкой. Обработка не может быть выполнена до тех пор, пока планировщик не выберет процесс обработки на исполнение.

Доставка.

Осуществляется ядром. Ядро от имени процесса осуществляет вызов ISSIG().

Данный системный вызов выполняется в трех случаях:

- возвращение процесса из режима ядра в пользовательский режим;

- переход процесса в состояние ожидания;

- выход процесса из состояния ожидания.

Все это происходит при условии, что приоритет процесса допускает его прерывание сигналом. Системный вызов ISSIG() определяет, есть ли сигналы, ожидающие доставки. Если нет – то процесс просто выполняется.