Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

Контрольные вопросы

  1. Как получить информацию о всех загруженных процессах?

  2. Как получить карту памяти любого процесса?

  3. Как получить список потоков выбранного процесса?

  4. Как получить список всех блоков выбранной кучи?

  5. Как получить список модулей, принадлежащих конкретному процессу?

  6. Как получить список всех модулей системы?

7. Лабораторная работа № 7

ОБЪЕКТЫ СИНХРОНИЗАЦИИ

7.1. Цель работы

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

  • Синхронизация потоков с помощью объектов пользовательского режима (критические секции);

  • Синхронизация потоков с помощью объектов ядра (объекты Mutex, события, семафоры, процессы и потоки);

  • Работа Wait- функций в различных режимах.

7.2. Теоретическое введение

7.2.1. Критические секции

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

При работе с критическими секциями выполняются следующие действия:

      1. Создается экземпляр структуры CRITICAL_SECTION. Например: VAR cs:TRTLCriticalSection;

      2. Инициализируется критическая секция. Сделать это надо до обращения какого-либо потока к защищенному ресурсу. Критическая секция инициализируется вызовом процедуры InitializeCriticalSection:

procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection - адрес структуры CRITICAL_SECTION.

      1. При обращении к разделяемому ресурсу, вызывается процедура EnterCriticaSecton:

procedure EnterCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.

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

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

procedure LeaveCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.

      1. Если структура CRITICAL_SECTION больше не понадобится ни одному потоку, ее следует удалить, вызвав процедуру DeleteCriticalSection:

procedure DeleteCriticalSection(var lpCriticalSection: TRTLCriticalSection);

где lpCriticalSection – адрес структуры CRITICAL_SECTION.