Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
операционные системы.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
70.63 Кб
Скачать

Аппаратная поддержка взаимоисключений

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

Test and set

Int test_and_set (int *target) {

Int tmp=*target;

*target=1;

Return tmp;

}

Shared int lock = 0;

While (some condition) {

While (test_and_set(*lock));

Critical section

Lock=0;

Remainder section

}

К сожалению даже в таком виде полученный алгоритм не удовлетворяет условию ограниченного ожидания алгоритмов.

Void swap (int *a, int *b) {

Int tmp = *a;

*a = *b;

*b = tmp;

}

Shared int lock = 0;

Int key;

While (some condition) {

Key=1;

Do swap (&lock,&key);

While(key);

Critical section

Lock=0;

Remainder section

}

Семафоры

Семафор представляет собой целую переменную, принимающую целые значений, доступ в любой момент к которой, за искл. инициализации, P и V.

Операция P над семафором S.

Пока s==0 процесс блокируется

При выполнении операции П над семафором С сначала проверяется его значение. Если оно больше 0, то из С вычитается 1. Если оно меньше или равно 0, то процесс блокируется до тех пор, пока С не станет больше 0, после чего из С вычитается 1. При выполнении операции В к его значению просто прибавляется 1. В момент создания семафор может быть проинициализирован любым неотрицательным значением.

Решение задачи производитель-потребитель с помощью семафоров.

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

Производитель:

While(1) {

Produce_item();

Put_item;

}

Потребитель:

While(1) {

Take_item;

Consume_item;

}

Если буфер заполнен, то производитель должен ждать, пока в нем не появится место, чтобы положить туда новую порцию информации. Если буфер пуст, то потребитель должен дождаться нового сообщения. Возьмем три семафора empty, full, mutex.

Empty будем использовать для гарантии того, что потребитель будет ждать, пока в буфере появится информация. Full для организации ожидания производителя при заполненном буфере. Mutex для взаимоисключения на критических участках, которыми является put и get.

Семафоры использовались здесь для достижения двух целей: организация взаимоисключений на критическом участке и взаимоорганизация скорости выполнения процессов.

Лекция 9 (22.11.2012)

Мониторы, Критические секции

Лекция 10 (29.11.2012) Связывание файлов

Ядро позволяет пользователю связывать каталоги, упрощая написание программ, требующих пересечения дерева файловой системы. Часто имеет смысл хранить одну и ту же программу под разными именами.

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

  1. Жесткая ссылка (hard link). Если блоки данных файла перечислены не в директории, а в небольшой структуре данных, например в индексном узле, связанной собственно с файлом, то второй пользователь может связаться непосредственно с этой, уже существующей структурой.

  2. Альтернативное решение – создание нового файла, который содержит путь к связываемому файлу. Такой подход называется символической линковкой (soft link). При этом в соответствующем каталоге создается элемент, в котором имени связи сопоставляется некоторое имя файла. Этот файл даже не обязан существовать к моменту создания символической связи. Для символической связи может создаваться отдельно индексный узел и даже заводиться отдельный блок данных для хранения потенциально длинного имени файла.

Каждый из этих методов имеет свои минусы. В случае жесткой связи возникает необходимость поддерживать счетчик ссылок на файл для корректной реализации удаления файла. В линуксе счетчиком является один из атрибутов, хранящихся в индексном узле. Удаление файла одним из пользователей уменьшает количество ссылок на файл на 1. Реальное удаление файла происходит, когда число ссылок на файл становится равным 0. В случае символической линковки такая проблема не возникает, т.к. только реальный владелец имеет ссылку на индексный узел файла. Если собственник удаляет файл, то он разрушается и попытки других пользователей работать с ним заканчиваются провалом. Удаление символического линка на файл никак не влияет. Проблема организации символической связи, это потенциальное снижение скорости доступа к файлу. Файл симв линка хранит путь к файлу, содержащий список вложенных директорий, для прохождения по которому необходимо осуществить несколько обращений к диску. Симв линк имеет то преимущество, что он может использоваться для организации удобного доступа к файлам удаленных компьютеров.