- •Введение
- •Понятие операционной системы. Типы операционных систем
- •Функции операционной системы
- •Структура операционной системы. Ос 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 наряду с программными каналами, очередями сообщений и разделяемой памятью входят в так называемую группу IPC - средства межпроцессных коммуникаций (Interprocess Communication).
Семафоры - это достаточно мощное средство синхронизации процессов.
Зачем нужны семафоры?
В любой ОС имеются критические ресурсы, с каждым из которых в текущий момент может работать только один процесс, который захватывает ресурс и по истечении короткого интервала времени освобождает его для других. Семафоры по определенной схеме управляют доступом к критическим ресурсам. Сами по себе они представляют целые числа или массивы целых чисел, с которыми допустимы только две атомарные (неделимые) операции.
Семафоры всегда являются средствами задержки процессов, которые тормозятся или "засыпают" на семафорах и "пробуждаются" и приходят в движение при изменении состояния семафоров. Таким образом, дескриптор семафора является информационной управляющей структурой ipc-perm и хранится в файле <sys/ipc.h>.
Процесс может создать семафор с помощью системного вызова semget.
В результате успешного выполнения semget возвращается semid - идентификатор созданного или уже имеющегося семафора.
После создания семафора любой процесс, который знает его идентификатор semid, может на него воздействовать с помощью системного вызова semctl, который осуществляет настройку и проверку состояния множественного семафора.
Семафор является также средством регистрации некоего события (событий) в системе. О наступлении таких событий сообщают процессы, используя системный вызов semop, что приводит к переустановке текущих значений семафора.
Процесс, выполняющий системный вызов semop, должен использовать поле sem_op в структуре sembuf, в котором задается требуемая операция:
struct sembuf {
ushort sem_num; /* номер элемента семафора */
short sem_op; /*конкретная операция над элементом семафора */
short sem_flg /* флаги */
Различают 3 типа операций:
1. sem_op > 0 - освобождение процессом, выполнившим semop, ресурса. контролируемого данным элементом семафора. Текущее значение элемента семафора semval увеличивается на величину sem_op.
2. sem_op = 0 - процесс, исполняющий такой вызов semop, будет переведен в ожидание до тех пор, пока не освободится ресурс, т.е. semval не станет равным нулю.
3. sem_op < 0 - процесс, вызвавший выполнение этой операции, ждет, когда sem_op станет больше или равно semval. В данном случае происходит уменьшение текущего значения семафора на абсолютную величину sem_op. Эта операция используется при захвате ресурса.
На семафорах допустимо применять специальные флаги, например IPC_NOWAIT, которые информируют ядро о нежелании процесса переходить в состояние ожидания, несмотря на "красный свет" (запрещение) семафора. Это продиктовано стремлением избежать опасности блокировки всех процессов, "висящих" на семафоре, в случае, если по той или иной причине процесс, захвативший ресурс, вдруг аварийно завершился или досрочно вышел по получении сигнала kill. Поскольку этот сигнал невозможно перехватить то "убиваемый" процесс не в силах ничего предпринять по освобождению семафора и ресурса.
В этом случае необходимо использовать флаг SEM_UNDO.