Взаимодействие процессов: синхронизация, тупики

Содержание

Слайд 2

Параллельные процессы Параллельные процессы – процессы, выполнение которых хотя бы частично

Параллельные процессы

Параллельные процессы – процессы, выполнение которых хотя бы частично

перекрывается по времени
Независимые процессы используют независимое множество ресурсов
Взаимодействующие процессы используют ресурсы совместно, и выполнение одного процесса может оказать влияние на результат другого.
Слайд 3

Разделение ресурсов Разделение ресурса – совместное использование несколькими процессами ресурса ВС,

Разделение ресурсов

Разделение ресурса – совместное использование несколькими процессами ресурса ВС, когда

каждый из процессов некоторое время владеет ресурсом
Критические ресурсы – разделяемые ресурсы, которые должны быть доступны в текущий момент времени только одному процессу.
Слайд 4

Важнейшие задачи Распределение ресурсов между процессами Организация защиты ресурсов, выделенных определенному

Важнейшие задачи

Распределение ресурсов между процессами
Организация защиты ресурсов, выделенных определенному

процессу, от неконтролируемого доступа со стороны других процессов
Слайд 5

( ( void echo() { char in; input(in) output(in); } Результат


(




(












void echo()
{
char in;
input(in)
output(in);
}

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

Требование мультипрограммирования

Слайд 6

Взаимное исключение Гонки (race conditions) между процессами Взаимное исключение – такой

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

Гонки (race conditions) между процессами
Взаимное исключение – такой способ работы

с разделяемым ресурсом, при котором в тот момент, когда один из процессов работает с разделяемым ресурсом, все остальные процессы не могут иметь к нему доступ.
Критическая секция (или критический интервал) - часть программы (фактически набор операций), в которой осуществляется работа с критическим ресурсом.
Слайд 7

Проблемы организации взаимного исключения Тупики (deadlocks) Блокирование (дискриминация)

Проблемы организации взаимного исключения
Тупики (deadlocks)
Блокирование (дискриминация)

Слайд 8

Тупики (deadlocks) Процесс A Процесс B Ресурс 1 Ресурс 2 STOP STOP Доступ закрыт Доступ закрыт

Тупики (deadlocks)

Процесс A

Процесс B

Ресурс 1

Ресурс 2

STOP

STOP

Доступ закрыт

Доступ закрыт

Слайд 9

Способы реализации взаимного исключения Запрещение прерываний и специальные инструкции Алгоритм Петерсона

Способы реализации взаимного исключения

Запрещение прерываний и специальные инструкции
Алгоритм Петерсона

Активное ожидание
Семафоры Дейкстры
Мониторы
Обмен сообщениями
Слайд 10

Семафоры Дейкстры S – переменная целого типа Операции над S Down(S) (или P(S)) Up(S) (или V(S))

Семафоры Дейкстры

S – переменная целого типа
Операции над S
Down(S) (или P(S))
Up(S) (или

V(S))
Слайд 11

Использование двоичного семафора для организации взаимного исключения Двоичный семафор - семафор,

Использование двоичного семафора для организации взаимного исключения

Двоичный семафор - семафор, начальное

(и максимальное) значение которого равно 1

процесс 1
int semaphore; …
down(semaphore); /*критическая секция процесса 1 */ ... up(semaphore); …

процесс 2
int semaphore; …
down(semaphore); /*критическая секция процесса 2 */ ... up(semaphore); …

Слайд 12

Мониторы Монитор - языковая конструкция, т.е. некоторое средство, предоставляемое языком программирования

Мониторы

Монитор - языковая конструкция, т.е. некоторое средство, предоставляемое языком программирования и

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

Структуры данных монитора доступны только для процедур, входящих в этот монитор
Процесс «входит» в монитор по вызову одной из его процедур
В любой момент времени внутри монитора может находиться не более одного процесса

Слайд 13

Обмен сообщениями Средство, решающее проблему синхронизации для однопроцессорных систем и систем

Обмен сообщениями

Средство, решающее проблему синхронизации
для однопроцессорных систем и систем с

общей памятью,
для распределенных систем (когда каждый процессор имеет доступ только к своей памяти)
Слайд 14

Обмен сообщениями send (destination, message) receive (source, message) Синхронизация - Операции

Обмен сообщениями

send (destination, message)
receive (source, message)

Синхронизация
- Операции посылки/приема сообщения могут

быть блокирующими и неблокирующими.
Адресация
Прямая (ID процесса)
Косвенная (почтовый ящик, или очередь сообщений)
Длина сообщения
Слайд 15

Классические задачи синхронизации процессов

Классические задачи синхронизации процессов

Слайд 16

«Обедающие философы»

«Обедающие философы»

Слайд 17

#define N 5 void philosopher (int i) { while (TRUE) {

#define N 5
void philosopher (int i)
{
while (TRUE) {
think();
take_fork(i);
take_fork((i+1)%N);
eat();
put_fork(i);
put_fork((i+1)%N);
}
}

Слайд 18

# define N 5 # define LEFT (i-1)%N # define RIGHT

# define N 5
# define LEFT (i-1)%N
# define RIGHT (i+1)%N
# define

THINKING 0
# define HUNGRY 1
# define EATING 2
typedef int semaphore;
int state[N];
semaphore mutex=1;
semaphore s[N];
Слайд 19

void philosopher (int i) { } void take_forks(int i) { }

void philosopher (int i)
{
}

void take_forks(int i)
{
}
while (TRUE) {
}
think();
take_forks(i);
eat();
put_forks(i);
down(&mutex);
state[i] =

HUNGRY;
test(i);
up(&mutex);
down(&s[i]);
Слайд 20

void put_forks(int i) { } void test(int i) { } if

void put_forks(int i)
{
}

void test(int i)
{
}
if (state[i] == HUNGRY &&
state[LEFT]

!= EATING &&
state[RIGHT] != EATING) {
state[i] = EATING;
up (&s[i]);
down(&mutex);
state[i] = THINKING;
test(LEFT);
test(RIGHT);
up(&mutex);
Слайд 21

Задача «читателей и писателей»

Задача «читателей и писателей»

Слайд 22

void writer (void) { } void reader (void) { } typedef


void writer (void)
{
}

void reader (void)
{
}

typedef int semaphore;
semaphore mutex = 1;
semaphore

db = 1;
int rc = 0;
while (TRUE) {
}
down (&mutex);
rc = rc+1;
if (rc==1) down (&db);
up(&mutex);
read_data_base();
down(&mutex);
rc = rc-1;
if (rc==0) up(&db);
up(&mutex);
use_data_read();
while(TRUE) {
}
think_up_data();
down(&db);
write_data_base();
up(&db);
Слайд 23

Задача о «спящем парикмахере»

Задача о «спящем парикмахере»