Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
26-30.docx
Скачиваний:
9
Добавлен:
08.09.2019
Размер:
118.7 Кб
Скачать

Реализация семафоров для FreeBsd с указанием программной семантики.

При работе с семафорами процессы используют различные

комбинации из трех операций, определенных системой, посвоему трактуя

значения семафоров.

В качестве примера рассмотрим два случая использования бинарного сема

фора (т. е. значения которого могут принимать только 0 и 1). В первом

примере значение 0 является разрешающим, а 1 запирает некоторый разде

ляемый ресурс (файл, разделяемая память и т. п.), ассоциированный с се

мафором. Определим операции, запирающие ресурс и освобождающие его:

static struct = {

О, О, О, обнуления

О, 1, 0 /*затем увеличить значение семафора на

static struct sembuf sop unlock [1] = {

0, 0 Значение

Итак, для запирания ресурса процесс вызов:

обеспечивающий атомарное выполнение двух

Ядро обеспечивает атомарное выполнение не всего набора операций в целом, а лишь критических участков. Так, например, в процессе ожидания освобождения ресурса (ожидание нулевого значения семафора) выполнение процесса будет (и должно быть) прервано пр цессом, который освободит ресурс (т. е. установит значение семафора равным 1). Ожидание семафора соответствует "сна" процесса, допускающим выполнение других процессов в системе. В противном случае, процесс, ожидающий ресурс, остался бы заблокированным навсегда.

29

Реализация очередей сообщений для FreeBsd с указанием программной семантики.

Очередь сообщений хранится в виде внутреннего однонаправленного свя!

занного списка в адресном пространстве ядра. Для каждой очереди ядро

создает заголовок очереди где содержится информация о пра!

вах доступа к очереди ее текущем состоянии (msg_cbytes —

число байтов и — число сообщений в очереди), а также указате!

ли на первое и последнее сообщения, хранящие!

ся в виде связанного списка (рис. 3.18). Каждый элемент этого списка яв!

ляется отдельным сообщением.

Сообщения

Для создания новой очереди сообщений или длядоступа к существующей

используется системныйвызов

#include

<sys/ipc.h>

#include

int key_t key, int

Функция возвращает дескриптор объекта!очереди, либо !1 в случае ошибки.

Подобно файловому дескриптору, этот идентификатор используется процес!

сом для работы с очередью сообщений. В частности, процессможет:

Помещать в очередь сообщения с помощью функции

Получать сообщения определенного типа из очереди с помощью

функции

Управлять сообщениями с помощью функции

Перечисленные системные вызовы манипулирования сообщениями имеют

следующий вид:

<sys/ipc.h>

ttinclude <sys/msg.h>

int const void

msgsz, int

int msqid,void *msgp,

msgsz, long int

Здесь является дескриптором объекта, полученного в результате вы!

зова Параметр указывает на буфер, содержащий тип сооб!

щения и егоданные, размер которого равен msgsz байт. Буфер имеет сле!

дующие поля:

long тип сообщения

char данные сообщения

Аргумент msgtyp указывает на тип сообщения и используется для их вы!

борочного получения. Если msgtyp равен 0, функция получит

первое сообщение изочереди. Если величина m s g t y p выше 0, будет полу!

чено первое сообщение указанного типа. Если msgtyp меньше 0, функция

получит сообщение с минимальным значением типа, меньше или

равного абсолютному значению msgtyp.

30