- •Введение
- •Понятие операционной системы. Типы операционных систем
- •Функции операционной системы
- •Структура операционной системы. Ос ms dos
- •Файлы и каталоги на дисках
- •Драйверы устройств
- •Базовая система ввода-вывода (bios)
- •Загрузчик операционной системы
- •Ядро ms dos
- •Командный процессор dos
- •Внешние команды dos
- •Файловая структура диска
- •Стартовый сектор
- •Каталоги
- •Область данных
- •Операционные системы Windows
- •Выбор платформы Windows
- •Термины
- •Архитектура Windows Режимы выполнения программного кода
- •Многозадачность
- •Управление памятью в Windows
- •Выполнение приложений
- •Интерфейс прикладного программирования Win32
- •Реестр Windows
- •Операционная система unix
- •Ядро и процессы unix
- •Диспетчер unix
- •Процессы unix
- •Дескриптор и контекст процесса
- •Иерархия процессов
- •Идентификаторы процесса
- •Группы процессов
- •Взаимодействие процессов
- •Процессы-«демоны»
- •Межпроцессные коммуникации unix
- •Сигналы
- •Сигналы unix по мере возрастания их значений:
- •Семафоры
- •Программные каналы (Pipes)
- •Очереди сообщений
- •Разделяемая память
- •Многопользовательская защита в unix
- •Идентификаторы пользователя и группы
- •Код защиты файла
- •Привилегированный пользователь
- •Эффективные и реальные идентификаторы
- •Свопинг и пейджинг в unix
- •Буфер кеш-памяти
- •Управление вводом/выводом
- •Специальные файлы
- •Взаимодействие драйверов с программной и аппаратной средой
- •Файловая система unix
- •Основные системные каталоги
- •Корневой каталог /
- •Каталог /var
- •Каталог /etc
- •Каталог /usr
- •Каталог /home (/export/home)
- •Каталог/opt (/opti, /opt2, ... /optn)
- •Команды управления swap
- •Команда mkfile
- •Специальные файлы
- •Класс устройства
- •Тип и номер
- •Связь физической и логической структур
- •Создание и монтирование файловой системы
- •Дисковые устройства в unix
- •Внутренняя структура файловой системы Распределение дискового пространства
- •Индексные дескрипторы
- •Системные вызовы unix для работы с файлами
- •Стандартные библиотечные функции ввода/вывода
- •Поточные функции ввода/вывода
- •Литература
- •Оглавление
-
Межпроцессные коммуникации unix
Если задуматься над вопросом, что в наши дни является ключевой компонентой в области передовых компьютерных технологий, то без сомнения можно было бы ответить, что такой технологией в наши дни является технология «клиент – сервер». Эта универсальная модель служит основой построения любых сколь угодно сложных систем, в том числе и сетевых.
Разработчики СУБД, коммуникационных систем, систем электронной почты, банковских систем и т. д. но всем мире используют эту технологию. В этом смысле ОС UNIX является для разработчиков системного и прикладного программного обеспечения почти идеальным средством, потому что в своей основе наиболее полно отвечает требованиям технологии «клиент – сервер».
Для построения моделей типа «клиент – сервер» UNIX существуют специальные средства:
• сигналы;
• семафоры;
• программные каналы;
• очереди сообщений;
• разделяемая память;
• специальные команды (write, cu, mail);
• средства межмашинного взаимодействия (uucp, tcp/ip, nfs, rfs,).
В первоначальных версиях UNIX в момент ее зарождения этих средств либо вообще не существовало, либо они существовали в зачаточном состоянии. Но сейчас, особенно после появления System V, эти средства все более развиваются.
Рассмотрим некоторые из этих средств более подробно.
-
Сигналы
Если рассматривать процесс как некую виртуальную машину, то в такой системе должна быть система прерываний, отвечающая стандартным требованиям:
• обработка исключительных ситуаций;
• средства обработки внешних и внутренних прерываний;
• средства управления системой прерываний (маскирование и демаскирование).
Всем этим требованиям в UNIX отвечает система сигналов, которая может не только воспринимать и обрабатывать сигналы, но и порождать их, и посылать на другие машины (процессы).
Сигналы могут быть синхронными, когда инициатор сигнала - сам процесс, и асинхронными, когда инициатор возникновения сигнала - интерактивный пользователь за терминалом. Источником асинхронных сигналов может быть также ядро, когда оно контролирует определенные состояния аппаратуры, рассматриваемые как ошибочные.
Для удобства использования каждый сигнал закодирован и цифровсн значение сигнала с применением мнемонической формы записи хранится ) файле <signal.h>.
Всего в UNIX 20 сигналов. Как правило, реакцией на сигнал (по умолчанию) является окончание процесса, принявшего сигнал (закончить процесс). Исключение составляют два процесса: со значением сигнала (18) – SIGCLD, который вырабатывается, когда заканчивается порожденный процесс и идет к породившему процессу (реакцией является сброс сигнала), и процесс со значением сигнала (19) -SIGPVR, вырабатываемый при уменьшении напряжения сети. В зависимости от реализации этот сигнал посылается разным процессам. Реакция на этот сигнал также вырабатывается в зависимости от реализации.
Реакцией на все остальные сигналы является завершение процесса, принявшего сигнал.
Сигналы unix по мере возрастания их значений:
SIGHUP (1) - Вырабатывается при отключении связи с терминалом. Рассылается всем процессам TGID.
SIGINT (2) - При нажатии определенной клавиши. Рассылается всем процессам TGID.
SIGQUIT (3) - При нажатии клавиши QUIT. Рассылается всем процессам TGID.
SIGILL (4) - При возникновении аппаратных неконтролируемых состояний. Текущему PID.
SIGTRAP (5) - При трассировке. Текущему PID.
SIGIOT (6) - При неисправности в аппаратуре. Текущему PID.
SIGTEMT (7) - При выполнении команды ЕМТ. Текущему PID.
SIGFPE (8) - При обработке чисел с плавающей точкой. Текущему PID.
SIGKILL (9) – При выдаче системного вызова kill. Адресуемому PID.
SIGBUS (10) - При ошибке в косвенной адресации. Текущему PID.
SIGSEGV (11) - При выходе за пределы сегмента. Текущему PID.
SIGSYS (12) - При неверном системном вызове. Текущему PID.
SIGPIPE (13) - При записи в Pipe, когда нет читающего процесса. Текущему PID записи в канал.
SIGALARM (14) - При окончании временной установки. Посылается к PID установки.
SIGTERM (15) - При выполнении команды kill в командном режиме. Посылается к адресуемому PID.
SIGUSR1 (16) - При системном вызове kill. Посылается к адресуемому PID.
SIGUSR2 (17) – аналогично (16)
SIGCLD (18) - Когда заканчивается "процесс-сын".Идет к "процессу-отцу".
SIGPWR (19) - При уменьшении напряжения сети. Идет в зависимости от реализации.
SIGPOOL (20) - При регистрации события в Stream-устройстве. К процессу, работающему с потоком.
Средством посылки и восприятия сигналов в ОС UNIX служат два системных вызова - kill и signal. Системный вызов kill посылает выбранному процессу сигнал с определённым номером:
int kill (int pid, int sig);
Системный вызов signal воспринимает и идентифицирует сигнал:
#include <signal.h>
int (* signal (int sig, void (* func (int))) (int));
Возможности системного вызова signal позволяют обрабатывать сигналы следующими тремя способами:
1. Реакция по умолчанию.
2. Замаскировать сигнал (т. е. проигнорировать его). Для указания возможности маскирования второму аргументу присваивается специальное значение SIG_IGN. Можно, например, проверить, было ли ранее установлено маскирование в отношении сигнала SIGINT, и если не было, то установить такое маскирование:
#include <signal.n>
……………………………………… (текст)
if (signal (SIGINT,SIG_IGN)!=SIG_IGN)
signal (SIGINT,SIG_IGN);
3. Перехватить посланный процессу сигнал и написать собственную программу обработки прерывания по асинхронно посланному сигналу.
Например: элементарная программа печати файлов воспринимает сигнал прерывания (клавиша DEL, посланная оператором) и, приостановив свoe выполнение, спрашивает, действительно ли нужно прервать печать файла. С помощью механизма сигналов это может быть реализовано в виде небольшой программы.
Используя технику сигналов, можно решать самые разнообразные задачи, в том числе можно даже предотвратить такую неприятную особенность, как появление в системе "процессов-зомби".
В UNIX System V имеется средство, построенное на использовании сигнала SIGCLD: signal (SIGCLD,SIG_IGN).
Такой вызов говорит ядру, что далее «процесс-отец» не обязан знать о судьбе своих «сыновей», поэтому ядро будет само заканчивать процессы по exit или другим способом и «зомби» поэтому появляться не будут. В UNIX 4.3 BSD такого средства нет.