Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Демкин_Экзамен.doc
Скачиваний:
10
Добавлен:
26.11.2018
Размер:
1.2 Mб
Скачать
  1. Что такое критическая область процесса? что такое тупик? какие виды тупиков бывают? назовите принципы разработки многопоточных программ, которые позволят избежать для них попадания в тупики.

Критическая секция — часть программы, в которой есть обращение к совместно используемым данным. При нахождении в критической секции двух (или более) процессов, возникает состояние «гонки» («состязания»). Для избежания данной ситуации необходимо выполнение четырех условий:

1) Два процесса не должны одновременно находиться в критических областях.

2) В программе не должно быть предположений о скорости или количестве процессоров.

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

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

Тупики бывают двух видов LiveLock и DeadLock

Взаи́мная блокиро́вка (англ. deadlock) — ситуация в многозадачной среде или СУБД, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами.

Есть также Live Lock

Livelock

Это слово означает такую ситуацию: система не «застревает» (как в обычной взаимной блокировке), а занимается бесполезной работой, её состояние постоянно меняется — но, тем не менее, она «зациклилась», не производит никакой полезной работы.

Жизненный пример такой ситуации: двое встречаются лицом к лицу. Каждый из них пытается посторониться, и они не расходятся, а несколько секунд ходят влево-вправо.

  1. ПЕРЕЧИСЛИТЕ РАЗНЫЕ СПОСОБЫ СИНХРОНИЗАЦИИ РАБОТЫ МНОГОПОТОЧНЫХ ПРОГРАММ. ПЕРЕЧИСЛИТЕ И ОХАРАКТЕРИЗУЙТЕ ПРОБЛЕМНЫЕ СИТУАЦИИ, КОТОРЫЕ МОГУТ ВОЗНИКАТЬ В СЛУЧАЕ КОНКУРЕНЦИИ ЗА РЕСУРСЫ МЕЖДУ НИТЯМИ. КАКИЕ СУЩЕСТВУЮТ ПОДХОДЫ, ДЛЯ ТОГО ЧТОБЫ ИЗБЕЖАТЬ ИХ?

Cм. предыдущие два вопроса

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

Проблемные ситуации: метрвая и живая блокировка.

Как избежать:

1) Два процесса не должны одновременно находиться в критических областях.

2) В программе не должно быть предположений о скорости или количестве процессоров.

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

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

Или использовать MPI

  1. Что представляет из себя примитив синхронизации “семафор”? опишите его интерфейс (набор операций) и приведите простой пример использования.

Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам.

Семафор — это объект, с которым можно выполнить три операции.

1) init(n):счётчик := n

2) enter():ждать пока счётчик станет больше 0; после этого уменьшить счётчик на единицу.

3) leave():увеличить счётчик на единицу.

Предположим, что есть такой участок кода:

semaphore.init(5);

.....

.....

void DoSomething( void )

{

semaphore.enter();

.......

semaphore.leave();

}

Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething().

В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие освобождения семафора, будут проходить через семафор именно в том порядке, в котором они вызывали enter().

Применение семафоров

Вот некоторые из проблем, которые могут решать семафоры.

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

поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен одновременный доступ).

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

semaphore.init(1);

Поток 1:

semaphore.enter();

cout << "Состояние массива: ";

for (int i=0; i<n; i++)

cout << a[i] << ' ';

cout << '\n';

semaphore.leave();

Поток 2:

semaphore.enter();

cout << "Нажато Esc.\n";

semaphore.leave();

Этот код поможет предотвратить появление листинга наподобие

Состояние массива: 1 2 3 Нажато Esc.

4 5 6