Управление ресурсами в ОС UNIX

       

Int semop (int semid, struct sembuf *op_array, count),


где semid - это ранее полученный дескриптор группы семафоров, op_array - массив структур sembuf, определенных в файле <sys/sem.h.h&gt и содержащих описания операций над семафорами группы, а count - размер этого массива. Значение, возвращаемое системным вызовом, является значением последнего обработанного семафора. Каждый элемент массива op_array имеет следующую структуру (структура sembuf):

  • номер семафора в указанном наборе семафоров
  • операция над семафором;
  • флаги.
  • Если указанные в массиве op_array номера семафоров не выходят за пределы общего размера набора семафоров, то системный вызов последовательно меняет значение семафора (если это возможно) в соответствии со значением поля "операция". Возможны три случая:

    1. Отрицательное значение sem_op.

  • Если значение поля операции sem_op отрицательно, и его абсолютное значение меньше или равно значению семафора semval, то ядро прибавляет это отрицательное значение к значению семафора.
  • Если в результате значение семафора стало нулевым, то ядро активизирует все процессы, ожидающие нулевого значения этого семафора.
  • Если же значение поля операции sem_op по абсолютной величине больше семафора semval, то ядро увеличивает на единицу число процессов, ожидающих увеличения значения семафора и усыпляет текущий процесс до наступления этого события.
  • 2. Положительное значение sem_op.

    Если значение поля операции sem_op положительно, то оно прибавляется к значению семафора semval, а все процессы, ожидающие увеличения значения семафора, активизируются (пробуждаются в терминологии UNIX).

    3. Нулевое значение sem_op.

  • Если значение поля операции sem_op равно нулю, то если значение семафора semval также равно нулю, выбирается следующий элемент массива op_array.
  • Если же значение семафора semval отлично от нуля, то ядро увеличивает на единицу число процессов, ожидающих нулевого значения семафора, а обратившийся процесс переводится в состояние ожидания
  • При использовании флага IPC_NOWAIT ядро ОС UNIX не блокирует текущий процесс, а лишь сообщает в ответных параметрах о возникновении ситуации, приведшей бы к блокированию процесса при отсутствии флага IPC_NOWAIT.


    II. Очереди сообщений.



    Для обеспечения возможности обмена сообщениями между процессами механизм очередей поддерживается следующими системными вызовами:

  • msgget() для образования новой очереди сообщений или получения дескриптора существующей очереди;


  • msgsnd() для постановки сообщения в указанную очередь сообщений;


  • msgrcv() для выборки сообщения из очереди сообщений;


  • msgctl() для выполнения ряда управляющих действий


  • Прототипы перечисленных системных вызовов описаны в файлах

    #include <sys/ipc.h>

    #include <sys/msg.h>

    По системному вызову msgget() в ответ на ключ (key) и набор флагов (полностью аналогичны флагам в системном вызове semget()) ядро либо создает новую очередь сообщений и возвращает пользователю идентификатор созданной очереди, либо находит элемент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий идентификатор очереди:


    Содержание раздела