- •1. Операционные системы
- •2. Функциональные компоненты локальной ос
- •3. Назначение и функции сетевой ос
- •4. Функциональные компоненты сетевой ос
- •5. Коммуникационные средства
- •6. Классификация ос
- •8. Архитектура ос
- •9. Монолитные и многоярусные ядра
- •10. Функциональные компоненты Linux
- •11. Структура ядра
- •12. Функции слоёв ядра
- •13. Вспомогательные модули
- •14. Микроядерные системы
- •15. Объектная модель функционирования
- •16. Состав исполнительной системы WinNt
- •17. Совместимость
- •18. Множественные прикладные среды. Способы реализации
- •19. Интерфейсы ос
- •20. Файловая система
- •21. Логическая организация файла
- •22. Физическая организация файла
- •23. Общая модель фс
- •Непрерывное
- •2) Цепочечная
- •3) Фиксированный
- •Битовые карты (таблицы) – каждому блоку ставится в соответствие свой бит (1 – занят, 0 – свободен)
- •Цепочки сводных свободных порций
- •Список свободных блоков
- •Индексированный
- •24. Функции фс
- •25. Фс unix-подобных ос
- •26. Структура фс
- •27. Структура фс базовых unix-подобных ос
- •28. Архитектура виртуальной фс
- •29. Последовательность действий при монтировании
- •30. Файловые дескрипторы и трансляция имён
- •31. Физическая организация fat
- •32. Физическая организация ntfs
- •33. Управление процессами
- •34. Контекст и дескриптор
- •35. Структура контекста процесса
- •36. Планирование и диспетчеризация
- •37. Алгоритмы планирования
- •38. Планирование и диспетчеризация в unix системах
- •39. Управление процессами в unix-подобных системах
- •40. Атрибуты, инфраструктура процесса
- •41. Создание процессов
- •42. Этап exec()
- •43. Межпроцессные взаимодействия (ipc)
- •44. Каналы (pipe)
- •45. Fifo
- •46. Пространство имен
- •47. Сообщения
- •48. Семафоры
- •49. Разделяемая память
- •50. Сигналы
- •51. Последовательность событий
- •52. Функции управления процессами
- •53. Сообщения в микроядерных ос.
- •54. Процессы и потоки в WinNt
- •55. Базовая структура процесса, создание процесса в WinNt
- •56. Основные различия управления процессами в различных средах
- •57. Состав потока в WinNt и контекст потока
- •58. Передача сообщений с помощью lpc (локальный вызов процедур)
- •59. Распределенные системы. Удаленный вызов процедур. Rpc (Remote Procedure Call)
- •60. Система ввода-вывода в Win nt
- •61. Реализация свв в Windows nt
- •62. Унифицированная модель драйвера
- •63. Формат пакета irp
- •64. Структура драйвера
- •65. Редиректор и сервер. Встроенные сетевые компоненты
51. Последовательность событий
Пример: нажатие клавиши del.
Функции работы управления сигналами (IPC)
- изменение диспозиции сигнала – signal(3c) и sigaction(2).
После функции fork() процесс наследует диспозицию.
После функции exec() устанавливается диспозиция по умолчанию.
#include <signal.h>
void (*signal (int sig, void (*disp(int)))) (int)
sig – сигнал, диспозицию которого хотим поменять, disp – определение новой диспозиции сигнала
1 – обработчик пользователя (SIG_USR1, SIG_USR2), 2 – обработчик по умолчанию (SIG_IGN),
3 – игнорирование (SIG_IGN), не для всех сигналов
При успехе функция возвращает предыдущую диспозицию (необязательно, зависит от системы)
Процесс не может быть заблокирован. Каждый раз при получении сигнала его диспозиция устанавливается по умолчанию. Signal не является стандартной функцией в POSIX.
52. Функции управления процессами
signal()
#include <signal.h>.
static void sig_hndl(int signo) // обработчик
{
signal (SIGINT, sig_hndl); // восстановление диспозиции, требуется не всегда
printf(“This is new handler for SIGINT\n”); // сообщение обработчика
}
main()
{
signal(SIGINT, sig_hndl); // смена диспозиции трёх сигналов
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_IGN);
while(1)
pause();
}
$ a.out & - можно пользоваться этим терминалом
5050 - pid порождённого процесса
$ kill SIGINT 5050
This is new handler for SIGINT
$ kill SIGUSR2 5050 - ничего не произойдет
$ kill SIGUSR1 5050 - действие по умолчанию (процесс терминируется).
Функция управления сигналами в POSIX
sigaction(2)
Набор сигналов – sigset_t (32 разряда – 32 сигнала). Маскирование сигналов.
Реализация функции sigaction различно в различных ОС (меняется структура, которая ей управляет).
#include <signal.h>
int sigaction (int sig, const struct sigaction *act, const struct sigaction *oldact)
Поля структуры sigaction:
- void (*sa_handler) ()
- void (*sa_sigaction) (int, siginfo_t*, void*)
- sigset_t sa_mask; // маска
- int sa_flags; // флаги
Если sa_handler <> 0 или sa_sigaction <> 0, то в поле sa_mask передаётся набор сигналов, которые будут добавлены к маске перед вызовом обработчика. Маска блокирует сигналы, которые в неё добавлены. После возврата из обработчика маска восстанавливается. Обрабатываемый сигнал блокируется. Нет очередей сигналов. sa_flags модифицирует доставку сигналов.
siginfo_t – структура-комментарий о сигнале.
#include <siginfo_t.h>
struct siginfo_t{
int sig_no; // номер сигнала
int sig_errno; // номер ошибки
int sig_code; // причина отправки сигнала
};
Функции управления sigaction()
#include <signal.h>
sigemptyset(sig_set_t *set); // начальная инициализация, очистка битов
sigfillset(sig_set_t *set); // включение битов
sigaddset(sig_set_t *set, int signo); // добавить 1 сигнал
sigdelset(sig_set_t *set, int signo); // убрать 1 сигнал
sigismemberset(sig_set_t *set, int signo); // является ли сигнал в маске
Ресурсоемкость сигналов
Для отправки-доставки требуется системный вызов.
Для доставки – прерывание и его обработка.
Для этого необходимо большое число операций со стеком - копирование пользовательского стека в системную область, извлечение параметров системных вызовов, результатов работы системных вызовов и др. Вывод: затраты слишком велики по сравнению с объемом передаваемой информации.
Используются для реакции на событие.
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void (*oursignal (int signo, void (*hndlr)(int)) (int) // обработчик
{
struct sigaction act, oldact;
act.sa_handler = hndlr;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (signo != SIGALARM) act.sa_flags |= SA_RESTART;
if (sigaction (signo, &act, &oldact) < 0) return (SIG_ERR);
return (oldact.sa_hndlr);
}
static void sig_hndlr (int signo);
{
printf(“We are int handler\n”); // нет восстановления старой диспозиции
}
main()
{
oursignal(SIGINT, sig_hndl); // смена диспозиции трёх сигналов
oursignal(SIGUSR1, SIG_DFL);
oursignal(SIGUSR2, SIG_IGN);
while(1)
pause();
}