в буфер, а агенты
A
2
, A
3
, . . . , A
k
берут их из него и рассылают потре-
бителям. Все агенты являются процессами и функционируют парал-
лельно. Наша задача — формулировать свойства их правильного пове-
дения. Прежде чем рассматривать механизм взаимодействия агентов,
напомним, что такое семафорные переменные. Семафорными пере-
менными являются особые переменные, используемые для синхрони-
зации работы параллельных процессов (в нашем случае агентов). Над
каждой из этих переменных
x
могут выполняться только две команды:
занять
(
x
)
и
освободить
(
x
)
. Переменная может быть занята, если ее
значение не равно 0. Если переменная занята, то до ее освобождения
никто ее занять не может. При занятии значение семафорной перемен-
ной увеличивается на 1, при освобождении — уменьшаться на 1 (ука-
зывается в комментариях). Команда
освободить
может выполняться
и над незанятой семафорной переменной, изменяя ее значение. Ника-
кие другие операции над семафорными переменными не допускаются.
Процесс, достигший команды
занять
(
x
)
, будет выполняться дальше
только в том случае, если нет ни одного другого процесса, который
уже занял эту переменную и еще не освободил. После освобождения
переменной она может быть занята любым другим процессом. При
попытке занятия свободной семафорной переменной сразу несколь-
кими процессами занять ее может один из них. Для синхронизации
взаимодействия агентов
A
1
, A
2
, . . . , A
k
введем три семафорных пере-
менных:
•
переменную
x
1
, используемую для исключения одновременного
доступа агентов в буфер;
•
переменную
x
2
, указывающую число свободных мест в буфере.
Она защищает буфер от переполнения. Отправитель не может поло-
жить кадр в буфер, если
x
2
=0. Значение переменной
x
2
увеличивается
на 1 после каждого помещения отправителем кадра в буфер. В начале
работы агента
A
1
значение
x
2
=
N
. Отправитель не может положить
в буфер более, чем
N
кадров. Каждый потребитель уменьшает
x
2
на
1 после взятия одного кадра;
•
переменную
x
3
, содержащую текущее количество кадров в буфе-
ре; ее начальное значение равно 0; оно увеличивается отправителем
на 1 всякий раз, когда он кладет туда кадр, и уменьшается передатчи-
ком на 1 всякий раз, когда он берет из буфера кадр. Эта переменная
используется для того, чтобы потребитель никогда не пытался взять
кадр из пустого буфера.
Агенты используют буфер
В
, который имеет
N
ячеек памяти
В
(
l
)
,
l
= 1
, . . . , N
. Буфер может быть пуст и тогда переменная
x
3
= 0
. Ес ли
x
3
=
0, то в буфере содержится
x
3
кадров в ячейках
В
(1)
, . . . ,
В
(
x
3
)
.
Ячейка памяти
В
(1)
в этом случае называется головной и обознача-
74 ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2005. № 4