Взаимодействие между процессами
Как и в других ОС средства взаимодействия процессов в Unix подразделяются на средства синхронизации и обмена данных.
Средства синхронизации:
Сигналы
Семафоры
Средства передачи данных
Файлы
Каналы
Сегмент памяти
Традиционно основным средством синхронизации Unix являются сигналы. Они могут посылаться процессам как системой, так и пользовательскими процессами. Каждый сигнал однозначно идентифицируется либо своим уникальным номером, либо мнемоническим обозначением (SIGCLD аналогично 18, а SIGHUP аналогично 1).
SIGHUP(1) – сигнал о подключении\отключении теримнала к системе
SIGINT(2) – сигнал о нажатии CTRL+C
SIGQUIT(3) – сигнал о выходе из текущего режима работы системы
SIGKILL(9) – жесткое завершение процесса (уничтожение)
SIGTERM(15) – мягкое завершение процесса
Для каждого определенного в системе сигнала имеются стандартные обработчики, которые по умолчанию обрабатывают каким-то образом сигналы. Стандартные обработчики для сигналов SIGTERM и SIGKILL завершают текущий процесс. Особенностью SIGTERM является то, что пользователь имеет возможность создать свой обработчик сигнала и заменить им стандартный. Второй сигнал жесткого завершения перехватить (заменить) нельзя. Если системе необходимо завершить процесс, она посылает ему SIGTERM, ждет, чтобы процесс завершился, а если процесс это проигнорировал, то направляется SIGKILL.
SIGUSR1(16) и SIGUSR2(17) – пользовательские сигналы
SIGPWR(19) – сигнал питания
Для определения обработчиков сигнала может использоваться команда:
trap “cmd1, cmd2…..” <signal>
Команда trap ‘’ <signal> означает игнорирование сигнала.
Команда trap “-” <signal> означает восстановление стандартного обработчика.
Семафоры
Семафоры в Unix используются в основном для синхронизации выполнения взаимодействия процессов и их разделения по доступу к последовательно используемым ресурсам. Семафор есть системный объект, над которым можно выполнить две функции: увеличить значение семафора на 1 (V) и уменьшить на 1 (P). Как только значение семафора рвано 0, то процессы, пытающиеся выполнить операцию над семафором, блокируются (в состояние SSLEEP). Для работы с семафорами существуют 3 системные функции:
semget – создает новый или получить доступ к существующему семафору. В случае создания нового семафора ему может быть присвоено имя (ключ поиска), а так же начальное значение счетчика, связанного с семафором. Возвращает идентификатор созданного или открытого семафора, который используется в других функциях.
semctl – функция управления семафорами. Позволяет опросить состояние семафора. В качестве параметра использует идентификатор семафора.
semop – выполнение операции над семафором. За одну операцию можно применить сразу несколько операции.
Каналы.
Каналы могут быть именованными и неименованными. Именованные предназначены для обмена данными между любыми процессами, которые имеют к ним доступы. Неименованные каналы – только меду родственными процессами (ниже по дереву). Неименованные каналы создаются с помощью команды pipe (fd) с указанием ссылки fd на массив, содержащий 2 целочисленых элемента. Первый, после выхода из функции содержит указатель чтения каналов, а второй – указатель записи. Так как каналы реализованы с помощью файлов, то при выполнении функций создания каналов система производит следующие действия:
Создает временный файл и в системной таблице дескрипторов создает элемент, содержащий индекс на дескриптор этого файла. В системной таблице файлов создается 2 элемента (для чтения и записи) для этого временного файла.
i и j и ТОФ возвращаются в качестве массива.
Чтение из канала осуществляется функцией read(i) а запись функцией write(i)
Если процесс, создавший канал порождает дочерние процессы, то они наследуют оба указателя канала. В их таблице открытых файлов появляются два элемента, а счетчики в системных таблицах удваиваются для каждого порожденного процесса.
Завершение работы канала осуществляется командой close. Канал будет закрыт и временный файл будет уничтожен только после того как все его описатели будут закрыты, т.е. все счетчики = 0.
В случае создания именного канала создается файл с его именем и типом р. Имя файла может быть использовано для доступа к каналу другим процессом. Создание нового именованного канала или открытие существующего осуществляется командой open(), в которой задается имя канала и ссылка на массив из 2х целочисленных значений (номера указателя чтения и записи). При создании файла канала ОС использует для него только блоки прямой адресации, которые используются как циклический буфер. Но не прочитанная информация при переполнении не затирается, а процесс при переполнении канала переходит в состояние ожидания. Однако можно задать параметр nodelay, тогда при записи в переполненный канал будет возвращен код ошибки. Аналогично осуществляется и чтение из пустого канала.
Дата добавления: 2020-10-01; просмотров: 322;