DAY16 (Старые версии Машбука или нечто подобное)

2019-05-08СтудИзба

Описание файла

Файл "DAY16" внутри архива находится в следующих папках: Старые версии Машбука или нечто подобное, Лекции (Машечкин 1998). Документ из архива "Старые версии Машбука или нечто подобное", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "DAY16"

Текст из документа "DAY16"

4

Лекция №16

Лекция 16

Уважаемые, давайте продолжим. Сегодня мы с Вами рассмотрим механизм синхронизации доступа к разделяемым, предлагаемый IPC, - механизм семафоров. Семафоры были предложены как механизм синхронизации доступа к разделяемым ресурсам западноевропейским ученым Дейкстрой (Дийкстра - и такой вариант его имени встречается в литературе), человеком известным в теории программирования (Кстати, именно его учения легли в основу разработок алгоритмов маршрутизации сетей). В литературе эти семафоры часто называют семафорами Дейкстры. Он предложил использовать некий формализм, суть которого заключается в том, что есть некоторая целочисленная переменная S, которая называется семафором. Над семафором определены две операции: P(S), V(S).

  • действие P(S) таково: если значение семафора равно нулю, то процесс, выполняющий обращение к P(S) будет приостановлен до тех пор, пока какой-нибудь другой процесс не изменит значение семафора, если же значение семафора отлично от 0, то значение семафора будет уменьшено на единицу.

  • V(S) увеличивает значение семафора на единицу;

Считается, что операции P(S) и V(S) неделимы. Это означает, что выполнение этих операций не может прерваться до их завершения. Эти операции состоят как бы из трех команд: чтение переменной S, сравнение с 0 и то или иное действие над S. Так вот эти три команды, три действия неделимы. Никакое событие не может приостановить выполнение этой цепочки действий и передать управление другому процессу. (Прослеживается некоторая аналогия с механизмом прерываний, т. е. если при выполнении команды произошло прерывание, то команда выполнятся до конца, затем происходит обработка прерывания с последующим возвратом в эту же точку программы). Две операции с семафором - как бы две цельные машинные команды. Эти команды должны входить в систему команд или же ОС должна уметь эмулирвать их.

Частным случаем продекларированного семафора является двоичный семафор, максимальное значение которого равно единичке. Если S=1, то это означает, что ни один из процессов (связанных с этим семафором) не находится в критическом участке. При S=0 один из процессов находится в критическом участке {вот-вот попадет в очередь}, а другой нормально функционирует. При S=-1 один из процессов находится в критическом участке, а другой заблокирован и находится в очереди.

На самом деле двоичные семафоры наиболее часто находили применение в аппаратных реализациях, например, в многомашинных комплексах с общей оперативной памятью. Аналогичным образом можно говорить и о т. н. k-ичных семафорах.

В разных системах можно видеть различные вариации организации семафоров. Но общая идея аналогична идеи семафоров, предложенных Дейкстрой. В чем же их практический смысл? Для чего нужны семафоры? Ответ таков. Если у нас имеется разделяемый ресурс, т. е. ресурс, к которому могут иметь доступ два или более процесса, то используя операции P(S) и V(S), можно организовать синхронизированный доступ к этому разделяемому ресурсу, который основывается на том, что за счет ожидания при обращении к операции P(S) мы можем установить монопольный режим доступа процесса к разделяемому ресурсу при помощи установки нулевого значения семафора. После этого процессы, обратившиеся к этому семафору, будут заблокированы. Промежуток между началом блокировки и освобождением семафора называется критической секцией (критическим участком). В процессе работы кода гарантируется, что на этом промежутке программы никакой другой процесс не активизируется.

Одним из разделяемых ресурсов, который поддерживает система IPC, является т.н. массив семафоров. Суть механизма заключается в следующем. Имеется разделяемый с точки зрения IPC ресурс. Этот ресурс представляет собой массив элементов, где каждый элемент - семафор, несколько отличающийся от канонического определения семафора, но по сути это именно тот формализм, который предложил Дейкстра. У него есть аналогичные операции P(S) и V(S). Система позволяет процессам, участвующим во взаимодействии с данным разделяемым ресурсом, увеличивать или уменьшать один или несколько семафоров из данного массива на произвольное значение (в пределах разрядной сетки). Система обеспечивает ожидание процессами обнуления одного или нескольких семафоров.

Давайте рассмотрим средства, предоставляемые системой IPC, для создания, управления и взаимодействия с семафорами.

int semget(key_t key, int n, int flags);

int semop(int semid, struct sembuf * sops, int n);

struct sembuf{

short sem_num; // номер семафора в массиве семафоров

short sem_op; // код операции, которую надо выполнить

short sem_flg; // флаги

}

Первый параметр функции semget - ключ, второй - количество семафоров (длина массива семафоров) и третий параметр - флаги. Через флаги можно определить права доступа и те операции, которые должны выполняться (открытие семафора, проверка, и т.д.). Функция semget возвращает целочисленный идентификатор созданного разделяемого ресурса, либо -1, если ресурс не удалось создать (причина - в errno).

Первый параметр функции semop - идентификатор семафора, второй - указатель на структуру sembuf и третий параметр - количество указателей на эту структуру, которые передаются функцией semop. В структуре содержится вся информация о необходимом действии.

Поле операции интерпретируется следующим образом. Пусть значение семафора с номером sem_num равно sem_val. В этом случае, если значение операции не равно нулю, то оценивается значение суммы (sem_val + sem_op). Если эта сумма больше либо равна нулю, то значение данного семафора устанавливается равным сумме предыдущего значения и кода операции. Если эта сумма меньше нуля, то действие процесса будет приостановлено до наступления одного из следующих событий:

  1. Значение суммы (sem_val + sem_op) станет больше либо равно нулю.

  2. Пришел какой-то сигнал. (Значение semop в этом случае будет равно -1).

