Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilety_po_Osyam.doc
Скачиваний:
3
Добавлен:
28.04.2019
Размер:
235.52 Кб
Скачать

Нарушение условия кругового ожидания

Трудно предложить разумную стратегию, чтобы избежать последнего условия из раздела «Условия возникновения тупиков» – циклического ожидания.

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

Другой способ атаки условия кругового ожидания – действовать в соответствии с правилом, согласно которому каждый процесс может иметь только один ресурс в каждый момент времени. Если нужен второй ресурс – освободи первый. Очевидно, что для многих процессов это неприемлемо.

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

Mutex (mutual exclusion) – двоичный флажок ({0,1}). Можно захватывать(lock) и освобождать(unlock,release).

Lock – если флажок = 0, то = 1, если был равен 1, то процесс заблокирован.

Unlock – присваивает флажку 0, если есть заблокированные, то какой-нибудь разблокируется.

mutex – объект ядра.

ПРИМЕРЫ:

П1: while (1){ П2: while (1) {

m.lock(); m.lock(){

n++;n++; if (n &1)

cout<<”!!!”;

} m.unlock(); }

ПР2: a.lock(); b.lock();

……..

b.lock(); a.lock();

……..

b.unlock(); a.unlock();

a.unlock(); b.unlock();

=> Всё остановится навсегда – deadlock(смертельные объятья).

Семафоры – обобщение mutex. В основе – счетчик n.

При каждом захвате из счетчика вычетается 1, когда станет 0 – следующий захват заблокирует всех.

Защищает группу однотипных ресурсов, в отличие от мьютекса, который защищает только один ресурс.

Операции те же, но при захвате -1, разблокировать 1. Если n==0 – заблокировать.

Event(Событие) ждут до какого-то события (типа клик).

wait(ждать), raise(известить, что произошло).

Внутри – флажок. Вначале равен 0, wait – блокирует, если 0; если 1, то управление ему.

raise – флажок = 1, то разблокирует ждущего это событие.

Timer по времени.

17. Гармонически взаимодействующие процессы – 1) они никак не взаимодействуют; 2) взаимодействуют в строго определенных точках кода программ.

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

Желание устранить эти проблемы привело в свое время Дэйкстру к концепции, известной как гармонически взаимодействующие последовательные процессы. Эта концепция состоит в следующем:

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

  • Процессы не имеют разделяемых данных.

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

  • Синхронизация, не сопровождающаяся передачей данных, просто лишена смысла - процессы, не имеющие разделяемых структур данных, совершенно независимы и не имеют ни критических точек, ни нерентерабельных модулей.

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

18. Труба(Pipe) – универсальный инструмент передачи информации между процессами. Создаётся односторонняя, только одна.

Создаются именованные трубы. Другой процесс может открыть трубу.

a | b | c | d

Временный файл (хранилище) – видимый объект в локальной сети, создаваемый при передачи.

Если в трубе есть данные, то работает, если нет, то ждет, т.о. происходит синхронизация по времени.

Средство передачи данных с гарантированной доставкой.

Создавая трубу можно сказать, кто имеет право ей пользоваться.

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

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

Почтовый ящик:

Используется, если нужно послать сообщение сразу многим.

Отличие от труб: 1. трубы – файлы, п.я. – область памяти, поэтому ограничен в размерах.

  1. труба – с гарантированной доставкой.

Если ящик полон, то при новом письме выталкиваем самое старое, не гарантирует доставки писем.

«+» один экземпляр письма может быть доступен всем.

Хорош, когда сообщения маленькие и программы часто его проверяют.

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