
- •Кафедра "Вычислительная техника" системное программное обеспечение
- •Монитор процессов и потоков
- •1.1 Получение списка процессов, выполняющихся в системе
- •1.1.1 Использование функций CreateToolHelp32Snapshot () и Process32xxxx() для получения списка имен процессов
- •Значения флагов функции CreateToolhelp32Snapshot
- •1.1.2 Использование функций CreateToolhelp32Snapshot () и Thread32xxxx() для получения сведений о приоритетах потоков процессов
- •1.1.3 Использование функций CreateToolHelp32Snapshot () и Module32xxxx() для получения списка модулей
- •1.2. Завершение выбранного процесса
- •Некоторые значения первого параметра функции OpenProcess()
- •1.3. Получение дополнительной информации о процессах и потоках
- •1.3.4 Оценка загрузки процессора процессом с использованием счетчиков производительности
- •2. Методика выполнения
- •2.3. Выполнить индивидуальное задание 1 согласно таблице 3.
- •2.4. Выполнить индивидуальное задание 2 согласно таблице 4.
- •Варианты индивидуального задания 1 для бригад
- •Варианты индивидуального задания 2 для бригад
- •Контрольные вопросы
- •Лабораторная работа № 2
- •1. Краткие теоретические сведения
- •1.3 Методика исследования алгоритма диспетчеризации потоков
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •Лабораторная работа № 3
- •1. Краткие теоретические сведения
- •1.4 События
- •2. Методика выполнения
- •Индивидуальные задания для бригад
- •Отчет о работе
- •4. Контрольные вопросы
- •Лабораторная работа № 4
- •1 Краткие теоретические сведения
- •1.1 Механизмы управления виртуальной памятью
- •1.2 Функции и структуры данных, используемые для управления виртуальной памятью
- •Назначение полей этой структуры memorystatus
- •VirtualAlloc (null, 100*1024, mem_reserve | mem_commit, page_readwrite);
- •1.3 Кучи
- •1. Краткие теоретические сведения
- •2. Выполнение работы
- •3. Отчет о работе
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •Динамически загружаемые библиотеки (dll)
- •1. Краткие теоретические сведения dll и их роль в Win32
- •Создание проекта dll
- •Пример написания dll файла
- •Вызов функций из dll
- •Подключение dll файла в Visual Studio
- •Экспортирование
- •Загрузка dll
- •2. Методика выполнения
- •3. Отчет о работе
- •Контрольные вопросы
- •1. Краткие теоретические сведения
- •2. Методика выполнения
- •Контрольные вопросы:
- •Драйверы режима ядра
- •1. Краткие теоретические сведения
- •1.1 Структура драйвера
- •1.2 Инсталляция драйвера
- •1.3 Тестирование драйвера
- •2. Методика выполнения
- •3. Отчет о работе
- •4. Контрольные вопросы
- •443100, Г. Самара, ул. Молодогвардейская, 244. Главный корпус
Лабораторная работа № 3
СРЕДСТВА СИНХРОНИЗАЦИИ ПОТОКОВ
Цель работы - практическое знакомство с методами синхронизации двух потоков одного процесса с помощью критических секций и объектов ядра ОС MS Windows - мьютексов, семафоров и событий, тупиками и их распознаванием средствами ОС Windows.
1. Краткие теоретические сведения
В многопоточной многозадачной ОС при одновременной модификации неразделяемого ресурса (например, глобальной переменной) двумя и более потоками возможна потеря выполненных изменений. Для правильной работы многопоточных приложений необходимо обеспечить поочередный доступ потоков к участкам кода, выполняющим изменение и запись значений переменной в память (критическим участкам).
Только один процесс должен иметь возможность обращаться к общему неразделяемому ресурсу с целью его модификации, например, изменять значения глобальных переменных.
Участок программного кода, в котором поток обращается к общему неразделяемому ресурсу с целью его модификации, называется критическим участком.
Правильная работы программы, содержащей критические участки, возможна только при поочередном выполнении потоками программы критических участков.
Для решения этой задачи могут использоваться простые средства – критические секции, обеспечивающие поочередный доступ к критиче-ским участкам потоков одного процесса, и более сложные средства –объекты ядра ОС – Mutex (mutually exclusive – взаимно - исключающий) - мьютексы, решающие такую же задачу для потоков, созданных различными процессами. Кроме того, задача обеспечения поочередного доступа потоков к критическим участкам может быть решена с помощью универсальных средств синхронизации - семафоров и событий.
В рассмотренном ниже приложении два потока увеличивают значение глобальной переменной Global от начального значения 100 на 1 при каждом выполнении цикла. Число повторений цикла каждого потока равно 12, результаты увеличения переменной Global выводятся на экран.
При правильной работе приложения конечным значением переменной должно быть число 100+12+12=124. Однако без использования средств синхронизации такого значения получить в общем случае не удается, так как потоки могут перезаписывать значения переменной Global.
Критические секции
Критические секции – средство синхронизации потоков одного приложения. Критические секции обеспечивают поочередный доступ потоков к критическим участкам программы. Для использования критической секции ее необходимо создать, то есть объявить глобальную переменную CSect:
CRITICAL_SECTION CSect
и инициализировать ее с помощью вызова функции
void InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection);
Для обеспечения поочередного доступа потоков к критическому участку в начале критического участка вызывается функция
void WINAPI EnterCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection);
а в конце – функция
void WINAPI LeaveCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection);
После окончания использования критической секции она должна быть уничтожена вызовом функции
void WINAPI DeleteCriticalSection (__inout LPCRITICAL_SECTION lpCriticalSection);
Мьютексы
Мьютекс – объект ядра, используемый как средство синхронизации доступа потоков одного или нескольких приложений к критическому участку. Мьютекс создается с помощью функции
HANDLE WINAPI CreateMutex(
__in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,// обычно NULL
__in BOOL bInitialOwner, // обычно FALSE
__in_opt LPCTSTR lpName);
Перед входом в критический участок поток должен проверить возможность входа с помощью вызова функции
DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle,
__in DWORD dwMilliseconds);
а в конце участка – сообщить ОС о завершении выполнения критического участка с помощью функции
BOOL ReleaseMutex( HANDLE hMutex);
Удаление объекта ядра Mutex выполняет функция
BOOL WINAPI CloseHandle(__in HANDLE hObject);
Семафоры
Семафор – объект ядра, используемый как универсальное средство управления ресурсами. Как правило, семафор используется для учета неразделяемых ресурсов. В данной работе семафор должен использоваться для синхронизации двух конкурирующих потоков одного приложения, поэтому создается безымянный объект.
Семафор создается с помощью функции
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // обычно равен NULL
LONG lInitialCount, // начальное значение счетчика свободных ресурсов
LONG lMaximumCount, // максимальное количество свободных ресурсов
LPCTSTR lpName // имя семафора - обычно NULL);
В начале критического участка вызывается функция
DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle,
__in DWORD dwMilliseconds);
а в конце – функция BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount);
Удаление объекта ядра Semsphore выполняет функция
BOOL WINAPI CloseHandle(__in HANDLE hObject);