Unix - статьи



         

Семафоры - часть 2


  • short sem_num – номер семафора (в массиве), над которым выполняется операция (нумерация начинается с нуля).
  • short sem_op – число, изменяющее состояние семафора.
  • short sem_flg – дополнительные флаги.
  • Как и в приведенном выше схематическом примере работы семафора, отрицательное значение sem_op соответствует операции проверки доступности ресурса и вызывает приостановку потока, если ресурс недоступен. Положительное значение заставляет семафор высвободить ресурс (или приблизиться к этому). Указатель на массив структур sembuf (по структуре на семафор) передается как второй параметр функции semop(2), которая либо изменяет состояние семафора, либо приостанавливает вызывавший поток. Первый параметр этой функции – идентификатор, возвращенный semget(). В третьем параметре передается число записей в массиве sembuf. Вот как, например, мы указываем, что клиент может записывать данные в разделяемую область:

    buf[1].sem_op = 1; semop(semid, (struct sembuf*) &buf[1], 1);

    А эти строки приостановят сервер, пока клиент не изменит значение первого семафора:

    buf[0].sem_op = -1; semop(semid, (struct sembuf*) &buf, 1);

    Получая разрешение на доступ к разделяемой области, процесс производит чтение/запись, разрешает доступ другому процессу, запрещает доступ себе и приостанавливается. Удаление семафора выполняет с помощью функции semctl(), в которой, кроме прочего, нужно указывать число семафоров: semctl(semid, 2, IPC_RMID);

    Скомпилируйте сервер под именем semserv, а клиент под именем semcli, (или командуйте make semdemo) запустите клиент и сервер. Вы увидите, что обмен данными выполняется гораздо быстрее, а процессор загружается гораздо меньше, чем в случае использования спин-блокировок.

    При всем богатстве выбора средств взаимодействия между процессами в Unix/Linux, самыми популярными средствами были и остаются сокеты. Ими мы и займемся в следующий раз.




    Содержание  Назад  Вперед