Файл: А. В. Гордеев А. Ю. Молчанов системное программное обеспечение электронный вариант книги издательства Питер СанктПетербург Челябинск юургу каф. Автоматика и управление 2002 2 Предисловие Настоящий учебник.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 1004
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Рис. 1.7. Структура привилегированного программного модуля
Рис. 1.8. Реентерабельный программный модуль
Отключение прерываний
Собственно тело программного модуля
Включение прерываний
Привилегированный модуль, заказывающий в системной области памяти блок ячеек для хранения текущих
(промежуточных)
данных
Основное тело реентерабельного программного модуля, которое и может быть прервано.
Работает в непривилегированном режиме
Привилегированный модуль,
освобождающий в системной области памяти блок памяти,
использованный для хранения промежуточных данных
Системная область,
используемая динамическим образом для буферированного ввода/вывода и реентерабельной обработки
Блок ячеек памяти для текущих переменных
Вершина стека
Стек
47
Основная идея построения и работы реентерабельного программного модуля,
структура которого представлена на рис. 1.8, заключается в том, что в первой (го- ловной) своей части с помощью обращения из системной привилегированной сек- ции осуществляется запрос на получение в системной области памяти блока ячеек,
необходимого для размещения всех текущих (промежуточных) данных. При этом на вершину стека помещается указатель на начало области данных и её объём. Все текущие переменные реентерабельного программного модуля в этом случае распо- лагаются в системной области памяти. Поскольку в конце привилегированной сек- ции система прерываний включается, то во время работы центральной (основной)
части реентерабельного модуля возможно её прерывание. Если прерывание не воз- никает, то в третьей (заключительной) секции осуществляется запрос на освобож- дение использованного блока системной области памяти. Если же во время работы центральной секции возникает прерывание и другой вычислительный процесс об- ращается к тому же самому реентерабельному программному модулю, то для этого нового процесса вновь заказывается новый блок памяти в системной области памя- ти и на вершину стека записывается новый указатель. Очевидно, что возможно многократное повторное вхождение в реентерабельный программный модуль до тех пор, пока в области системной памяти, выделяемой специально для реентера- бельной обработки, есть свободные ячейки, число которых достаточно для выделе- ния нового блока.
Что касается статического способа выделения памяти, то здесь речь может ид- ти, например, о том, что заранее для фиксированного числа вычислительных про- цессов резервируются области памяти, в которых будут располагаться переменные реентерабельных программных модулей: для каждого процесса – своя область па- мяти. Чаще всего в качестве таких процессов выступают процессы ввода/вывода и речь идёт о реентерабельных драйверах (реентерабельный драйвер может управ- лять параллельно несколькими однотипными устройствами. См. более подробно в главе 4 «Управление вводом/выводом и файловые системы»).
Кроме реентерабельных программных модулей существуют ещё повторно
входимые (от re-entrance). Этим термином называют программные модули, которые
48
тоже допускают свое многократное параллельное использование, но в отличие от реентерабельных их нельзя прерывать. Повторно входимые программные модули состоят из привилегированных секций и повторное обращение к ним возможно только после завершения какой-нибудь из таких секций. После выполнения оче- редной привилегированной секции управление может быть передано супервизору,
и если он предоставит возможность выполняться другому процессу, то возможно повторное вхождение в рассматриваемый программный модуль. Другими словами,
в повторно входимых программных модулях четко предопределены все допусти- мые (возможные) точки входа. Следует отметить, что повторно входимые про- граммные модули встречаются гораздо чаще реентерабельных (повторно преры- ваемых).
Наконец, имеются и информационные ресурсы, то есть в качестве ресурсов могут выступать данные.
Информационные ресурсы могут существовать как в виде переменных, нахо- дящихся в оперативной памяти, так и в виде файлов. Если процессы используют данные только для чтения, то такие информационные ресурсы можно разделять.
Если же процессы могут изменять информационные ресурсы, то необходимо спе- циальным образом организовывать работу с такими данными. Это одна из наибо- лее сложных проблем, достаточно подробно она обсуждается в главе 6.
Классификация операционных систем
Широко известно высказывание, согласно которому любая наука начинается с классификации. Само собой, что вариантов классификации может быть очень мно- го, все будет зависеть от выбранного признака, по которому один объект мы будем отличать от другого. Однако, что касается ОС, здесь уже давно сформировалось относительно небольшое количество классификаций: по назначению, по режиму обработки задач, по способу взаимодействия с системой и, наконец, по способам построения (архитектурным особенностям систем).
Во введении мы уже дали «определение» операционной системы (ОС). Поэто- му просто повторим, что основным предназначением ОС является организация эф-
49
фективных и надёжных вычислений, создание различных интерфейсов для взаи- модействия с этими вычислениями и с самой вычислительной системой.
Прежде всего, различают ОС общего и специального назначения. ОС специаль- ного назначения, в свою очередь, подразделяются на следующие: для переносимых микрокомпьютеров и различных встроенных систем, организации и ведения баз данных, решения задач реального времени и т. п.
По режиму обработки задач различают ОС, обеспечивающие однопрограмм- ный и мультипрограммный режимы. Под мультипрограммированием понимается способ организации вычислений, когда на однопроцессорной вычислительной сис- теме создается видимость одновременного выполнения нескольких программ. Лю- бая задержка в решении программы (например, для осуществления операций вво- да/вывода данных) используется для выполнения других (таких же, либо менее важных) программ. Иногда при этом говорят о мультизадачном режиме. При этом,
вообще говоря, мультипрограммный и мультизадачный режимы – это не синони- мы, хотя и близкие понятия. Основное принципиальное отличие в этих терминах заключается в том, что мультипрограммный режим обеспечивает параллельное выполнение нескольких приложений и при этом программисты, создающие эти программы, не должны заботиться о механизмах организации их параллельной ра- боты. Эти функции берет на себя сама ОС; именно она распределяет между выпол- няющимися приложениями ресурсы вычислительной системы, осуществляет необ- ходимую синхронизацию вычислений и взаимодействие. Мультизадачный режим,
наоборот, предполагает, что забота о параллельном выполнении и взаимодействии приложений ложится как раз на прикладных программистов. В современной тех- нической и, тем более, научно-популярной литературе об этом различии часто за- бывают, тем самым внося некоторую путаницу. Можно, однако, заметить, что со- временные ОС для ПК реализуют и мультипрограммный, и мультизадачный режи- мы.
При организации работы с вычислительной системой в диалоговом режиме можно говорить об однопользовательских (однотерминальных) и мультитерми- нальных ОС. В мультитерминальных ОС с одной вычислительной системой одно-
50
временно могут работать несколько пользователей, каждый со своего терминала.
При этом у пользователей возникает иллюзия, что у каждого из них имеется своя собственная вычислительная система. Очевидно, что для организации мультитер- минального доступа к вычислительной системе необходимо обеспечить муль- типрограммный режим работы. В качестве одного из примеров мультитерминаль- ных ОС для ПК можно назвать Linux.
Основной особенностью операционных систем реального времени (ОСРВ) яв- ляется обеспечение обработки поступающих заданий в течение заданных интерва- лов времени, которые нельзя превышать. Поток заданий в общем случае не являет- ся планомерным и не может регулироваться оператором (характер следования со- бытий можно предсказать лишь в редких случаях), то есть задания поступают в не- предсказуемые моменты времени и без всякой очерёдности. В ОС, не предназна- ченных для решения задач реального времени, имеются некоторые накладные рас- ходы процессорного времени на этапе инициирования (при выполнении которого
ОС распознает все пожелания пользователей относительно решения своей задачи,
загружает в оперативную память нужную программу и выделяет другие необходи- мые для её выполнения ресурсы). В ОСРВ подобные затраты могут отсутствовать,
так как набор задач обычно фиксирован и вся информация о задачах известна ещё
до поступления запросов. Для подлинной реализации режима реального времени необходима (хотя этого и недостаточно) организация мультипрограммирования.
Мультипрограммирование является основным средством повышения производи- тельности вычислительной системы, а для решения задач реального времени про- изводительность становится важнейшим фактором. Лучшие характеристики по производительности для систем реального времени обеспечиваются однотерми- нальными ОСРВ. Средства организации мультитерминального режима всегда за- медляют работу системы в целом, но расширяют функциональные возможности системы. Одной из наиболее известных ОСРВ для ПК является ОС QNX.
По основному архитектурному принципу ОС разделяются на микроядерные и
монолитные. В некоторой степени это разделение тоже условно, однако можно в качестве яркого примера микроядерной ОС привести ОСРВ QNX, тогда как в каче-
51
стве монолитной можно назвать Windows 95/98 или ОС Linux. Ядро ОС Windows мы не можем изменить, нам не доступны его исходные коды и у нас нет програм- мы для сборки (компиляции) этого ядра. А вот в случае с Linux мы можем сами со- брать ядро, которое нам необходимо, включив в него те необходимые про- граммные модули и драйверы, которые мы считаем целесообразным включить именно в ядро (а не обращаться к ним из ядра).
Контрольные вопросы и задачи
Вопросы для проверки
1 Объясните, в чём заключается различие между такими понятиями, как про- цесс и задача.
2 Изобразите диаграмму состояний процесса, поясните все возможные перехо- ды из одного состояния в другое.
3 Объясните значения следующих терминов: task (задача), process (процесс),
thread (поток, нить). Как они между собой соотносятся?
4 Для чего каждая задача получает соответствующий дескриптор? Какие поля,
как правило, содержатся в дескрипторе процесса (задачи)? Что такое «контекст за- дачи»?
5 Объясните понятие ресурса. Почему понятие ресурса является одним из фундаментальных при рассмотрении ОС? Какие виды и типы ресурсов вы знаете?
6 Как вы считаете: сколько и каких списков дескрипторов задач может быть в системе? От чего должно зависеть это число?
7 Перечислите дисциплины обслуживания прерываний; объясните, как можно реализовать каждую из этих дисциплин.
8 С какой целью в ОС вводится специальный системный модуль, иногда назы- ваемый супервизором прерываний?
9 В чём заключается различие между повторно-входимыми (re-entrance) и по- вторно-прерываемыми (re-enterable) программными модулями? Как они реа- лизуются?
52 10 Что такое привилегированный программный модуль? Почему нельзя соз- дать мультипрограммную ОС, в которой бы не было привилегированных про- граммных модулей?
ГЛАВА 2 Управление задачами и памятью в операционных системах
Итак, время центрального процессора и оперативная память являются основ- ными ресурсами в случае реализации мультипрограммных вычислений.
Оперативная память – это важнейший ресурс любой вычислительной системы,
поскольку без неё (как, впрочем, и без центрального процессора) невозможно вы- полнение ни одной программы. Мы уже отмечали, что память является разделяе- мым ресурсом. От выбранных механизмов распределения памяти между выпол- няющимися процессорами очень сильно зависит и эффективность использования ресурсов системы, и её производительность, и возможности, которыми могут поль- зоваться программисты при создании своих программ. Способы распределения времени центрального процессора тоже сильно влияют и на скорость выполнения отдельных вычислений, и на общую эффективность вычислительной системы.
Понятие процесса (задачи) нам уже известно. В данной главе мы не будем стараться разделять понятия процесс (process) и поток (thread), вместо этого ис- пользуя как бы обобщающий термин task (задача). В других разделах, если специ- ально это не оговаривается, под задачей или процессом следует понимать практи- чески одно и то же. Сейчас же мы будем говорить о разделении ресурса централь- ного процессора, поэтому термин задача может включать в себя и понятие треда
(потока).
Итак, операционная система выполняет следующие основные функции, свя- занные с управлением задачами:
♦ создание и удаление задач;
♦ планирование процессов и диспетчеризация задач;
♦ синхронизация задач, обеспечение их средствами коммуникации.
53
Система управления задачами обеспечивает прохождение их через компьютер.
В зависимости от состояния процесса ему должен быть предоставлен тот или иной ресурс. Например, новый процесс необходимо разместить в основной памяти –
следовательно, ему необходимо выделить часть адресного пространства. Новый порожденный поток текущего процесса необходимо включить в общий список за- дач, конкурирующих между собой за ресурсы центрального процессора.
Создание и удаление задач осуществляется по соответствующим запросам от пользователей или от самих задач. Задача может породить новую задачу. При этом между процессами появляются «родственные» отношения. Порождающая задача называется «предком», «родителем», а порожденная – «потомком», «сыном» или
«дочерней задачей». «Предок» может приостановить или удалить свою дочернюю задачу, тогда как «потомок» не может управлять «предком».
Основным подходом к организации того или иного метода управления про- цессами, обеспечивающего эффективную загрузку ресурсов или выполнение ка- ких-либо иных целей, является организация очерёдей процессов и ресурсов.
Очевидно, что на распределение ресурсов влияют конкретные потребности тех задач, которые должны выполняться параллельно. Другими словами, можно столк- нуться с ситуациями, когда невозможно эффективно распределять ресурсы с тем,
чтобы они не простаивали. Например, всем выполняющимся процессам требуется некоторое устройство с последовательным доступом. Но поскольку, как мы уже знаем, оно не может распределяться между параллельно выполняющимися процес- сами, то процессы вынуждены будут очень долго ждать своей очерёди. Таким об- разом, недоступность одного ресурса может привести к тому, что длительное время не будут использоваться и многие другие ресурсы.
Если же мы возьмем набор таких процессов, которые не будут конкурировать между собой за неразделяемые ресурсы при параллельном выполнении, то, скорее всего, процессы смогут выполниться быстрее (из-за отсутствия дополнительных ожиданий), да и имеющиеся в системе ресурсы будут использоваться более эффек- тивно. Итак, возникает задача подбора такого множества процессов, что при вы-
54
полнении они будут как можно реже конфликтовать из-за имеющихся в системе ресурсов. Такая задача называется планированием вычислительных процессов.
Задача планирования процессов возникла очень давно – в первых пакетных
ОС при планировании пакетов задач, которые должны были выполняться на ком- пьютере и оптимально использовать его ресурсы. В настоящее время актуальность этой задачи не так велика. На первый план уже очень давно вышли задачи дина- мического (или краткосрочного) планирования, то есть текущего наиболее эф- фективного распределения ресурсов, возникающего практически при каждом со- бытии. Задачи динамического планирования стали называть диспетчеризацией
1
.
Очевидно, что планирование осуществляется гораздо реже, чем задача теку- щего распределения ресурсов между уже выполняющимися процессами и потока- ми. Основное отличие между долгосрочным и краткосрочным планировщиками за- ключается в частоте запуска: краткосрочный планировщик, например, может за- пускаться каждые 30 или 100 мс, долгосрочный – один раз за несколько минут (или чаще; тут многое зависит от общей длительности решения заданий пользователей).
Долгосрочный планировщик решает, какой из процессов, находящихся во входной очерёди, должен быть переведен в очередь готовых процессов в случае освобождения ресурсов памяти. Он выбирает процессы из входной очерёди с це- лью создания неоднородной мультипрограммной смеси. Это означает, что в очерё- ди готовых к выполнению процессов должны находиться – в разной пропорции –
как процессы, ориентированные на ввод/вывод, так и процессы, ориентированные на преимущественную работу с центральным процессором.
Краткосрочный планировщик решает, какая из задач, находящихся в очерёди готовых к выполнению, должна быть передана на исполнение. В большинстве со- временных операционных систем, с которыми мы сталкиваемся, долгосрочный планировщик отсутствует.
1
К сожалению, здесь наблюдается терминологическая несогласованность. Собственно модули супервизора, отве- чающие за диспетчеризацию задач, часто называют планировщиками (sheduler). Но фактически, говоря о тех же планировщиках памяти или о каких-нибудь других модулях, отвечающих за динамическое распределение ресурсов,
имеют в виду, что эти планировщики осуществляют диспетчеризацию. Наконец, иногда диспетчеризацию называют краткосрочным планированием.
55
Планирование и диспетчеризация процессов
и задач
Стратегии планирования
Прежде всего следует отметить, что при рассмотрении стратегий планирова- ния, как правило, идёт речь о краткосрочном планировании, то есть о диспетчери- зации. Долгосрочное планирование, как мы уже отметили, заключается в подборе таких вычислительных процессов, которые бы меньше всего конкурировали между собой за ресурсы вычислительной системы.
Стратегия планирования определяет, какие процессы мы планируем на вы- полнение для того, чтобы достичь поставленной цели. Известно большое количест- во различных стратегий выбора процесса, которому необходимо предоставить про- цессор. Среди них, прежде всего, можно назвать следующие стратегии:
♦ по возможности заканчивать вычисления (вычислительные процессы) в том же самом порядке, в котором они были начаты;
♦ отдавать предпочтение более коротким процессам;
♦ предоставлять всем пользователям (процессам пользователей) одинаковые услуги, в том числе и одинаковое время ожидания.
Когда говорят о стратегии обслуживания, всегда имеют в виду понятие про- цесса, а не понятие задачи, поскольку процесс, как мы уже знаем, может состоять из нескольких потоков (задач).
Дисциплины диспетчеризации
Когда говорят о диспетчеризации, то всегда в явном или неявном виде имеют в виду понятие задачи (потока). Если ОС не поддерживает механизм тредов, то можно заменять понятие задачи на понятие процесса. Так как эти термины часто используются именно в таком смысле, мы вынуждены будем использовать термин
«процесс» как синоним термина «задача».
Известно большое количество правил (дисциплин диспетчеризации), в соот- ветствии с которыми формируется список (очередь) готовых к выполнению задач.
Различают два больших класса дисциплин обслуживания – бесприоритетные и
приоритетные. При бесприоритетном обслуживании выбор задачи производится в
Рис. 1.8. Реентерабельный программный модуль
Отключение прерываний
Собственно тело программного модуля
Включение прерываний
Привилегированный модуль, заказывающий в системной области памяти блок ячеек для хранения текущих
(промежуточных)
данных
Основное тело реентерабельного программного модуля, которое и может быть прервано.
Работает в непривилегированном режиме
Привилегированный модуль,
освобождающий в системной области памяти блок памяти,
использованный для хранения промежуточных данных
Системная область,
используемая динамическим образом для буферированного ввода/вывода и реентерабельной обработки
Блок ячеек памяти для текущих переменных
Вершина стека
Стек
47
Основная идея построения и работы реентерабельного программного модуля,
структура которого представлена на рис. 1.8, заключается в том, что в первой (го- ловной) своей части с помощью обращения из системной привилегированной сек- ции осуществляется запрос на получение в системной области памяти блока ячеек,
необходимого для размещения всех текущих (промежуточных) данных. При этом на вершину стека помещается указатель на начало области данных и её объём. Все текущие переменные реентерабельного программного модуля в этом случае распо- лагаются в системной области памяти. Поскольку в конце привилегированной сек- ции система прерываний включается, то во время работы центральной (основной)
части реентерабельного модуля возможно её прерывание. Если прерывание не воз- никает, то в третьей (заключительной) секции осуществляется запрос на освобож- дение использованного блока системной области памяти. Если же во время работы центральной секции возникает прерывание и другой вычислительный процесс об- ращается к тому же самому реентерабельному программному модулю, то для этого нового процесса вновь заказывается новый блок памяти в системной области памя- ти и на вершину стека записывается новый указатель. Очевидно, что возможно многократное повторное вхождение в реентерабельный программный модуль до тех пор, пока в области системной памяти, выделяемой специально для реентера- бельной обработки, есть свободные ячейки, число которых достаточно для выделе- ния нового блока.
Что касается статического способа выделения памяти, то здесь речь может ид- ти, например, о том, что заранее для фиксированного числа вычислительных про- цессов резервируются области памяти, в которых будут располагаться переменные реентерабельных программных модулей: для каждого процесса – своя область па- мяти. Чаще всего в качестве таких процессов выступают процессы ввода/вывода и речь идёт о реентерабельных драйверах (реентерабельный драйвер может управ- лять параллельно несколькими однотипными устройствами. См. более подробно в главе 4 «Управление вводом/выводом и файловые системы»).
Кроме реентерабельных программных модулей существуют ещё повторно
входимые (от re-entrance). Этим термином называют программные модули, которые
48
тоже допускают свое многократное параллельное использование, но в отличие от реентерабельных их нельзя прерывать. Повторно входимые программные модули состоят из привилегированных секций и повторное обращение к ним возможно только после завершения какой-нибудь из таких секций. После выполнения оче- редной привилегированной секции управление может быть передано супервизору,
и если он предоставит возможность выполняться другому процессу, то возможно повторное вхождение в рассматриваемый программный модуль. Другими словами,
в повторно входимых программных модулях четко предопределены все допусти- мые (возможные) точки входа. Следует отметить, что повторно входимые про- граммные модули встречаются гораздо чаще реентерабельных (повторно преры- ваемых).
Наконец, имеются и информационные ресурсы, то есть в качестве ресурсов могут выступать данные.
Информационные ресурсы могут существовать как в виде переменных, нахо- дящихся в оперативной памяти, так и в виде файлов. Если процессы используют данные только для чтения, то такие информационные ресурсы можно разделять.
Если же процессы могут изменять информационные ресурсы, то необходимо спе- циальным образом организовывать работу с такими данными. Это одна из наибо- лее сложных проблем, достаточно подробно она обсуждается в главе 6.
Классификация операционных систем
Широко известно высказывание, согласно которому любая наука начинается с классификации. Само собой, что вариантов классификации может быть очень мно- го, все будет зависеть от выбранного признака, по которому один объект мы будем отличать от другого. Однако, что касается ОС, здесь уже давно сформировалось относительно небольшое количество классификаций: по назначению, по режиму обработки задач, по способу взаимодействия с системой и, наконец, по способам построения (архитектурным особенностям систем).
Во введении мы уже дали «определение» операционной системы (ОС). Поэто- му просто повторим, что основным предназначением ОС является организация эф-
49
фективных и надёжных вычислений, создание различных интерфейсов для взаи- модействия с этими вычислениями и с самой вычислительной системой.
Прежде всего, различают ОС общего и специального назначения. ОС специаль- ного назначения, в свою очередь, подразделяются на следующие: для переносимых микрокомпьютеров и различных встроенных систем, организации и ведения баз данных, решения задач реального времени и т. п.
По режиму обработки задач различают ОС, обеспечивающие однопрограмм- ный и мультипрограммный режимы. Под мультипрограммированием понимается способ организации вычислений, когда на однопроцессорной вычислительной сис- теме создается видимость одновременного выполнения нескольких программ. Лю- бая задержка в решении программы (например, для осуществления операций вво- да/вывода данных) используется для выполнения других (таких же, либо менее важных) программ. Иногда при этом говорят о мультизадачном режиме. При этом,
вообще говоря, мультипрограммный и мультизадачный режимы – это не синони- мы, хотя и близкие понятия. Основное принципиальное отличие в этих терминах заключается в том, что мультипрограммный режим обеспечивает параллельное выполнение нескольких приложений и при этом программисты, создающие эти программы, не должны заботиться о механизмах организации их параллельной ра- боты. Эти функции берет на себя сама ОС; именно она распределяет между выпол- няющимися приложениями ресурсы вычислительной системы, осуществляет необ- ходимую синхронизацию вычислений и взаимодействие. Мультизадачный режим,
наоборот, предполагает, что забота о параллельном выполнении и взаимодействии приложений ложится как раз на прикладных программистов. В современной тех- нической и, тем более, научно-популярной литературе об этом различии часто за- бывают, тем самым внося некоторую путаницу. Можно, однако, заметить, что со- временные ОС для ПК реализуют и мультипрограммный, и мультизадачный режи- мы.
При организации работы с вычислительной системой в диалоговом режиме можно говорить об однопользовательских (однотерминальных) и мультитерми- нальных ОС. В мультитерминальных ОС с одной вычислительной системой одно-
50
временно могут работать несколько пользователей, каждый со своего терминала.
При этом у пользователей возникает иллюзия, что у каждого из них имеется своя собственная вычислительная система. Очевидно, что для организации мультитер- минального доступа к вычислительной системе необходимо обеспечить муль- типрограммный режим работы. В качестве одного из примеров мультитерминаль- ных ОС для ПК можно назвать Linux.
Основной особенностью операционных систем реального времени (ОСРВ) яв- ляется обеспечение обработки поступающих заданий в течение заданных интерва- лов времени, которые нельзя превышать. Поток заданий в общем случае не являет- ся планомерным и не может регулироваться оператором (характер следования со- бытий можно предсказать лишь в редких случаях), то есть задания поступают в не- предсказуемые моменты времени и без всякой очерёдности. В ОС, не предназна- ченных для решения задач реального времени, имеются некоторые накладные рас- ходы процессорного времени на этапе инициирования (при выполнении которого
ОС распознает все пожелания пользователей относительно решения своей задачи,
загружает в оперативную память нужную программу и выделяет другие необходи- мые для её выполнения ресурсы). В ОСРВ подобные затраты могут отсутствовать,
так как набор задач обычно фиксирован и вся информация о задачах известна ещё
до поступления запросов. Для подлинной реализации режима реального времени необходима (хотя этого и недостаточно) организация мультипрограммирования.
Мультипрограммирование является основным средством повышения производи- тельности вычислительной системы, а для решения задач реального времени про- изводительность становится важнейшим фактором. Лучшие характеристики по производительности для систем реального времени обеспечиваются однотерми- нальными ОСРВ. Средства организации мультитерминального режима всегда за- медляют работу системы в целом, но расширяют функциональные возможности системы. Одной из наиболее известных ОСРВ для ПК является ОС QNX.
По основному архитектурному принципу ОС разделяются на микроядерные и
монолитные. В некоторой степени это разделение тоже условно, однако можно в качестве яркого примера микроядерной ОС привести ОСРВ QNX, тогда как в каче-
51
стве монолитной можно назвать Windows 95/98 или ОС Linux. Ядро ОС Windows мы не можем изменить, нам не доступны его исходные коды и у нас нет програм- мы для сборки (компиляции) этого ядра. А вот в случае с Linux мы можем сами со- брать ядро, которое нам необходимо, включив в него те необходимые про- граммные модули и драйверы, которые мы считаем целесообразным включить именно в ядро (а не обращаться к ним из ядра).
Контрольные вопросы и задачи
Вопросы для проверки
1 Объясните, в чём заключается различие между такими понятиями, как про- цесс и задача.
2 Изобразите диаграмму состояний процесса, поясните все возможные перехо- ды из одного состояния в другое.
3 Объясните значения следующих терминов: task (задача), process (процесс),
thread (поток, нить). Как они между собой соотносятся?
4 Для чего каждая задача получает соответствующий дескриптор? Какие поля,
как правило, содержатся в дескрипторе процесса (задачи)? Что такое «контекст за- дачи»?
5 Объясните понятие ресурса. Почему понятие ресурса является одним из фундаментальных при рассмотрении ОС? Какие виды и типы ресурсов вы знаете?
6 Как вы считаете: сколько и каких списков дескрипторов задач может быть в системе? От чего должно зависеть это число?
7 Перечислите дисциплины обслуживания прерываний; объясните, как можно реализовать каждую из этих дисциплин.
8 С какой целью в ОС вводится специальный системный модуль, иногда назы- ваемый супервизором прерываний?
9 В чём заключается различие между повторно-входимыми (re-entrance) и по- вторно-прерываемыми (re-enterable) программными модулями? Как они реа- лизуются?
52 10 Что такое привилегированный программный модуль? Почему нельзя соз- дать мультипрограммную ОС, в которой бы не было привилегированных про- граммных модулей?
ГЛАВА 2 Управление задачами и памятью в операционных системах
Итак, время центрального процессора и оперативная память являются основ- ными ресурсами в случае реализации мультипрограммных вычислений.
Оперативная память – это важнейший ресурс любой вычислительной системы,
поскольку без неё (как, впрочем, и без центрального процессора) невозможно вы- полнение ни одной программы. Мы уже отмечали, что память является разделяе- мым ресурсом. От выбранных механизмов распределения памяти между выпол- няющимися процессорами очень сильно зависит и эффективность использования ресурсов системы, и её производительность, и возможности, которыми могут поль- зоваться программисты при создании своих программ. Способы распределения времени центрального процессора тоже сильно влияют и на скорость выполнения отдельных вычислений, и на общую эффективность вычислительной системы.
Понятие процесса (задачи) нам уже известно. В данной главе мы не будем стараться разделять понятия процесс (process) и поток (thread), вместо этого ис- пользуя как бы обобщающий термин task (задача). В других разделах, если специ- ально это не оговаривается, под задачей или процессом следует понимать практи- чески одно и то же. Сейчас же мы будем говорить о разделении ресурса централь- ного процессора, поэтому термин задача может включать в себя и понятие треда
(потока).
Итак, операционная система выполняет следующие основные функции, свя- занные с управлением задачами:
♦ создание и удаление задач;
♦ планирование процессов и диспетчеризация задач;
♦ синхронизация задач, обеспечение их средствами коммуникации.
53
Система управления задачами обеспечивает прохождение их через компьютер.
В зависимости от состояния процесса ему должен быть предоставлен тот или иной ресурс. Например, новый процесс необходимо разместить в основной памяти –
следовательно, ему необходимо выделить часть адресного пространства. Новый порожденный поток текущего процесса необходимо включить в общий список за- дач, конкурирующих между собой за ресурсы центрального процессора.
Создание и удаление задач осуществляется по соответствующим запросам от пользователей или от самих задач. Задача может породить новую задачу. При этом между процессами появляются «родственные» отношения. Порождающая задача называется «предком», «родителем», а порожденная – «потомком», «сыном» или
«дочерней задачей». «Предок» может приостановить или удалить свою дочернюю задачу, тогда как «потомок» не может управлять «предком».
Основным подходом к организации того или иного метода управления про- цессами, обеспечивающего эффективную загрузку ресурсов или выполнение ка- ких-либо иных целей, является организация очерёдей процессов и ресурсов.
Очевидно, что на распределение ресурсов влияют конкретные потребности тех задач, которые должны выполняться параллельно. Другими словами, можно столк- нуться с ситуациями, когда невозможно эффективно распределять ресурсы с тем,
чтобы они не простаивали. Например, всем выполняющимся процессам требуется некоторое устройство с последовательным доступом. Но поскольку, как мы уже знаем, оно не может распределяться между параллельно выполняющимися процес- сами, то процессы вынуждены будут очень долго ждать своей очерёди. Таким об- разом, недоступность одного ресурса может привести к тому, что длительное время не будут использоваться и многие другие ресурсы.
Если же мы возьмем набор таких процессов, которые не будут конкурировать между собой за неразделяемые ресурсы при параллельном выполнении, то, скорее всего, процессы смогут выполниться быстрее (из-за отсутствия дополнительных ожиданий), да и имеющиеся в системе ресурсы будут использоваться более эффек- тивно. Итак, возникает задача подбора такого множества процессов, что при вы-
54
полнении они будут как можно реже конфликтовать из-за имеющихся в системе ресурсов. Такая задача называется планированием вычислительных процессов.
Задача планирования процессов возникла очень давно – в первых пакетных
ОС при планировании пакетов задач, которые должны были выполняться на ком- пьютере и оптимально использовать его ресурсы. В настоящее время актуальность этой задачи не так велика. На первый план уже очень давно вышли задачи дина- мического (или краткосрочного) планирования, то есть текущего наиболее эф- фективного распределения ресурсов, возникающего практически при каждом со- бытии. Задачи динамического планирования стали называть диспетчеризацией
1
.
Очевидно, что планирование осуществляется гораздо реже, чем задача теку- щего распределения ресурсов между уже выполняющимися процессами и потока- ми. Основное отличие между долгосрочным и краткосрочным планировщиками за- ключается в частоте запуска: краткосрочный планировщик, например, может за- пускаться каждые 30 или 100 мс, долгосрочный – один раз за несколько минут (или чаще; тут многое зависит от общей длительности решения заданий пользователей).
Долгосрочный планировщик решает, какой из процессов, находящихся во входной очерёди, должен быть переведен в очередь готовых процессов в случае освобождения ресурсов памяти. Он выбирает процессы из входной очерёди с це- лью создания неоднородной мультипрограммной смеси. Это означает, что в очерё- ди готовых к выполнению процессов должны находиться – в разной пропорции –
как процессы, ориентированные на ввод/вывод, так и процессы, ориентированные на преимущественную работу с центральным процессором.
Краткосрочный планировщик решает, какая из задач, находящихся в очерёди готовых к выполнению, должна быть передана на исполнение. В большинстве со- временных операционных систем, с которыми мы сталкиваемся, долгосрочный планировщик отсутствует.
1
К сожалению, здесь наблюдается терминологическая несогласованность. Собственно модули супервизора, отве- чающие за диспетчеризацию задач, часто называют планировщиками (sheduler). Но фактически, говоря о тех же планировщиках памяти или о каких-нибудь других модулях, отвечающих за динамическое распределение ресурсов,
имеют в виду, что эти планировщики осуществляют диспетчеризацию. Наконец, иногда диспетчеризацию называют краткосрочным планированием.
55
Планирование и диспетчеризация процессов
и задач
Стратегии планирования
Прежде всего следует отметить, что при рассмотрении стратегий планирова- ния, как правило, идёт речь о краткосрочном планировании, то есть о диспетчери- зации. Долгосрочное планирование, как мы уже отметили, заключается в подборе таких вычислительных процессов, которые бы меньше всего конкурировали между собой за ресурсы вычислительной системы.
Стратегия планирования определяет, какие процессы мы планируем на вы- полнение для того, чтобы достичь поставленной цели. Известно большое количест- во различных стратегий выбора процесса, которому необходимо предоставить про- цессор. Среди них, прежде всего, можно назвать следующие стратегии:
♦ по возможности заканчивать вычисления (вычислительные процессы) в том же самом порядке, в котором они были начаты;
♦ отдавать предпочтение более коротким процессам;
♦ предоставлять всем пользователям (процессам пользователей) одинаковые услуги, в том числе и одинаковое время ожидания.
Когда говорят о стратегии обслуживания, всегда имеют в виду понятие про- цесса, а не понятие задачи, поскольку процесс, как мы уже знаем, может состоять из нескольких потоков (задач).
Дисциплины диспетчеризации
Когда говорят о диспетчеризации, то всегда в явном или неявном виде имеют в виду понятие задачи (потока). Если ОС не поддерживает механизм тредов, то можно заменять понятие задачи на понятие процесса. Так как эти термины часто используются именно в таком смысле, мы вынуждены будем использовать термин
«процесс» как синоним термина «задача».
Известно большое количество правил (дисциплин диспетчеризации), в соот- ветствии с которыми формируется список (очередь) готовых к выполнению задач.
Различают два больших класса дисциплин обслуживания – бесприоритетные и
приоритетные. При бесприоритетном обслуживании выбор задачи производится в