Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

Int msgctl(int mqid, int command, struct msqid_ds *msq_stat);

Переменная mqid должна быть допустимым идентификатором очереди. msq_stat содержит адрес структуры msqid_ds. Эта структура определяется в файле <sys/msg.h> и содержит следующие элементы:

struct ipc_perm msg_perm;

//

Владелец/права доступа

msgqnum_t

msg_qnum;

//

Число сообщений в очереди

msglen_t

msg_qbytes;

//

Макс. число байтов в очереди

pid_t

msg_lspid;

//

Идентификатор процесса,

последним вызвавшего msgsnd

pid_t

msg_lrpid;

//

Идентификатор процесса,

последним вызвавшего msgrcv

time_t

msg_stime;

//

Время посл. вызова msgsnd

time_t

msg_rtime;

//

Время посл. вызова msgrcv

time_t

msg_ctime;

//

Время посл. изменения

Параметр command в вызове msgctl сообщает системе, какую операцию она должна выполнить.

Существуют три возможных значения этого параметра, каж­дое из которых может быть применено к одному из трех средств межпроцессного взаимодействия. Они обозначаются следующими константами, определенными в файле <sys/ipc.h>.

IPC_STAT Сообщает системе, что нужно поместить информацию о стату­се объекта в структуру msg_stat.

IPC_SET Используется для задания значений управляющих параметров очереди сообщений, содержащихся в структуре msg_stat. При этом могут быть изменены только следующие поля:

msq_stat.msg_perm.uid

msq_stat.msg_perm.gid

msq_stat.msg_perm.mode

msq_stat.msg_qbytes

Операция IPC_SET завершится успехом только в случае ее вы­полнения суперпользователем или текущим владельцем очере­ди, заданным параметром msq_stat .msg_perm.uid. Кроме того, только суперпользователь может увеличивать значение msg_qbytes - максимальное количество байтов, которое мо­жет находиться в очереди

IPC_RMID Эта операция удаляет очередь сообщений из системы. Она так­же может быть выполнена только суперпользователем или вла­дельцем очереди. Если параметр command принимает значение IPC_RMID, то параметр msg_stat задается равным NULL.

2. Синхронизирующие примитивы. Решение задачи взаимного исключения с использованием семафоров (7, 8, 19, 20) - 152

Неделимое обращение к общей переменной всегда подразумевает односто­роннее движение информации. Отдельный процесс может либо присвоить новое значение, либо проверить текущее значение. Однако такая проверка не оставляет следов для других процессов. Вследствие этого, в то время как процесс желает отреагировать на текущее значение общей переменной, значение этой переменной может быть изменено другими процессами. То есть такое взаимодействие через общие переменные нельзя считать во всех случаях адекватным. Для разрешения такой ситуации:

1. Вводятся специальные целочисленные общие переменные, называемые семафорами.

2. Добавляются к набору действия, из которых состоят процессы, два новых примитива: p-опера­ция и v-операция.

Эти две операции всегда выполняются над семафорами и представляют единственный способ об­ращения к семафорам со стороны одновременно действующих процессов. Для решения задачи взаим­ного исключения область значений семафоров 0 и 1 (двоичные семафоры), но существует понятие и общего семафора, при котором он может принимать определенное количество целочисленных значе­ний.

s1 – семафор, p(s1) или v(s1) – запись операций над семафором.

V-операция – операция с одним аргументом, который должен быть семафором. Ее назначение – увеличение аргумента на единицу. Это действие рассматривается как неделимая операция.

Имеется достаточно принципиальное различие между семафорными и обычными операциями сложения. Если двумя параллельно-развивающимися процессами выполнена семафорная операция v(s1) над общим семафором s1, получим увеличение семафора s1 на два, так как операция v неделимая. А выполнение операции сложения s1 с единицей параллельными процессами может привести к увели­чению значения s1 на единицу.

P-операция – операция с одним аргументом, который должен быть семафором. Ее назначение – уменьшение аргумента на единицу, если только результирующее значение не становится отрицатель­ным. Завершение р-операции, то есть решение о том, что в настоящий момент является подходящим для выполнения уменьшения и последующее уменьшение значения аргумента, рассматривается как неделимая операция. P-операция определяет потенциальную задержку. Если инициируется р-операция над семафором, который в этот момент равен нулю, то в данном случае р-операция не может завершиться, пока какой-либо другой процесс не выполнит v-операцию над тем же семафором и не присвоит ему значение 1. Несколько процессов могут одновременно начать р-операцию над одним семафором. Утверждение о том, что завершение р-операции есть неделимое действие, означает, что когда семафор получит значение 1, только одна из начавшихся р-операций над семафором завершится, какая именно – не определено.

begin integer свободно;

свободно := 1;

очередь := 0;

parbegin

процесс 1: begin … end;

процесс 2: begin … end;

процесс N: begin … end;

parend;

end;

процесс i:

begin

Li: p(свободно);

Критический интервал i;

V(свободно);

Остаток цикла i;

goto Li;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]