Взаимодействие между процессами


 

    Как и в других ОС средства взаимодействия процессов в 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; просмотров: 257;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.