Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 2 ТВП.doc
Скачиваний:
26
Добавлен:
19.11.2019
Размер:
131.58 Кб
Скачать

1.2. Объект Критическая секция (Critical section)

Критическая секция (Critical section) – это участок кода, в котором поток (thread) получает доступ к ресурсу (например, переменной), который доступен из других потоков. Этим объектом может владеть только один поток, что и обеспечивает синхронизацию.

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

П р и м е ч а н и е. Используя механизм синхронизации, надо помнить о том, что физически данные не защищены: никто не помешает потоку обратиться к разделяемым данным. Синхронизация – это подсказка, как должен себя вести объект при доступе к данным.

1.3. Объект Мьютекс (Mutex) и синхронизация с помощью монитора

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

При их использовании нет возможности:

– установить время блокирования;

– присвоить имя критической секции для того, чтобы два разных процесса могли ее использовать.

Оба эти недостатка можно устранить, если использовать такой объект ядра, как Mutex. Этот объект применяется, например, для синхронизации доступа к файлам.

Общая идея взаимоисключения похожа на критические секции. Только Mutex позволяет проводить синхронизацию не только между потоками (thread), но и процессами (process), то есть между приложениями.

Термин «mutex» происходит от mutually exclusive (взаимно исключающий), так как этот объект обеспечивает исключительный (exclusive) доступ к охраняемому блоку кодов.

Данный объект синхронизации регистрирует доступ к ресурсам и может находиться в двух состояниях:

– установлен;

– сброшен.

Mutex – установлен в тот момент, когда ресурс свободен.

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

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

Монитор состоит из:

  • набора процедур, взаимодействующих с общим ресурсом

  • мьютекса

  • переменных, связанных с этим ресурсом

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

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

Чтобы избегать состояния активного ожидания, процессы должны сигнализировать друг другу об ожидаемых событиях. Мониторы обеспечивают эту возможность с помощью условных переменных. Когда процедура монитора требует для дальнейшей работы выполнения определённого условия, она ждёт связанную с ним условную переменную. Во время ожидания она временно отпускает мьютекс и выбывает из списка исполняющихся процессов. Любой процесс, который в дальнейшем приводит к выполнению этого условия, использует условную переменную для оповещения ждущего её процесса. Оповещённый процесс захватывает мьютекс обратно и может продолжать. Поскольку ожидание условия отпускает блокировку, ожидающий процесс должен гарантировать соблюдение инварианта перед тем, как начать ожидание.