Уровни рассмотрения ос
Вид материала | Документы |
СодержаниеКритическая секция Определение семафора Применение семафоров |
- Принципы и задачи проектирования 1 Уровни, аспекты и этапы проектирования, 399.58kb.
- П. Н. Бургасов 03. 08. 1984 №3077-84, 145.77kb.
- Эмпирический и теоретический уровни научного исследования, 506.56kb.
- Вопрос №1 Уровни проектирования, 260.53kb.
- Протокол рассмотрения и оценки котировочных заявок №70, 750.97kb.
- Обобщение практики рассмотрения гражданских дел, 1145.14kb.
- Общая биология уровни организации и основные признаки живого вещества уровни организации, 447.5kb.
- Перечень вопросов для курсового экзамена по биологии уровни организации живого. Человек, 96.87kb.
- Правила идентификации Клиентов 16 Правила предотвращения легализации средств, полученных, 1242.53kb.
- Е. В. Ласый анализ распространённости суицидов в Республике Беларусь Белорусская медицинская, 128.72kb.
Ссылки
Критическая секция (англ. critical section) — объект синхронизации потоков позволяющий предотвратить одновременное выполнение некоторого набора операций (обычно связанных с доступом к данным) несколькими потоками. Критическая секция выполняет те же задачи, что и мьютекс.
Между мьютексом и критической секцией есть терминологические различия, так процедура аналогичная захвату мьютекса называется входом в критическую секцию (enter), снятия блокировки мьютекса -выходом из критической секции (leave).
Процедура входа и выхода критических секций обычно занимает меньшее время, нежели аналогичные операции мьютекса.
В операционных системах класса Microsoft Windows разница между мьютексом и критической секцией в том, что мьютекс является объектом ядра и может быть использован несколькими процессами одновременно, критическая секция же принадлежит процессу и служит для синхронизации только его потоков.
Мью́текс (англ. mutex, от mutual exclusion — взаимное исключение) — одноместный семафор, служащий в программировании для синхронизации одновременно выполняющихся потоков.
Мьютексы (mutex)это один из вариантов семафорных механизмов для организации взаимного исключения. Они реализованы во многих ОС, их основное назначение – организация взаимного исключения для потоков из одного и того же или из разных процессов.
Мьютексы – это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний – отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.
Организация последовательного доступа к ресурсам с использованием мьютексов становится несложной, поскольку в каждый конкретный момент только один поток может владеть этим объектом. Для того, чтобы объект mutex стал доступен потокам, принадлежащим разным процессам, при создании ему необходимо присвоить имя. Потом это имя нужно передать «по наследству» задачам, которые должны его использовать для взаимодействия. Для этого вводятся специальные системные вызовы (CreateMutex), в которых указывается начальное значение мьютекса и его имя.
Для работы с мьютексом имеется несколько функций. Помимо уже упомянутой функции создания такого объекта (CreateMutex), есть функции открытия (OpenMutex) и функция освобождения этого объекта (ReleaseMutex). Конкретные обращения к этим функциям и перечни передаваемых и получаемых параметров нужно смотреть в документации на соответствующую ОС.
Единственная задача мьютекса — защита объекта от доступа к нему других потоков отличных от того, который завладел мьютексом). Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток просто засыпает до тех пор, пока мьютекс не будет освобождён.
Цель использования мьютексов — защита данных от повреждения; однако им порождаются другие проблемы, такие как взаимная блокировка (клинч) и «соревнование за ресурс».
Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам. Определение введено Э. Дейкстрой.
Определение семафора
Семафор — это объект, с которым можно выполнить три операции.
init(n):
счётчик := n
enter():
ждать пока счётчик не примет значение больше 0; после этого уменьшить счётчик на единицу.
leave():
увеличить счётчик на единицу.
Предположим, что есть такой участок кода:
semaphore.init(5);
.....
.....
semaphore.enter();
DoSomething();
semaphore.leave();
Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething().
В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие освобождения семафора, будут проходить через семафор именно в том порядке, в котором они вызывали enter().
Применение семафоров
Вот некоторые из проблем, которые могут решать семафоры.
- запрет одновременного выполнения заданных участков кода;
- поочерёдный доступ к критическому ресурсу (важному ресурсу, для которого невозможен одновременный доступ).
Следующий пример показывает, как наладить поочерёдный доступ к консоли.
semaphore.init(1);
Поток 1:
semaphore.enter();
cout << "Состояние массива: ";
for (int i=0; i
cout << a[i] << ' ';
cout << '\n';
semaphore.leave();
Поток 2:
semaphore.enter();
cout << "Нажато Esc.\n";
semaphore.leave();
Этот код поможет предотвратить появление листинга наподобие
Состояние массива: 1 2 3 Нажато Esc.
4 5 6
(см. также Состояние гонки)