Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процессы-ресурсы - теория.doc
Скачиваний:
10
Добавлен:
20.08.2019
Размер:
894.46 Кб
Скачать

Центральный процессор

Рис.2.5. Дисциплина планирования FIFO

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

Простейшей дисциплиной, предусматривающей возможность переключения, является дисциплина планирования RR (Round Robin) - циклическое или круговое планирование. При реализации этой дисциплины процессы встают в очередь в порядке их попадания в состояние готовности, но очередному процессу из очереди процессор предоставляется в распоряжение на ограниченное время, называемое квантом. По истечении выделенного процессу кванта времени (если в течение этого промежутка времени процесс не был завершен) процессор у него забирается и передается очередному готовому процессу, оказавшемуся в очереди первым (рис.2.6).

Очередь процессов Завершение или блокирование

в состоянии готовности процесса и освобождение ЦП

Центральный процессор

Прерывание активного процесса и перераспределение процессора

Рис.2.6. Дисциплина планирования RR

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

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

Существуют дисциплины планирования, зависящие от количества запрашиваемого ресурса (времени процессора). Наиболее известными являются дисциплины SJF (“кратчайшее задание - первым”), SRT (“по наименьшему оставшемуся до завершения времени”). Фактически эти дисциплины устанавливают приоритеты процессов при распределении времени процессора: реализация этих дисциплин дает преимущество более коротким программам, требующим меньше времени для завершения. Однако при этом увеличиваются накладные расходы (требуется заранее определять лимит времени для выполнения программы и вести постоянный его учет для всех процессов, выполняющихся в системе).

Более гибкая система планирования обеспечивается использованием приоритетов при планировании.

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

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

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

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

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

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

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

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

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

Приоритет = (Время ожидания + Время обслуживания) / (Время обслуживания)

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

На основе приоритетов могут быть реализованы как дисциплины без перераспределения процессора (например, планирование по принципу HRN - “по наибольшему относительному времени реакции”, в основе которого лежит приведенная выше формула), так и дисциплины с перераспределением процессора.

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

Классический вариант планирования с использованием динамического метода и перераспределением времени процессора основан на многоуровневых очередях с обратными связями (рис.2.7).

Очереди процессов в состоянии

готовности

Уровень 1

(наивысший приоритет) Завершение процесса или

FIFO запрос функции ОС

Использование

кванта времени ЦП

Перераспределение процессора

... Уровень N

...(минимальный приоритет) Завершение процесса или

RR запрос функции ОС

Использование

кванта времени ЦП

Перераспределение процессора

Рис.2.7. Многоуровневые очереди с обратными связями

В системе существует несколько уровней очередей, соответствующих различным приоритетным классам. Каждому приоритетному уровню ставится в соответствие интервал времени, который процесс может получить, выполняясь на этом уровне приоритетов. Если процесс не успевает завершиться за указанный интервал времени, то его приоритет понижается и он перемещается в очередь более низкого приоритетного класса. Новые процессы, входящие в систему, помещаются, как правило, в конец очереди наивысшего приоритетного класса. В эту же очередь возвращаются процессы, которые переходят в состояние готовности из состояния ожидания после выполнения сделанных ими запросов к системе на услуги, например, после завершения операции ввода или вывода. “Добровольное” прерывание процесса запросом на услуги ОС повышает его приоритет в системе, так как при выполнении этих операций центральный процессор освобождается для выполнения других процессов из очереди. В очереди самого нижнего приоритетного класса обычно реализуется циклическая дисциплина обслуживания. Процессор отдается в распоряжение процесса из очереди приоритетного класса уровня N только в том случае, если в очередях приоритетных классов, соответствующих уровням от первого до (N-1)-го нет процессов готовых к выполнению. Величина кванта времени, выделяемого процессам, увеличивается с понижением их приоритета.

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

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

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

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

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

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

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

В современных ОС существует два основных метода, позволяющих реализовать переключение задач в мультизадачном режиме:

  • переключение по событию,

  • разделение времени.

В режиме переключения по событию операционная система не может сама определить момент смены текущей задачи. Этот момент может быть указан текущей активной задачей, “добровольно” приостанавливающей свое выполнение с помощью специального обращения к операционной системе. Кроме того, каждая задача прерывается в том случае, когда она обращается к ОС с каким-либо запросом, например, на выполнение операции ввода/вывода: так как задача переходит затем в состояние ожидания результата операции, операционная система может передать управление процессором другой задаче, ожидающей распределения процессора в состоянии готовности.

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

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

