Мультизадачность. управление задачами

L

0-609

ОПЕРАЦИОННЫЕ

СИСТЕМЫ

Часть 2.

Операционная система MS WINDOWS

Методические указания

НОВОСИБИРСК

l998

Министерство общего и профессионального образования

Российской Федерации

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

68l №1670

0-609

ОПЕРАЦИОННЫЕ СИСТЕМЫ

Часть 2. ОПЕРАЦИОННАЯ СИСТЕМА MS WINDOWS

Методические указания

к лабораторным работам и контрольным заданиям

для студентов II и III курсов АВТ

(специальность 2202) дневного и заочного отделения

НОВОСИБИРСК

681.3.066 (076.5)

Составили: канд. техн. наук, доц. В.Г. Качальский

ст. преп. Е.Н. Павенко

Рецензент канд. техн. наук, доц. В.А. Астапчук

Работа подготовлена кафедрой

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

© Новосибирский государственный

технический университет, 1998г.

СИНХРОНИЗАЦИЯ ЗАДАЧ И ПРОЦЕССОВ

Синхронизация задач заключается в том, что некоторые задачи должны приостанавливать свое выполнение до тех пор, пока не произойдут те или иные события, связанные с другими задачами. В программном интерфейсе ОС Windows предусмотрены различные средства синхронизации задач, как выполняющихся в рамках одного процесса, так и принадлежащих разным процессам. Это события, критические секции, блокирующие функции, объек­ты Mutex и семафоры.

Блокирующие функции

Если несколько задач выполняют изменение одной и той же глобальной переменной, их необходимо синхронизировать, чтобы одновременно к этой переменной обращалась только одна задача. В программном интерфейсе Mi­crosoft Windows предусмотрено несколько функций, которые могут оказаться полезными в данной ситуации.

Функции InterlockedIncrement и InterlockedDecrement выполняют соот­ветственно увеличение и уменьшение на l значения переменной типа LONG, адрес которой передается им в качестве единственного параметра.

LONG InterlockedIncrement(LPLONG lpAddent);

LONG InterlockedDecrement(LPLONG lpAddent);

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

Для записи в некоторую глобальную переменную нового значения ис­пользуется функция InterlockedExchange:

LONG InterlockedExchange(

LPLONG lpTarget, // адрес изменяемой переменной

LONG INewValue); //новое значение для переменной

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

Все рассмотренные функции возвращают старое значение изменяемой переменной.

Литература

1. Фролов А.В., Фролов Г.В. Программирование для WINDOWS NT. Биб­лиотека системного программиста; Т. 26.- М.: ДИАЛОГ-МИФИ, 1996.

2. Фролов А.В., Фролов Г.В. Программирование для WINDOWS NT. Биб­лиотека системного программиста; Т. 27.- М.: ДИАЛОГ-МИФИ, 1996.

3. Кастер Х. Основы WINDOWS NT и NTFS. - M:Microsoft Press, 1996.

4. Дженнингс P. Windows 95 в подлиннике. Спб.: BHV - Санкт-Петер­бург, 1995.

L

0-609

ОПЕРАЦИОННЫЕ

СИСТЕМЫ

Часть 2.

Операционная система MS WINDOWS

Методические указания

НОВОСИБИРСК

l998

Министерство общего и профессионального образования

Российской Федерации

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

68l №1670

0-609

ОПЕРАЦИОННЫЕ СИСТЕМЫ

Часть 2. ОПЕРАЦИОННАЯ СИСТЕМА MS WINDOWS

Методические указания

к лабораторным работам и контрольным заданиям

для студентов II и III курсов АВТ

(специальность 2202) дневного и заочного отделения

НОВОСИБИРСК

681.3.066 (076.5)

Составили: канд. техн. наук, доц. В.Г. Качальский

ст. преп. Е.Н. Павенко

Рецензент канд. техн. наук, доц. В.А. Астапчук

Работа подготовлена кафедрой

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

© Новосибирский государственный

технический университет, 1998г.

МУЛЬТИЗАДАЧНОСТЬ. УПРАВЛЕНИЕ ЗАДАЧАМИ

В ОС Windows существует два понятия, имеющих отношение к муль­тизадачности. Это процессы и задачи.

Процесс (process) создается, когда программа загружается для выполнения. Процессу выделяется в монопольное владение 2 Гбайта изолированного адресного пространства.

Сразу после запуска процесса создается одна задача (thread). Задача - это фрагмент кода приложения, который может выполняться автономно и независимо от других задач в рамках одного процесса. При необходимости задача может запустить другие задачи, реализуя мультизадачность в рамках одного процесса.

В ОС Windows могут работать несколько процессов, в рамках каждого процесса могут параллельно работать несколько задач.

Кванты времени выделяются не процессам, а запущенным ими задачам. При этом задачи выполняются по очереди, создавая иллюзию параллельного выполнения.

В ОС Windows используется приоритетное планирование задач, когда процессы и задачи имеют свои уровни приоритета. ОС устанавливает уровень приоритета задач в диапазоне от 1 до 3l, причем 3l соответствует макси­мальному приоритету. В процессе планирования кванты времени выделяются задачам с максимальным приоритетом. Менее приоритетные задачи получают управление только в том случае, если более приоритетные задачи переходят в состояние ожидания.

Приложения не могут устанавливать конкретное значение приоритета задач из указанного интервала значений. Вместо этого используется двухсту­пенчатая система установки приоритетов для процессов и задач. При запуске процесса с помощью функции CreateProcess, ему можно назначить один из 4 классов приоритета:

Класс приоритета Уровень приоритета  
REAL_TIME*_PRYORITY CLASS HIGH_PRIORITY_CLASS NORMAL_PRIORITY_CLASS IDLE_PRIORITY CLASS 24 - процессы реального времени   13 - высокоприоритетные процессы   9 или 7 – обычные процессы   4 - низкоприоритетные процессы  

Запуск задач в приложениях, составленных на языке С вы при помощи функции CreateThread. Функция CreateThread создает исполняемую задачу в адресном пространстве выполняемого процесса:

HANDLE CreateThread(

LPSECURITY_АTTRIBUTES lpThreadAttributes, // Указатель на структуру,

содержащую атрибуты защиты

DWORD dwStackSize, // Размер стека, запускаемой

задачи

LPTHREAD_START_ROUTINE lpStartAddress, // Указатель на функцию

LPVOID IpParameter, // Аргументы новой задачи

DWORD dwCreationFIags, // Флаг создания

LPDWORD lpThreadId // Указатель на системный

); идентификатор задачи

Параметры:

lpThreadAttributes

Указатель на структуру типа SECURITY_ATTRIBUTES, которая определяет, может ли полученный идентификатор задачи наследоваться дочерними поотношению к ней процессами. Если lpThreadAttributes равно NULL идентификатор задачи не наследуется.

dwStackSize

Определяет размер стека запускаемой задачи в байтах. Если значение

равно 0, размер стека равен размеру стека главной задачи процесса.

LpStartAddress

Содержит адрес функции, которая будет выполняться как отдельная за­дача. Прототип этой функции имеет вид: DWORD WINAPI ThreadFunc (LPVOID);

LpParameter

Функция задачи может иметь, один 32-разрядный параметр, который передается через lpParameter.

dwCreationFIags

Если значение параметра равно 0, после вызова функции CreateThread задача немедленно начнет свое выполнение, если в этом параметре указать флаг CREATE_SUSPENDED, задача будет загружена, но приостановлена. Во­зобновить выполнение приостановленной задачи можно будет позже с помощью функции ResumeThread.

LpThreadId

Адрес переменной, в которую будет записан 32-разрядный системный идентификатор задачи.

В случае успешного выполнения функция возвращает идентификатор созданной задачи. В случае ошибки возврата NULL. Для получения дополнительной информации о причине возникшей ошибки необходимо обратиться к функции GetLastError.

Относительный приоритет задач, который может быть несколько выше или ниже приоритета процесса можно установить с помощью функции SetThreadPriority:

BOOL SetThreadPriority(

HANDLE hThread, // идентификатор задачи

int nPriority // уровень приоритета задачи

);

Этой функции в качестве параметра nPriority можно передать одно из следующих значений, устанавливающих новый приоритет задач относительно приоритета процесса:

Значение   THREAD_PRIORlTY_TIME_CRlTICAL   THREAD_ PRIORITY_ HIGHEST THREAD_PRIORITY_ ABOVE _NORMAL THREAD_PRIORITY_NORMAL THREAD_PRIORITY__BELLOW_NORMAL THREAD_ PRIORITY _LOWEST   THREAD_PRIORTTY_IDLE   Относительное изменение уровня приоритета Устанавливается абсолютный уровень приоритета l5 или 3l +2 +l -l -2   Устанавливается абсолютный уровень приоритета l или l6  

Для определения приоритета текущей задачи можно воспользоваться функцией CetThreadPriority:

int GetThreadPriority();

Функция возвращает одно из значений относительного приоритета задачи в соответствии с приведенной выше таблицей.


Наши рекомендации