Управление процессами. Конкуренция процессов в борьбе за ресурсы. Понятие взаимоисключения.




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

· обмен данными;

· совместное использование данных;

· явное или неявное использование общих ресурсов.

При необходимости использовать один и тот же ресурс параллельные процессы(потоки) конкурируют друг с другом за получение доступа к ресурсу.

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

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

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

Один из способов обеспечения взаимного исключения - использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят.

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

Управление процессами. Понятие семафоров.

Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива.

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

Пусть S такой семафор. Операции определяются следующим образом:

V(S): переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Такой семафор называется бинарным. В противном случае семафор называется обобщенным(или считающим).

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

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

Введем два семафора:

e - число пустых буферов

f - число заполненных буферов.

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

// Глобальные переменные

#define N 256

int e = N, f = 0, b = 1;

void Writer ()

{

while(1)

{

PrepareNextRecord(); /* подготовка новой записи */

P(e); /* Уменьшить число свободных буферов, если они есть */

/* в противном случае - ждать, пока они освободятся */

P(b); /* Вход в критическую секцию */

AddToBuffer(); /* Добавить новую запись в буфер */

V(b); /* Выход из критической секции */

V(f); /* Увеличить число занятых буферов */

}

}

void Reader ()

{

while(1)

{

P(f); /* Уменьшить число занятых буферов, если они есть */

/* в противном случае ждать, пока они появятся */

P(b); /* Вход в критическую секцию */

GetFromBuffer(); /* Взять запись из буфера */

V(b); /* Выход из критической секции */

V(e); /* Увеличить число свободных буферов */

ProcessRecord(); /* Обработать запись */

}

}

 
22)Управление процессами. Тупики. Взаимные блокировки.

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-06 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: