
- •Часть 2.
- •Часть 2. Операционная система ms windows
- •1.Мультизадачность. Управление задачами
- •2.Синхронизация задач и процессов
- •2.1. Ожидание завершения задачи или процесса
- •2.2. Синхронизация задач с помощью событий
- •2.3. Последовательный доступ к ресурсам
- •2.4. Блокирующие функции
- •2.5. Синхронизация с использованием семафоров
- •Литература
№ l670
68l
0-609
ОПЕРАЦИОННЫЕ
СИСТЕМЫ
Часть 2.
Операционная система MS WINDOWS
Методические указания
НОВОСИБИРСК
l998
Министерство общего и профессионального образования
Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
68l №1670
0-609
ОПЕРАЦИОННЫЕ СИСТЕМЫ
Часть 2. Операционная система ms windows
Методические указания
к лабораторным работам и контрольным заданиям
для студентов II и III курсов АВТ
(специальность 2202) дневного и заочного отделения
НОВОСИБИРСК
1998
681.3.066 (076.5)
Составили: канд. техн. наук, доц. В.Г. Качальский
ст. преп. Е.Н. Павенко
Рецензент канд. техн. наук, доц. В.А. Астапчук
Работа подготовлена кафедрой
автоматизированных систем управления
© Новосибирский государственный
технический университет, 1998г.
1.Мультизадачность. Управление задачами
В ОС 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 0 -l -2
Устанавливается абсолютный уровень приоритета l или l6
|
Для определения приоритета текущей задачи можно воспользоваться функцией CetThreadPriority:
int GetThreadPriority();
Функция возвращает одно из значений относительного приоритета задачи в соответствии с приведенной выше таблицей.