Режим разделения времени (квантование времени центрального процессора) основан на использовании внешних сигналов, поступающих на процессор через равные интервалы времени. Поступление этих сигналов вызывает обычно аппаратное прерывание от внешнего таймера. Когда возникает такое прерывание, ОС прекращает выполнение активной в данный момент задачи и сохраняет ее контекст (окружение). Задача переходит в состояние готовности и помещается в очередь ожидающих распределения времени центрального процессора задач. Планировщик ОС анализирует список ожидающих задач и передает управление процессором выбранной из этого списка задаче.

Этот метод позволяет каждой задаче выделить заранее определенный интервал времени для выполнения на процессоре. Таким образом, он основан на разделении времени (time-slicing).

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

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

В соответствии с использованным методом переключения задач многозадачность может быть либо кооперативной (cooperative multitasking), либо вытесняющей (preemptive multitasking).

В кооперативных системах за передачу управления другим задачам отвечает исполняющаяся в данный момент программа. Это управление может передаваться явным или косвенным образом. Для явной (explicitly) передачи управления используются специально предназначенные для этой цели программные вызовы операционной системы. Косвенная (implicitly) передача управления происходит при вызове определенных функций операционной системы, которые подразумевают переход к выполнению других задач на время осуществления операций, соответствующих этим функциям (например, при выполнении обмена с дисками).

Примерами операционных систем, в которых применяется кооперативная мультизадачность, являются Windows 3.x (однако при работе в расширенном режиме для всех DOS-приложений, запущенных в этой системе, применяется вытесняющая многозадачность) и Novell NetWare.

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

Операционные системы OS/2, Unix, Windows 95 и Windows NT используют вытесняющую многозадачность.

Планирование выделения времени центрального процессора в таких системах выполняется в соответствии с приоритетами.

В Win32 процессы при создании могут получить следующие классы приоритетов:

  • Idle (IDLE_PRIORITY_CLASS) - “простаивающий” - для процессов, занимающихся мониторингом системы, “хранителей экрана”, например, процессы с данным приоритетным классом имеют возможность получить управление только при отсутствии более приоритетных конкурентов;

  • Normal (NORMAL_PRIORITY_CLASS) - нормальный - основной для пользовательских программ;

  • High (HIGH_PRIORITY_CLASS) - высокий - используется только при абсолютной необходимости, так как, “просыпаясь”, такой процесс мгновенно активизируется, причем может вытеснить исполняемые в этот момент потоки с более низкими приоритетами (например, Task Manager в Windows NT после нажатия Ctrl-Esc);

  • Realtime (REALTIME_PRIORITY_CLASS) - реального времени - процессы с наивысшим приоритетом, “общающиеся” напрямую с оборудованием, или выполняющие очень быстротечную операцию, которую нельзя прервать.

Созданным потокам уровни приоритета присваивает сама система, выполняя эту операцию в два этапа:

  1. Процессу присваивается определенный класс приоритета.

  2. Потокам принадлежащим этому процессу, присваиваются относительные уровни приоритета.

Каждому классу приоритетов соответствует свой уровень приоритета:

Класс

Уровень

Idle

4

Normal

7-9

High

13

Realtime

24

Приложения с нормальным уровнем приоритета могут выполняться “на переднем плане” (являются более приоритетными) и могут быть фоновыми. Приоритетным является приложение, с которым работает пользователь, все остальные приложения становятся фоновыми. Как только нормальный процесс становится приоритетным, автоматически поднимается уровень приоритета всех его потоков (в Windows NT - на 2 единицы, а в Windows 95 - лишь на 1). Приоритетный процесс благодаря этому быстрее реагирует на ввод информации пользователем, его потоки всегда вытесняют потоки нормальных процессов, работающих в фоновом режиме.

В Windows NT команда START поддерживает переключатели /NORMAL, /HIGH, /REALTIME, позволяющие начать выполнение программы соответственно с нормальным (как и по умолчанию), высоким приоритетом и приоритетом реального времени соответственно.

В Windows 95 команда START не поддерживает переключатели /LOW, /NORMAL, /HIGH и /REALTIME (процессы из оболочки командного процессора запускаются всегда с нормальным приоритетом).

Во время выполнения процесса его приоритет может быть изменен с помощью функции SetPryorityClass, а функция GetPriorityClass позволяет выяснить класс приоритета процесса.

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

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

Идентификатор флага

Назначение

THREAD_PRIORITY_LOWEST

Приоритет потока должен быть на 2 единицы меньше класса приоритета процесса

THREAD_PRIORITY_BELOW_NORMAL

Приоритет потока должен быть на 1 единицу меньше класса приоритета процесса

THREAD_PRIORITY_NORMAL

Приоритет потока должен соответствовать классу приоритета процесса

THREAD_PRIORITY_ABOVE_NORMAL

Приоритет потока должен быть на 1 единицу больше класса приоритета процесса

THREAD_PRIORITY_HIGHEST

Приоритет потока должен быть на 2 единицы больше класса приоритета процесса

Кроме того, для назначение приоритета потоку могут быть использованы флаги с идентификаторами

  • THREAD_PRIORITY_IDLE - устанавливает уровень приоритета потока 1 для процессов из классов Idle, Normal, High, а для процессов класса Realtime - 16;

  • THREAD_PRIORITY_TIME_CRITICAL - устанавливает уровень приоритета потока 15 для процессов из классов Idle, Normal, High, а для процессов класса Realtime - 31.

Функцию SetThreadPriority дополняет функция GetThreadPriority, с помощью которой можно определить относительный приоритет потока.

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

ОС позволяет выполнять задержку выполнения потоков процесса на определенное время (функция Sleep), до тех пор, пока другой поток не возобновит выполнение задержанного потока (функция SuspendThread - задержка, ResumeThread - возобновление выполнения).

В операционной системе OS/2 также существуют четыре класса приоритетов:

  • Idle - “остаточный” - программы с таким приоритетом получают управление только в том случае, когда приложения с большим уровнем приоритета бездействуют (например, приостановлены на заданное время или до получения сообщения или свершения заданного события);

  • Regular - стандартный - предназначен для большинства задач в системе;

  • Server - серверный - для задач, играющих роль серверов (позволяет ускорить обслуживание клиентских программ);

  • Time Critical - критический - высший уровень приоритета в системе, предназначен для программ, которым обязательно должен быть предоставлен определенный минимум времени ЦП (например, для коммуникационным и сетевым приложениям, так как в том случае, когда такие программу не получают вовремя управление, установленный сеанс связи может прерваться).

Каждый класс приоритетов имеет 32 уровня, нумеруемые от 0 до 31. Таким образом, в ОС есть всего 128 различных уровней приоритета.

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

  • увеличение приоритета активной задачи - приоритет задачи автоматически увеличивается, когда она становится активной (это снижает время реакции активного приложения на действия пользователя по сравнению с фоновыми программами);

  • увеличение приоритета ввода/вывода - по завершении операции ввода/вывода задача получает самый высокий уровень приоритета своего класса (таким образом обеспечивается завершение всех незаконченных операций вода/вывода);

  • увеличение приоритета “забытых” задач - приоритет задачи, которая не получала управление в течение долгого времени, временно увеличивается до уровня, не превышающего критический (задачи с низким приоритетом получают шанс на выделение им времени процессора); по истечении кванта времени приоритет снова снижается до остаточного.

Программы также могут сами запрашивать и устанавливать свой приоритет.

Внутри одного приоритетного класса в этих ОС реализовано обслуживание с дисциплиной RR.

Команды файла CONFIG.SYS позволяют управлять планированием процессов:

  • PRIORITY - определяет, будет ли приоритет статическим или динамическим;

  • PRIORITY_DISK_TO - определяет, будет ли активная задача иметь преимущество перед фоновой на доступ к диску;

  • MAXWAIT - максимальное время ожидания задачей выделения времени процессора до повышения ее приоритета;

  • TIMESLICE - максимальный и минимальный размер кванта времени (величина кванта определяется системой в зависимости от текущей ее загрузки).

Процесс в Novell NetWare соответствует загружаемому модулю NetWare (NLM - NetWare Loadable Module).

ОС NetWare 3 и 4 имеют хорошо оптимизированный облегченный механизм планирования. Задачи планируются по методу кругового обслуживания без вытеснения и приоритетов. Это обеспечивает чрезвычайно эффективное планирование (что важно для серверных процессов), но ценой гибкости.

Механизм планирования Novell NetWare предполагает равенство приоритетов всех нитей, включая нити самой NetWare. Фактически в данной ОС существуют два типа нитей: обычная (приоритет 50) и опрашивающая (приоритет 3). Опрашивающие нити работают только тогда, когда нет доступных (готовых) нитей обычного класса. Время процессора на выбор задачи при этом практически не тратится, что обеспечивает более быстрое выполнение приложений, чем в других системах.

Однако в NetWare 4 в механизм планирования были внесены изменения: был разработан оптимизированный метод приоритетов NLM.

В NetWare 4 введено понятие “текущей работы”. Текущая работа - это парадигма для очень эффективного планирования высокоприоритетных задач. Текущая работа определяется как функция приложения, получающая более высокий приоритет, чем обычные нити. Этот механизм позволяет разработчику планировать функции, которые должны выполняться с более высоким приоритетом.

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

Выполнение планирования осуществляется с помощью списка текущих работ (или готовых к выполнению процедур) и пула доступных нитей (рис.2.8).

WorkToDoList

Задание 2 Задание 3 Задание 4 ...

Центральный процессор

Задание 1

Рис.2.8. Планирование текущих работ в NetWare 4

Разработчик приложения может запросить включение функции приложения в список текущих работ с помощью вызова ScheduleWorkToDo(). Вызов поместит переданную в качестве параметра функцию приложения в список текущих работ.

ОС перед планированием обычных нитей будет выполнять доступные элементы текущих работ из этого списка (системный администратор может задать ограничение на число последовательно выполняемых рабочих элементов).

Планировщик NetWare 4 имеет следующую схему приоритетов с 6 очередями, приоритет которых изменяется от высшего к низшему:

  • прерывания,

  • работа,

  • нити,

  • временно приостановленные нити,

  • перманентно приостановленные нити,

  • нити с низшим приоритетом.

Прерывания имеют наивысший приоритет при планировании.

Следующий по старшинству приоритет имеют рабочие нити. Они будут выполняться, как только обнаруживается соответствующее задание (при первой же возможности).

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

В NetWare существует ограничение на число последовательно планируемых элементов задания: после выполнения заданного числа (не более) элементов задания (работ) управление будет передаваться очереди готовых к выполнению задач (иначе они могли бы не получить управление никогда).

Нити - обычные единицы выполнения и запускаются командами BeginThread() и BeginThreadFroup().

Нити могут временно и перманентно приостанавливаться.

Временно приостановленные нити - удобный инструмент, позволяющий разработчику управлять выполнением, используя приостановку вместо проверки условий ожидания в состоянии занятости. Ожидание в состоянии занятости определяется как использование ресурса ЦП (времени процессора) при ожидании возникновения некоторого условия. Например, следующее условие ожидания в состоянии занятости

while ( ! IsCompleted )

{

// приостановка выполнения ...

}

показывает цикл нити в ожидании выполнения некоторого условия (выполнение продолжится, когда isCompleted = TRUE).

Так как вытеснение в NetWare не используется, это приведет к монополизации времени процессора до выполнения заданного условия и не позволит выполняться другим нитям.

Организовать ожидание можно, освободив процессор для выполнения других нитей, с помощью следующих средств:

  • явного вызова ThreadSwitch();

  • вызова функции delay();

  • ожидания на семафоре;

  • временной приостановки нити - наиболее эффективный механизм, реализуемый через вызов функции ThreadSwitchWithDelay().

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

Низкоприоритетные нити позволяют программисту задать нити, выполняемые только тогда, когда никакие другие нити в системе не работают. Это указание можно дать с помощью вызова функции ThreadSwitchLowPriority().

Многопотоковая архитектура предполагает реализацию всех функций по управлению потоками (манипуляцию множеством потоков и планирование их выполнения). В соответствии с подходами, принятыми в ОС, планировщик многопотоковой системы (например, СУБД) может быть выполнен как вытесняющий или невытесняющий.

В невытесняющей схеме поток продолжает выполняться до тех пор, пока сам не просигнализирует планировщику о завершении какого-либо этапа работы, после чего планировщик может назначить на выполнение другой поток. Обычно такие планировщики используют кольцевой алгоритм RR постановки потоков в очередь на запуск. Выполняемый поток определяет момент своей остановки по истечении какого-либо кванта времени, после выполнения критической секции своего кода или при выполнении блокирующего его запроса (например, операции ввода/вывода). Этот механизм удобен для систем, в кторых число потоков ограничено и их поведение хорошо предсказуемо.

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

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

Самый большой недостаток таких систем состоит в том, что плохо написанные программы могут полностью захватить ресурсы процессора и остановить другие, возможно, более важные приложения (например, для поддержания связи с удаленной системой коммуникационные программы должны регулярно получать управление процессором, но в кооперативной системе другие приложения могут так занять процессор для вычислений, что коммуникационные программы не смогут получить столько времени процессора для работы, сколько им необходимо).

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