Если код операции semop равен нулю, то процесс будет ожидать обнуления семафора. Если мы обратились к функции semop с нулевым кодом операции, а к этому моменту значение семафора стало равным нулю, то никакого ожидания не происходит.

Рассмотрим третий параметр - флаги. Если третий параметр равен нулю, то это означает, что флаги не используются. Флагов имеется большое количество в т. ч. IPC_NOWAIT (при этом флаге во всех тех случаях, когда мы говорили, что процесс будет ожидать, он не будет ожидать).

Обращаю ваше внимание, что за одно обращение к функции semop можно передать n структур и соответственно выполнить действия с n семафорами из этого массива. Если в этой последовательности будут присутствовать две разные операции с одни семафором, то скорее всего, выполнится последняя.

Функция управления массивом семафоров.

int semctl(int id, int sem_num, int cmd, union sem_buf arg);

Первый параметр - идентификатор, второй - номер семафора в массиве, с которым мы будем выполнять команду cmd из третьего параметра. Последний параметр - некоторое объединение типа sem_buf.

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

Вот те функции, которые предназначены для работы с семафорами. А теперь рассмотрим пример работы с семафорами, я рекомендую, чтобы каждый из вас «поиграл» с этим примером и прочувствовал суть механизма семафоров. Сразу скажу, что пример несколько обобщенный и упрощенный (совершенная программа будет занимать слишком много места, и мы сознательно делаем некоторые упрощения), и любознательные студенты имеют простор для работы:

Наша программа будет оперировать с разделяемой памятью.

1 процесс - создает ресурсы “разделяемая память” и “семафоры”, далее он начинает принимать строки со стандартного ввода и записывает их в разделяемую память.

2 процесс - читает строки из разделяемой памяти.

Таким образом, мы имеем критический участок в момент, когда один процесс еще не дописал строку, а другой ее уже читает. Поэтому следует установить некоторые синхронизации и задержки.

1й процесс:

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int main(void)

{ key_t key;

int semid, shmid;

struct sembuf sops;

char *shmaddr;

char str[256];

key = ftok(“/usr/mash/exmpl”,’S’); // создаем уникальный ключ

semid = semget(key,1,0666 | IPC_CREAT); // создаем один семафор с определенными // правами доступа

shmid = shmget(key,256, 0666 | IPC_CREAT); /*создаем разделяемую память на 256 элементов */

shmaddr = shmat(shmid, NULL, 0); /* подключаемся к разделу памяти, в shaddr -

указатель на буфер с разделяемой памятью*/

semctl(semid,0,IPC_SET, (union semun) 0); //инициализируем семафор со значением 0

sops.sem_num = 0; sops.sem_flg = 0;

// запуск бесконечного цикла

while(1) { printf(“Введите строку:”);

if ((str = gets(str)) == NULL) break;

sops.sem_op=0; // ожидание обнуления семафора

semop(semid, &sops, 1);

strcpy(shmaddr, str); // копируем строку в разд. память

sops.sem_op=3; // увеличение семафора на 3

semop(semid, &sops, 1);

}

shmaddr[0]=’Q’; // укажем 2-ому процессу на то,

sops.sem_op=3; // что пора завершаться

semop(semid, &sops, 1);

sops.sem_op = 0; // ждем, пока обнулится семафор

semop(semid, &sops, 1);

shmdt(shmaddr); // отключаемся от разд. памяти

semctl(semid, 0, IPC_RMID, (union semun) 0); // убиваем семафор

shmctl(shmid, IPC_RMID, NULL); // уничтожаем разделяемую память

exit(0); }

2й процесс:

/* здесь нам надо корректно определить существование ресурса, если он есть - подключиться, если нет - сделать что-то еще, но как раз этого мы делать не будем */

#include <stdio.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int main(void)

{ key_t key; int semid;

struct sembuf sops;

char *shmaddr;

char st=0;

// далее аналогично предыдущему процессу - инициализации ресурсов

semid = semget(key,1,0666 | IPC_CREAT);

shmid = shmget(key,256, 0666 | IPC_CREAT);

shmaddr = shmat(shmid, NULL, 0);

sops.sem_num = 0; sops.sem_flg = 0;

// запускаем цикл

while(st!=’Q’) {

printf(“Ждем открытия семафора \n”);

// ожидание положительного значения семафора

sops.sem_op=-2;

semop(semid, &sops, 1);

// будем ожидать, пока “значение семафора”+”значение sem_op” не перевалит за

0, то есть если придет “3”, то “3-2=1

// теперь значение семафора равно 1

st = shmaddr[0];

{ /*критическая секция - работа с разделяемой памятью - в этот момент

первый процесс к разделяемой памяти доступа не имеет*/}

/* после работы - закроем семафор */

sem.sem_op=-1;

semop(semid, &sops, 1);

// вернувшись в начало цикла мы опять будем ждать, пока значение семафора не станет больше нуля

}

shmdt(shmaddr); // освобождаем разделяемую память и выходим

exit(0);

}

Это программа, состоящая из двух процессов, синхронно работающих с разделяемой памятью. Понятно, что при наличии интереса можно работать и с сообщениями.

На этом мы заканчиваем большую и достаточно важную тему организации взаимодействия процессов в системе.

Наша самоцель - не изучение тех средств, которые предоставляет UNIX, а изучение принципов, которые предоставляет система для решения тех или иных задач, так как другие ОС предоставляют аналогичные или похожие средства управления процессами.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
428
Средний доход
с одного платного файла
Обучение Подробнее