Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Мьютексы



Метода Сергеева:

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

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

Межпроцессорное взаимодействие с применением семафоров выглядит весьма просто, но это кажущаяся простота. Изменим порядок следования двух процедур down в листинге 4 программы производителя. В результате значение mutex уменьшится раньше, чем empty. Если буфер был заполнен, производитель блокируется, установив mutex на ноль. Соответственно, в следующий раз, когда потребитель обратиться к буферу, он выполнит down с переменной, равной нулю, и тоже заблокируется. Вышеизложенная ситуация показывает, с какой аккуратностью нужно обращаться с семафорами. Чтобы упростить написание программ, в 1974 году Хоар и Бринч Хансен предложили примитив синхронизации более высокого уровня, который называется монитором.

Листинг 4. Проблема производителя и потребителя с семафорами

#define N 100 /*Количество сегментов в буфере*/

typedef int semaphore; /*Семафоры --- особый вид целочисленных переменных*/

semaphore mutex = 1; /*Контроль доступа в критическую область*/

semaphore empty = N; /*Число пустых сегментов буфера*/

semaphore full = 0; /*Число полных сегментов буфера*/

void procedur (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). Мьютексы способны лишь обеспечивать взаимное исключение для общего ресурса или фрагмента кода. Их реализация отличается простотой и эффективностью, что делает мьютексы исключительно полезными в программных потоках, реализуемых исключительно в пространстве пользователя.

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

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





Дата публикования: 2015-01-26; Прочитано: 674 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...