Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 семестр / Литература / лекция4.процессы и потоки.pptx
Скачиваний:
14
Добавлен:
18.02.2023
Размер:
695.59 Кб
Скачать

ЗАДАЧА ПРОИЗВОДИТЕЛЯ И ПОТРЕБИТЕЛЯ, РЕШАЕМАЯ С ПОМОЩЬЮ СЕМАФОРОВ

#define N 100

/* Количество мест в буфере */

typedef int semaphore;

/* Семафоры — это специальная разновидность

 

целочисленной переменной */

semaphore mutex = 1;

/* управляет доступом к критической области */

semaphore empty = N;

/* подсчитывает пустые места в буфере */

semaphore full = 0;

/* подсчитывает занятые места в буфере */

void producer(void)

 

{

 

int item;

 

while (TRUE) {

/* TRUE — константа, равная 1 */

item = produce_item( );

/* генерация чего-нибудь для помещения в

 

буфер */

down(&empty);

/* уменьшение счетчика пустых мест */

down(&mutex);

/* вход в критическую область */

insert_item(item);

/* помещение новой записи в буфер */

up(&mutex);

/* покинуть критическую область */

up(&full);

/* инкремент счетчика занятых мест */

}

 

}

 

void consumer(void)

 

{

 

int item;

 

while (TRUE) {

/* бесконечный цикл */

down(&full);

/* уменьшение счетчика занятых мест */

down(&mutex);

/* вход в критическую область */

item = remove_item( );

/* извлечение записи из буфера */

up(&mutex);

/* выход из критической области */

up(&empty);

/* увеличение счетчика пустых мест */

consume_item(item);

/* работа с записью */

}

 

}

 

ЗАДАЧА ПРОИЗВОДИТЕЛЯ И ПОТРЕБИТЕЛЯ, РЕШАЕМАЯ С ПОМОЩЬЮ СЕМАФОРОВ

Семафор mutex используется для организации взаимного исключения.

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

Другие семафоры используются для синхронизации.

Семафоры full и empty нужны для гарантии наступления или не наступления тех или иных конкретных последовательностей событий. В данном случае они гарантируют, что производитель приостановит свою работу при заполненном буфере, а потребитель приостановит свою работу, если этот буфер опустеет. Эти семафоры используются совсем не так, как при обеспечении взаимного исключения.

СЕМАФОРЫ

МЬЮТЕКСЫ

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

Мьютекс — это совместно используемая переменная, которая может находиться в одном из двух состояний: заблокированном или незаблокированном.

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

МЬЮТЕКСЫ

Для работы с мьютексами используются две процедуры.

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

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

МЬЮТЕКСЫ

Фьютекс, или fast user space mutex, — быстрый мьютекс в пользовательском пространстве.

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

Фьютекс состоит из двух частей: службы ядра и пользовательской библиотеки. Служба ядра предоставляет «очередь ожидания», позволяющую ожидать снятия блокировки нескольким процессам. Они не будут запущены, пока ядро не разблокирует их явным образом. Чтобы процесс попал в очередь ожидания, требуется (довольно дорого обходящийся) системный вызов, чего следует избегать. Зато при отсутствии конкуренции фьютекс работает полностью в пользовательском пространстве.

МЬЮТЕКСЫ В ПАКЕТЕ PTHREADS

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

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

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

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

МЬЮТЕКСЫ В ПАКЕТЕ PTHREADS

Основные вызовы, связанные с мьютексами:

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

УСЛОВНЫЕ ПЕРЕМЕННЫЕ В ПАКЕТЕ PTHREADS

В дополнение к мьютексам пакет Pthreads предлагает второй механизм синхронизации — условные переменные.

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

УСЛОВНЫЕ ПЕРЕМЕННЫЕ В ПАКЕТЕ PTHREADS

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

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

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