Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

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

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Выполнение операций над семафорами. Системный вызов semop().




Для выполнения операций A, D и Z над семафорами из массива используется системный вызов semop(), обладающий довольно сложной семантикой. Разработчики System V IPC явно перегрузили этот вызов, применяя его не только для выполнения всех трех операций, но еще и для нескольких семафоров в массиве IPC семафоров одновременно. Для правильного использования этого вызова необходимо выполнить следующие действия:

1. Определиться, для каких семафоров из массива вы хотите выполнить операции. Необходимо иметь в виду, что все операции реально совершаются только перед успешным возвращением из системного вызова, т.е. если вы хотите выполнить операции A(S1,5) и Z(S2) в одном вызове и оказалось, что S2!= 0, то значение семафора S1 не будет изменено до тех пор, пока значение S2 не станет равным 0. Порядок выполнения операций в случае, когда процесс не переходит в состояние ожидание не определен. Так, например, при одновременном выполнении операций A(S1,1) и D(S2,1) в случае S2 > 1 неизвестно, что выполнится раньше - уменьшение значения семафора S2 или увеличение значения семафора S1. Если порядок является для вас существенным, лучше применить несколько вызовов вместо одного.

2. После того как вы определились с количеством семафоров и совершаемыми операциями, необходимо завести в программе массив из элементов типа struct sembuf с размерностью равной определенному количеству семафоров (если операция совершается только над одним семафором можно, естественно, обойтись просто переменной). Каждый элемент этого массива будет соответствовать операции над одним семафором.

3. Заполнить элементы массива. В поле sem_flg каждого элемента занести значение 0 (с другими значениями флагов мы на семинарах работать не будем). В поля sem_num и sem_op занести номера семафоров в массиве IPC семафоров и соответствующие коды операций. Семафоры нумеруются, начиная с 0. Если у вас в массиве всего один семафор, то он будет иметь номер 0. Операции кодируются так:

· для выполнения операции A(S,n) значение поля sem_op должно быть равно n.

· для выполнения операции D(S,n) значение поля sem_op должно быть равно -n.

· для выполнения операции Z(S) значение поля sem_op должно быть равно 0.

4. В качестве второго параметра системного вызова semop() указать адрес заполненного массива, а в качестве третьего параметра - ранее определенное количество семафоров, над которыми совершаются операции.

Прогон примера с использованием семафора.

Для иллюстрации вышесказанного давайте рассмотрим простейшие программы, синхронизирующие свои действия с помощью семафоров Программа05-1 выполняет над семафором S операцию D(S,1), программа 05-2 выполняет над тем же семафором операцию A(S,1). Если семафор не существует в системе, любая программа создает его перед выполнением операции. Поскольку при создании семафор всегда инициируется 0, то программа 05-1 может работать без блокировки только после запуска программы 05-2.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных