Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_SPO_2.docx
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
4.28 Mб
Скачать

43. Мелкомодульная неделимость. Условие «не больше одного».

Мелкомодульная неделимость

  • Действие, реализуемое непосредственно аппаратным обеспечением.

  • Характеристики машины

    • Значения базовых типов хранятся в элементах памяти, которые считываются и записываются неделимыми действиями

    • Значения обрабатываются так: их помещают в регистры, там применяют операции и затем записывают результаты в память

    • Каждый процесс (поток) обладает своим контекстом (своим набором регистров)

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

Условие «не больше одного» (1)

Оператор присваивания x=e удовлетворяет условию «не больше одного», если либо выражение е содержит не больше одного критического ресурса, а переменная х не является разделяемой, либо выражение е не содержит критических переменных, а другие процессы могут считывать переменную х

1)

int x = 0, y=0;

P1: x=y+1; P2: y=y+1

2)

int x = 0, y=0;

P1: x=x+1; P2: y=y+1

3)

int x = 0, y=0;

P1: x=y+1; P2: y=x+1

44.Задача критической секции.

Задача критической секции (КС)

  • Взаимное исключение

    • В любой момент только один процесс выполняет КС

  • Отсутствие взаимной блокировки

    • Если несколько процессов пытаются войти в КС, хотя бы один это осуществит

  • Отсутствие излишних задержек

    • Решение о вхождении в КС принимается за конечное время

  • Возможность входа

    • Процесс, который пытается войти в КС, когда-нибудь это сделает

К С – это небольшой участок кода, требующий монопольного доступа к каким-либо общим данным (критическим ресурсам). Критическая секция не является объектом ядра (работает только в режиме пользователя), что определяет её высокую скорость работы, но не способность работы с потоками в разных процессах.

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

45.Активные блокировки. Алгоритм «Проверить-установить». Недостатки.

(Test and Set)

активные блокировки — появляются только в SMP системах, когда процессор в ожидании недоступного пока ресурса не переводится в блокированное состояние, а «накручивает» в ожидании освобождения ресурса «пустые» циклы. В этом случае, процессор не освобождается на выполнение другого ожидающего процесса в системе, а продолжает активное выполнение («пустых» циклов) в контексте текущего процесса.

^ Синхронизация процессов посредством операции «ПРОВЕРКА И УСТАНОВКА» Операция «ПРОВЕРКА И УСТАНОВКА» является, как и блокировка памяти, одним из аппаратных средств решения задачи критического интервала. Данная операция реализована на многих компьютерах. Так, в знаменитой IBM 360 (370) эта команда называлась TS (test and set). Команда TS является двухадресной (двухоперандной). Ее действие заключается в том, что процессор присваивает значение второго операнда первому, после чего второму операнду присваивается значение, равное единице. Команда TS является неделимой операцией, то есть между ее началом и концом не могут выполняться никакие другие команды. Чтобы использовать команду TS для решения проблемы критического интерва­ла, свяжем с ней переменную common, которая будет общей для всех процессов, использующих некоторый критический ресурс. Данная переменная будет при­нимать единичное значение, если какой-либо из взаимодействующих процессов находится в своем критическом интервале. С каждым процессом связана своя локальная переменная, которая принимает значение, равное единице, если дан­ный процесс хочет войти в свой критический интервал. Операция TS будет при­сваивать значение common локальной переменной и устанавливать common в единицу. Программа решения проблемы критического интервала на примере двух парал­лельных процессов приведена в листинге 6.5. Листинг 6.5. Взаимное исключение с помощью операции «ПРОВЕРКА И УСТАНОВКА» var common, local1. local2 : integer;  begin common:=0;  parbegin ПР1: while true do  begin local1:=1; while local1=l do TS(local1, common); CS1; { Критический интервал npoueca ПР1 }  common:=0: PR1; { ПР1 после критического интервала }  end  and ПР2: while true do  begin local2:=l; while local2=l do TS(local2, common); CS2; { Критический интервал процеса ПР2 }  common:=0; PR2; { ПР2 после критического интервала } end parend end. Предположим, что первым захочет войти в свой критический интервал процесс ПР1. В этом случае значение local1 сначала установится в единицу, а после цик­ла проверки с помощью команды TS(local1, common) — в ноль. При этом значение common станет равным единице. Процесс ПР1 войдет в свой критический интервал. После выполнения этого критического интервала common примет значение, равное нулю, что даст возможность второму процессу ПР2 войти в свой критический интервал. Безусловно, мы предполагаем, что в компьютере предусмотрена блокировка па­мяти, то есть операция common:=0 неделима. Команда «ПРОВЕРКА И УСТАНОВ­КА» значительно упрощает решение проблемы критических интервалов. Глав­ное свойство этой команды — ее неделимость. Основной недостаток использования операций типа «ПРОВЕРКА И УСТАНОВ­КА» состоит в следующем: находясь в цикле проверки переменной common, про­цессы впустую потребляют время центрального процессора и другие ресурсы. Действительно, если предположить, что произошло прерывание процесса ПР1 во время выполнения своего критического интервала в соответствии с некото­рой дисциплиной обслуживания и начал выполняться процесс ПР2, то он войдет в цикл проверки, впустую тратя процессорное время. В этом случае до тех пор, пока диспетчер супервизора не поставит на выполнение процесс ПР1 и не даст ему закончиться, процесс ПР2 не сможет войти в свой критический интервал. В микропроцессорах i80386 и старше, с которыми мы теперь сталкиваемся по­стоянно, есть специальные команды: ВТС, BTS, ВТК, которые как раз и являют­ся вариантами реализации команды типа «ПРОВЕРКА И УСТАНОВКА».  Несмотря на то, что и алгоритм Деккера, основанный только на блокировке памяти, и операция «ПРОВЕРКА И УСТАНОВКА» пригодны для реализации взаимного исключения, оба эти приема очень неэффективны. Всякий раз, когда один из процессов выполняет свой критический интервал, любой другой про­цесс, который пытается войти в свою критическую секцию, попадает в цикл про­верки соответствующих переменных-флагов, регламентирующих доступ к кри­тическим переменным. При таком неопределенном пребывании в цикле, которое называется активным ожиданием, напрасно расходуется процессорное время, поскольку процесс имеет доступ к тем общим переменным, которые и определя­ют возможность или невозможность входа в критическую секцию. При этом процесс занимает ценное время центрального процессора, на самом деле ничего реально не выполняя. Как результат, мы имеем общее замедление вычислитель­ной системы процессами, которые реально не выполняют никакой полезной ра­боты.

С лекции:

bool TS(bool& locked)

{

< bool init = locked;

locked = true;

return init; >

}

bool lock = false;

process A {

while(true){

// Вход в критическую секцию

while (TS(lock));

// Критическая секция

lock = false;

//Некритическая секция

} }

process B {

while(true){

// Вход в критическую секцию

while (TS(lock));

// Критическая секция

lock = false;

//Некритическая секция

} }

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