1.
Назначение и
функции операционных систем
Операционная система (ОС) - это комплекс взаимосвязанных
программ, предназначенный для повышения эффективности аппаратуры компьютера
путем рационального управления его ресурсами и предназначенный для:
1. Повышения эффективности управления вычислительной
системы.
2. Упрощения взаимодействия пользователя с
оборудованием ВС и ПО.
3. Предоставления виртуальной машины.
Цель создания операционной системы - получить
экономический выигрыш при использовании системы, путем увеличения
производительности труда программистов и эффективности работы оборудования.
Функции
операционной системы:
-
связь с пользователем в реальном времени для подготовки устройств к
работе, переопределение конфигурации и изменения состояния системы.
- выполнение операций
ввода-вывода; в частности, в состав операционной системы входят программы
обработки прерываний от устройств ввода-вывода,
обработки запросов к устройствам ввода-вывода и распределения этих запросов
между устройствами.
- управление памятью, связанное с
распределением оперативной памяти между прикладными программами.
-
управление файлами; основными задачами при этом являются обеспечение
защиты, управление выборкой и сохранение секретности хранимой информации.
- обработка исключительных условий во время
выполнения задачи
- появление арифметической или
машинной ошибки, прерываний, связанных с неправильной адресацией или
выполнением привилегированных команд.
- вспомогательные,
обеспечивающие организацию сетей, использование служебных программ и языков
высокого уровня.
Назначение операционной системы:
1.
Операционная система (ОС) связывает аппаратное
обеспечение и прикладные программы.
2.
Операционная система может взаимодействовать с
аппаратными средствами и пользователем или прикладными программами.
3. ОС может переносить информацию
между аппаратурой и прикладным программным обеспечением.
4. Прикладной программист не должен
беспокоиться о написании специального программного кода для записи данных на
все множество дисков, которое может быть на ПК. Программист просто просит
операционную систему записать данные на диск, а ОС занимается зависящей от
аппаратуры информацией.
5. Операционная система получает
предоставляемые прикладными программами данные и записывает их на физический
диск.
6. Использование операционной
системы делает программное обеспечение более общим: программы могут работать на
любом компьютере, на котором можно запустить эту операционную систему,
поскольку взаимодействуют с операционной системой, а не с аппаратурой.
2.
Классификация
операционных систем.
Операционные системы классифицируются: по степени
поддержки режимов работы (по принципу универсальности):
· универсальные (все
основные режимы, 4 платформы);
· специальные (конкретные
режимы, по 1 режиму и нескольким режимам, платформы).
по типу основных функций/ по типу использования
ресурсов:
· локальные;
· сетевые;
· распределенные.
Сетевая ОС имеет в своем составе средства
передачи сообщений между компьютерами по линиям связи, которые совершенно не
нужны в автономной ОС. На основе этих сообщений сетевая
ОС поддерживает разделение ресурсов компьютера между удаленными пользователями,
подключенными к сети. Для поддержания функций передачи сообщений сетевые ОС
содержат специальные программные компоненты, реализующие популярные
коммуникационные протоколы, такие как
TCP/IP, IPX, Ethernet и другие.
Распределенная организация операционной системы позволяет упростить
работу пользователей и программистов в сетевых средах. В
распределенной ОС реализованы механизмы, которые дают
возможность пользователю представлять и воспринимать сеть в виде традиционного
однопроцессорного компьютера. Характерными признаками
распределенной организации ОС являются: наличие единой справочной службы
разделяемых ресурсов, единой службы времени, использование механизма вызова
удаленных процедур (RPC) для прозрачного распределения программных процедур по
машинам многонитевой обработки, позволяющей
распараллеливать вычисления в рамках одной задачи и выполнят эту задачу сразу
на нескольких компьютерах сети, а также наличие других распределенных служб.
по классу аппаратной платформы:
· ОС суперпроцессоров;
· кластеров и больших ЭВМ;
· мини-ЭВМ;
· рабочих станций;
· микро-ЭВМ;
· мобильные ноутбук (лаптоп);
· КПК;
· сотовый телефон (комуникатор, смартофон,
камерофон, видеофоны и др.).
по дате появления и продолжению развития:
· ранние/неразвиваемые
(THE
(разработана Эдсгером Дейкстрой
и другими));
· современные/развиваемые.
по базовым технологиям:
· unix-подобные;
· windows-подобные;
по типу лицензии:
· проприетарные (Mac OS
) (частной собственностью авторов или правообладателей Правообладатель сохраняет за собой монополию на его использование, копирование и модификацию, полностью или в существенных моментах.);· открытые;
· образовательные.
по количеству одновременно работающих пользователей:
· однопользовательские (MS-DOS, Windows 3.x, ранние версии OS/2);
· многопользовательские (UNIX, Windows
NT).
Главным отличием многопользовательских систем
от однопользовательских является наличие средств защиты информации
каждого пользователя от несанкционированного доступа других пользователей.
Следует заметить, что не всякая многозадачная система является
многопользовательской, и не всякая однопользовательская ОС является однозадачной.
по количеству решаемых задач:
· однозадачные (MS-DOS, MSX);
· многозадачные (OC EC, OS/2, UNIX, Windows 95):
· с не вытесняющей многозадачностью (NetWare, Windows 3.x);
· с вытесняющей многозадачностью (Windows NT, OS/2, UNIX).
Однозадачные ОС в основном выполняют функцию
предоставления пользователю виртуальной машины, делая более простым и удобным
процесс взаимодействия пользователя с компьютером. Однозадачные ОС включают
средства управления периферийными устройствами, средства управления файлами, средства
общения с пользователем.
Многозадачные
ОС, кроме вышеперечисленных функций, управляют разделением совместно
используемых ресурсов, таких как процессор, оперативная память, файлы и внешние
устройства. Основным
различием между вытесняющим
и невытесняющим вариантами многозадачности
является степень централизации механизма планирования процессов. В первом
случае механизм планирования процессов целиком сосредоточен в операционной
системе, а во втором - распределен между системой и прикладными программами.
При невытесняющей многозадачности активный процесс
выполняется до тех пор, пока он сам, по собственной инициативе, не отдаст
управление операционной системе для того, чтобы та выбрала из очереди другой
готовый к выполнению процесс. При вытесняющеймногозадачности
решение о переключении процессора с одного процесса на другой принимается
операционной системой, а не самим активным процессом.
по количеству поддерживаемых
процессоров:
· однопроцессорные;
· многопроцессорные:
· асимметричные;
· симметричные.
Другим важным свойством ОС является отсутствие или
наличие в ней средств поддержки многопроцессорной обработки -
мультипроцессирование. Мультипроцессирование приводит к усложнению всех
алгоритмов управления ресурсами.
В наши дни становится общепринятым введение в ОС
функций поддержки многопроцессорной обработки данных. Такие функции имеются в
операционных системах Solaris 2.x фирмы Sun, Open Server 3.x компании Santa Crus Operations, OS/2 фирмы IBM, Windows NT фирмы Microsoft и NetWare 4.1 фирмы Novell.
Многопроцессорные ОС могут классифицироваться по способу организации
вычислительного процесса в системе с многопроцессорной архитектурой:
асимметричные ОС и симметричные ОС.
Асимметричная ОС целиком выполняется только на одном
из процессоров системы, распределяя прикладные задачи по остальным процессорам.
Симметричная ОС полностью децентрализована и
использует весь пул процессоров, разделяя их между системными и прикладными
задачами.
по области применения и типа решаемых задач (только
многозадачные ОС):
· с пакетной обработкой (например, OC
EC);
· с разделением времени (UNIX, VMS);
· реального времени (QNX).
Системы пакетной обработки предназначались для решения задач в
основном вычислительного характера, не требующих быстрого получения
результатов. Главной целью и критерием эффективности систем пакетной обработки
является максимальная пропускная способность, то есть решение максимального
числа задач в единицу времени. Таким образом, взаимодействие пользователя с
вычислительной машиной, на которой установлена система пакетной обработки,
сводится к тому, что он приносит задание, отдает его диспетчеру-оператору, а в
конце дня после выполнения всего пакета заданий получает результат. Очевидно,
что такой порядок снижает эффективность работы пользователя.
Системы разделения времени призваны исправить основной
недостаток систем пакетной обработки - изоляцию пользователя - программиста от
процесса выполнения его задач. Каждому пользователю системы разделения времени
предоставляется терминал, с которого он может вести диалог со своей программой.
Критерием эффективности систем разделения времени является не максимальная
пропускная способность, а удобство и эффективность работы пользователя.
Системы реального времени применяются для управления
различными техническими объектами, такими, например, как станок, спутник,
научная экспериментальная установка или технологическими процессами, такими,
как гальваническая линия, доменный процесс и т.п.
Критерием эффективности для систем реального времени
является их способность выдерживать заранее заданные интервалы времени между
запуском программы и получением результата (управляющего воздействия). Это
время называется временем реакции системы, а соответствующее свойство системы реактивностью.
Некоторые операционные системы могут совмещать в себе свойства систем разных
типов, например, часть задач может выполняться в
режиме пакетной обработки, а часть - в режиме реального времени или в режиме
разделения времени. В таких случаях режим пакетной обработки часто называют
фоновым режимом.
по типу интерфейса:
· командные (текстовые);
· объектно-ориентированные (графические).
Построение ОС на базе объектно-ориентированного
подхода дает возможность использовать все его достоинства, хорошо
зарекомендовавшие себя на уровне приложений, внутри операционной системы, а
именно: аккумуляцию удачных решений в форме стандартных объектов, возможность
создания новых объектов на базе имеющихся с помощью механизма наследования,
хорошую защиту данных за счет их инкапсуляции во внутренние структуры объекта,
что делает данные недоступными для несанкционированного использования извне, структурированность системы,
состоящей из набора хорошо определенных объектов.
3. Понятие процесса и ядра операционных систем.
Процесс
представляет собой программу в состоянии выполнения. Каждый процесс работает в
своем виртуальном пространстве. Совокупность участков физической памяти,
отображаемых на виртуальные адреса процесса, называется образом процесса.
Понятие процесс включает:
· программный код;
· данные;
· содержимое стека;
· содержимое адресного
и других регистров CPU.
Различают
следующие состояния процесса:
· новый (new,
процесс только что создан);
· выполняемый (running,
команды программы выполняются в CPU);
· ожидающий (waiting,
процесс ожидает завершения некоторого события, чаще всего операции ввода -
вывода);
· готовый (ready,
процесс ожидает освобождения CPU);
· завершенный (terminated,
процесс завершил свою работу);
При
управлении процессами ОС используют два основных типа информационных структур:
· дескриптор процесса (содержит
информацию о процессе, которая необходима ядру в течение всего жизненного цикла
процесса);
· контекст процесса (содержит
информацию о процессе, необходимую для возобновления выполнения процесса с
прерванного места; доступен только программам ядра).
Состояние процесса - это совокупность характеристик процесса, позволяющая в любой момент
времени "остановить" а затем в любой другой момент
"продолжить" его выполнение без изменения результатов его работы.
Дескриптор
процесса содержит такую информацию о процессе, которая необходима
ядру в
течение всего жизненного цикла процесса, независимо от того, находится
ли он в
активном или пассивном состоянии, находится ли образ процесса в
оперативной
памяти или выгружен на диск. Дескрипторы отдельных процессов
объединены в
список, образующий таблицу процессов. Память для таблицы процессов
отводится
динамически в области ядра. На основании информации, содержащейся в
таблице
процессов, операционная система осуществляет планирование и
синхронизацию
процессов. В дескрипторе прямо или косвенно (через указатели
на связанные
с ним структуры) содержится информация о состоянии процесса,
расположении
образа процесса в оперативной памяти и на диске, о значении
отдельных
составляющих приоритета, а также его итоговое значение - глобальный
приоритет,
идентификатор пользователя, создавшего процесс, информация о
родственных
процессах, о событиях, осуществления которых ожидает данный
процесс и
некоторая другая информация.
Контекст процесса содержит менее
оперативную, но более объемную часть
информации о
процессе, необходимую для возобновления выполнения процесса с
прерванного
места: содержимое регистров процессора, коды ошибок выполняемых
процессором
системных вызовов, информацию о всех открытых данным процессом
файлов и
незавершенных операциях ввода-вывода (указатели на структуры file) и
другие
данные, характеризующие состояние вычислительной среды в момент
прерывания.
Контекст, так же как и дескриптор процесса, доступен только
программам
ядра, то есть находится в виртуальном адресном пространстве
операционной
системы, однако он хранится не в области ядра, а непосредственно
примыкает к
образу процесса и перемещается вместе с ним, если это необходимо,
из
оперативной памяти на диск.
Ядро
(операционной системы) - программа, функцией которой является управление
базовыми объектами системы. Ядро в своем теле размещает необходимые таблицы
данных. Оно считается некоторой неразделяемой частью ОС и обычно работает в
режиме супервизора, все остальные функции ОС могут работать и в других режимах.
Типы архитектур ядер операционных систем:
· Монолитное ядро -
предоставляет богатый набор абстракций оборудования. Все части монолитного ядра
работают в одном адресном пространстве. Старые монолитные ядра требовали
перекомпиляции при любом изменении состава оборудования. Большинство
современных ядер позволяют во время работы подгружать модули, выполняющие части
функции ядра.
o
Достоинства: скорость
работы, упрощённая разработка модулей.
o
Недостатки: поскольку
всё ядро работает в одном адресном пространстве, сбой в одном из компонентов
может нарушить работоспособность всей системы.
o
Примеры:
Традиционные ядра UNIX, такие как BSD; Linux; MS-DOS.
· Модульное ядро -
современная, усовершенствованная модификация архитектуры монолитных ядер операционных
систем компьютеров. В отличие от классических монолитных ядер они не требуют
полной перекомпиляции ядра при изменении состава аппаратного обеспечения
компьютера. Вместо этого модульные ядра предоставляют тот или иной механизм подгрузки модулей ядра, поддерживающих то или иное
аппаратное обеспечение (например, драйверов). Все модули ядра работают в
адресном пространстве ядра и могут пользоваться всеми функциями,
предоставляемыми ядром.
o
Достоинства:
устойчивость к сбоям оборудования, ошибкам в компонентах системы.
o
Недостатки: передача
данных между процессами требует накладных расходов.
o
Примеры: QNX, Minix.
· Микроядро предоставляет только элементарные
функции управления процессами и минимальный набор абстракций для работы с
оборудованием. Бо́льшая часть работы
осуществляется с помощью специальных пользовательских процессов, называемых сервисами.
Решающим критерием «микроядерности» является
размещение всех или почти всех драйверов и модулей в сервисных процессах,
иногда с явной невозможностью загрузки любых модулей расширения в собственно
микроядро, а также разработки таких расширений.
Достоинства:
Устойчивость к сбоям оборудования, ошибкам в компонентах системы. Основное
достоинство микроядерной архитектуры — высокая
степень модульности ядра операционной системы. Это существенно упрощает
добавление в него новых компонентов. В микроядерной
операционной системе можно, не прерывая ее работы, загружать и выгружать новые
драйверы, файловые системы и т. д. Существенно упрощается процесс отладки
компонентов ядра, так как новая версия драйвера может загружаться без
перезапуска всей операционной системы. Компоненты ядра операционной системы
ничем принципиально не отличаются от пользовательских программ, поэтому для их
отладки можно применять обычные средства. Микроядерная
архитектура повышает надежность системы, поскольку ошибка на уровне
непривилегированной программы менее опасна, чем отказ на уровне режима ядра.
Недостатки: Передача данных между процессами требует накладных
расходов.
Примеры: Symbian OS; Windows CE; Mach, используемый в GNU/Hurd и Mac OS X; QNX; AIX; Minix;
ChorusOS; AmigaOS; MorphOS.
· Экзоядро — ядро
операционной системы компьютеров, предоставляющее лишь функции для
взаимодействия между процессами и безопасного выделения и освобождения
ресурсов. Предполагается, что API для прикладных программ будут предоставляться внешними по
отношению к ядру библиотеками (откуда и название архитектуры).
Возможность доступа к устройствам на уровне
контроллеров позволит эффективней решать некоторые задачи, которые плохо
вписываются в рамки универсальной ОС, например реализация СУБД
будет иметь доступ к диску на уровне секторов диска, а не файлов
и кластеров, что положительно
скажется на быстродействии.
· Наноядро — архитектура
ядра операционной системы компьютеров, в рамках которой крайне упрощённое и минималистичное ядро выполняет лишь одну задачу — обработку
аппаратных прерываний, генерируемых устройствами компьютера. После обработки
прерываний от аппаратуры наноядро, в свою очередь,
посылает информацию о результатах обработки (например, полученные с клавиатуры
символы) вышележащему программному обеспечению при помощи того же механизма
прерываний. Примером является KeyKOS — самая первая ОС на наноядре.
Первая версия вышла ещё в 1983-ем году.
· Гибридное ядро – это
модифицированные микроядра, позволяющие для ускорения работы запускать
«несущественные» части в пространстве ядра.
o
Примеры: Windows NT.
4. Идентификатор
и дескриптор процесса.
Каждый процесс имеет уникальный целочисленный номер,
который называется идентификатором процесса. Он позволяет однозначно
указать нужный процесс в командах пользователя или системных вызовах.
Идентификаторы процессов сохраняют свою уникальность от момента образования
процесса до очередной перезагрузки OS UNIX. Уникальность идентификаторов
гарантируется ядром.
Идентификаторы процессов динамически назначаются ядром
из диапазона от 1 до 30000 в порядке образования процессов. Идентификатор
процесса никак не связан с именем файла программы его выполнения. Процессы не
имеют предопределенных идентификаторов. Исключение составляют диспетчерский
процесс (swapper) с идентификатором 0 и процесс
инициализации (init) с идентификатором 1, которые
образуются первыми при загрузке OS UNIX.
Кроме индивидуальной идентификации процессов в OS UNIX
предусмотрена идентификация групп процессов. Группу процессов образует
множество процессов, запущенных с одного терминала в течении одного сеанса. Все
процессы группы имеют одинаковый идентификатор, который совпадает с
идентификатором лидера группы. Лидером группы обычно является процесс интепретатора команд, который открывает сеанс работы с
терминалом Системные данные, используемые ядром в течении времени жизни
процесса, составляют дескриптор процесса.
Дескриптор процесса резервируется ядром при образовании процесса и
освобождается при его завершении.
Множество процессов, существующих в каждый момент,
образуют единую иерархическую структуру, где они связаны отношениями
потомок-предок. Каждый новый процесс может быть образован (порожден) только
одним из существующих процессов, который становится его предком. По отношению к
предку порожденный процесс будет считаться потомком. Иного способа образования
новых процессов и иных отношений между процессами в OS UNIX не предусмотрено.
Следует отметить, что любой процесс-предок может иметь более одного потомка.
При порождении нового процесса его образ строится
путем копирования образа предка в свободное пространство адресов RAM.
Конкретно, копируются стек и сегменты данных. Процедурный сегмент копируется,
когда он не является разделяемым сегментом, который уже загружен в RAM. Кроме
того, потомок наследует контекст предка. В частности, через контекст потомку
передаются таблицы файлов и сигналов, а также текущий каталог предка. Таким
образом, после порождения потомок является точной копией предка. В этот момент
они различаются только личными идентификаторами и идентификаторами предков в
таблице процессов. В дальнейшем тождество предка и потомка нарушается за счет
индивидуального изменения их сегментов и контекстов. Например, процесс-потомок
может распределять дополнительную память, расширяя сегмент данных, изменять
содержание сегмента данных путем обработки его переменных, модифицировать
таблицу открытых файлов в своем контексте, открывая и закрывая файлы,
переопределить обработку сигналов в таблице сигналов своего контекста.
Концепция процесса - единицы управления и единицы потребления ресурсов. Процесс
представляет собой программу в состоянии выполнения, причем в UNIX в рамках
одного процесса не могут выполняться никакие параллельные действия. Каждый
процесс работает в своем виртуальном адресном пространстве. Совокупность
участков физической памяти, отображаемых на виртуальные адреса процесса,
называется образом процесса.
При
управлении процессами операционная система использует два основных типа
информационных структур:
· дескриптор процесса (структура proc)
· контекст процесса (структура user).
Дескриптор
процесса содержит
такую информацию о процессе, которая необходима ядру в течение всего жизненного
цикла процесса, независимо от того, находится ли он в активном или пассивном
состоянии, находится ли образ процесса в оперативной памяти или выгружен на
диск. Дескрипторы отдельных процессов объединены в список, образующий таблицу
процессов. Память для таблицы процессов отводится динамически в области ядра.
На основании информации, содержащейся в таблице процессов, операционная система
осуществляет планирование и синхронизацию процессов. В дескрипторе прямо или
косвенно (через указатели на связанные с ним структуры) содержится информация о
состоянии процесса, расположении образа процесса в оперативной памяти и на
диске, о значении отдельных составляющих приоритета, а также его итоговое
значение - глобальный приоритет, идентификатор пользователя, создавшего
процесс, информация о родственных процессах, о событиях, осуществления которых
ожидает данный процесс и некоторая другая информация.
Контекст
процесса содержит
менее оперативную, но более объемную часть информации о процессе, необходимую
для возобновления выполнения процесса с прерванного места: содержимое регистров
процессора, коды ошибок выполняемых процессором системных вызовов, информацию о
всех открытых данным процессом файлов и незавершенных операциях ввода-вывода
(указатели на структуры file) и другие данные,
характеризующие состояние вычислительной среды в момент прерывания. Контекст,
так же как и дескриптор процесса, доступен только программам ядра, то есть
находится в виртуальном адресном пространстве операционной системы, однако он
хранится не в области ядра, а непосредственно примыкает к образу процесса и
перемещается вместе с ним, если это необходимо, из оперативной памяти на диск.
В UNIX для процессов предусмотрены два режима выполнения: привилегированный
режим - "система" и обычный режим - "пользователь". В
режиме "пользователь" запрещено выполнение действий, связанных с
управлением ресурсами системы, в частности, корректировка системных таблиц,
управление внешними устройствами, маскирование прерываний, обработка
прерываний. В режиме "система" выполняются программы ядра, а в режиме
"пользователь" - оболочка и прикладные программы. При необходимости
выполнить привилегированные действия пользовательский процесс обращается с
запросом к ядру в форме так называемого системного вызова. В результате
системного вызова управление передается соответствующей программе ядра. С
момента начала выполнения системного вызова процесс считается системным. Таким
образом, один и тот же процесс может находиться в пользовательской и системной
фазах. Эти фазы никогда не выполняются одновременно.
5. Диспетчеризация и синхронизация процессов.
Внутренняя
синхронизация процессов основана на использовании аппарата событий для
изменения состояний процессов в фазе “система”. Состояние процесса отражает
поле p_stat структуры struct
proc дескриптора процесса. Процесс может
находиться в одном из следующих состояний в соответствии со значением поля p_stat:
SONPROC —
процесс выполняется, т.е. его инструкции обрабатываются процессором;
SRUN —
процесс готов к выполнению, но не обладает приоритетом, достаточным для
использования ресурсов процессора;
SSLEEP —
процесс ожидает некоторое событие, до наступления которого он не претендует на
ресурсы процессора;
SZOMB —
состояние промежуточного завершения, когда процесс не имеет образа в RAM, но
сохраняет дескриптор в таблице процессов.
Взаимосвязь
состояний процесса средствами внутренней синхронизации иллюстрирует следующая
схема.
Схема внутренней синхронизации
процессов
В каждый
момент времени только один процесс может являться текущим, т.е. использовать
ресурсы процессора и находиться в состоянии SONPROC. Другие процессы, обработка
которых не блокирована ожиданием событий, находятся в состоянии SRUN. Их
дескрипторы образуют очередь диспетчера dispq
и связаны в таблице процессов посредством ссылочных полей p_linc
структуры struct proc.
Механизм синхронизации обеспечивает переключение текущего процесса в очередь
диспетчера (switch out),
когда он уступает процессор другому процессу, который, соответственно,
включается (switch in)
на выполнение. Переключение процессов между состояниями SRUN и SONPROC
обеспечивает системная функция pswitch на
основе сравнения приоритетов. Процесс остается текущим пока его приоритет выше,
чем у любого процесса в очереди диспетчера. Планирование приоритетов процессов,
претендующих на ресурсы процессора, обеспечивает механизм диспетчеризации
процессов.
Для
управления переключением процессов ядро использует системные флаги вытеснения runrun и kprunrun.
Флаг runrun уведомляет системную функцию oswitch что она должна быть вызвана как только
переключаемый процесс перейдет в фазу “пользователь”. Блокировка переключения в
фазе “система” необходима для гарантии целостности системных данных. Флаг kprunrun позволяет реализовать переключение в фазе
“система”, когда код текущего процесса достигает некоторых разрешенных точек
вытеснения в адресном пространстве ядра.
Обычно при
работе OS UNIX число “спящих” процессов в состоянии SSLEEP превышает число
готовых к выполнению процессов в состоянии SRUN. Это объясняется наличием большого
числа событий в реальной практике работы OS UNIX. Наиболее распространенная
причина погружения процесса в “сон” связана с отработкой внешних прерываний от
периферийных устройств. В частности, выполнение операций ввода-вывода не может
быть реализовано параллельно с обработкой процессором кода программы процесса.
Более высокий уровень приоритета контроллеров периферийных устройств, чем у
процессора при выполнении программы процесса, заставляет последний
переключаться на обработку внешних прерываний, переводя текущий процесс в
состояние “сна” до завершения отработки прерывания. Поэтому увеличение числа
“спящих” процессов характерно при интенсивном обмене с периферией, когда
большое число процессов ожидает в состоянии SSLEEP наступления событий,
связанных с завершением операций ввода-вывода, чтобы продолжить процессорную
обработку своих данных. Кроме приоритетной обработки внешних прерываний события
могут быть вызваны программными причинами. Например, выполнение процесса-предка
может быть приостановлено системным вызовом wait
до завершения процесса-потомка. В другом случае процесс “засыпает” при попытке
чтения из пустого программного канала или при записи в полный программный
канал. Рассмотренная содержательная трактовка события, как некоторой причины
блокировки использования процессора данным процессом, формализуется следующим
образом. Каждый тип ожидаемого события специфицируется уникальным целочисленным
идентификатором, который сохраняется в поле p_wchan
структуры struct proc
дескриптора процесса, когда он находится в состоянии SSLEEP. Более конкретно,
идентификатор события есть адрес определенной системной таблицы или элемента
таблицы, связанной с ожидаемым ресурсом. Например, если процесс-предок ожидает
завершения потомка, то идентификатор события, с которым будет связано его
пробуждение, есть адрес дескриптора процесса-потомка. для погружения процесса в
состояние “сна” используется системная функция sleep,
которой в качестве аргументов передаются идентификатор события и приоритет
процесса после пробуждения. После выполнения функции sleep
поле состояния дескриптора текущего процесса принимает значение SSLEEP в поле p_wchan заносится идентификатор события, в поле
приоритета p_pri фиксируется величина
приоритета после пробуждения, а сам дескриптор включается в очередь
дескрипторов “спящих” процессов sleepq.
Очередь “спящих” процессов sleepq имеет
организацию, аналогичную очереди диспетчера dispq.
При погружении в “сон” текущего процесса процессор переключается на
обслуживание самого приоритетного процесса из очереди диспетчера или обработку
внешнего прерывания.
Для
пробуждения процесса из состояния “сна”, при наступлении ожидаемого события,
выполняется системная функция wakeup,
аргументом которой является идентификатор объявленного события. При вызове
функции wakeup все дескрипторы очереди
“спящих” процессов sleepq, у которых значение
поля p_wchan совпадает с аргументом функции wakeup, перемещаются в очередь диспетчера dispq для готовых к выполнению процессов. Если
приоритет “разбуженного” процесса выше, чем у текущего, то он включается на
обслуживание процессором по алгоритму, рассмотренному выше. Если в очереди
“спящих” процессов нет процессов с идентификатором события, объявленным
функцией wakeup, то “пробуждения” процессов не
происходит. Последнее из состояний процесса, достижимых внутренней
синхронизацией, есть состояние промежуточного завершения текущего процесса —
SZOMB (состояние ‘зомби”). Состояние “зомби” имеет место, если процесс-потомок
завершается по системному вызову exit или по
сигналу до планируемой реализации системного вызова wait
в процессе-предке. При этом образ завершившегося процесса освобождает адресное
пространство, но его дескриптор временно сохраняется в таблице процессов, чтобы
обеспечить корректную обработку системного вызова wait
в процессе-предке.
В заключение
следует отметить, что рассмотренный механизм внутренней синхронизации
обслуживает процессы в фазе “система”, для синхронизации процессов в фазе
“пользователь” используется аппарат сигналов OS UNIX.
Диспетчеризация процессов
Диспетчеризация
процессов в OS UNIX реализует политику разделения времени процессора среди всех
процессов, функционирующих в системе, на основе их приоритетов. Приоритеты
процессов выражаются целыми числами. Их значения сохраняются в поле p_pri структуры struct
proc дескриптора процесса. Во всех версиях OS
UNIX кроме System V Release
4, принято, что приоритет процесса тем выше, чем меньше его численное значение
(в SVR4 — наоборот). Процесс выбирается для обработки процессором из очереди
диспетчера dispq на основе сравнения их
приоритетов. Методы назначения приоритета различны в фазе “система” и в фазе
“пользователь”.
В фазе
“система” приоритет процесса задается системной функцией sleep,
которая вызывается для погружения процесса в состояние ожидания события при внутренней
синхронизации процессов. При “пробуждении” процесса после наступления
ожидаемого события системной функцией wakeup,
процесс сохраняет установленный приоритет, пока он находится в фазе “система”.
Величина приоритета устанавливается в зависимости от события, ожидаемого
процессом при погружении в состояние “сна”, по глобальным параметрам диспетчера
разделения времени, как показано в следующей таблице.
Таблица системных приоритетов
Глобальный параметр |
Системный приоритет |
Событие ожидаемое процессом |
PSWP |
0 |
Свопинг |
PRIBIO |
20 |
Блоко-ориентированный ввод-вывод |
PZERO |
25 |
Уровень обслуживания сигналом |
PPIPE |
26 |
Пустой/полный программный канал |
TTIPRI |
28 |
Ввод с терминала |
TTOPRI |
29 |
Вывод на терминал |
PWAIT |
30 |
Вывод на терминал |
PSLEE{ |
39 |
Пауза в ожидании сигнала |
Глобальные
параметры, определяющие значения системных приоритетов, задаются при генерации
OS UNIX и подобраны таким образом, чтобы поддерживать равновесие в режиме
разделения времени процессора. Глобальный параметр PZERO определяет границу
между низкими и высокими приоритетами в фазе “система”. Системный приоритет со
значением больше PZERO считается низким, не превышающий PZERO — высоким.
Процессы, погруженные в состояние “сна” с высоким приоритетом, не могут быть
выведены из этого состояния каким-либо сигналом. Процессы в состоянии “сна” с
низким приоритетом могут быть “разбужены” сигналом. Текущий и готовые к
выполнению процессы сохраняют фиксированный приоритет, пока они находятся в
фазе “система”. После перехода в фазу “пользователь” приоритет процесса будет
переопределен.
В фазе
“пользователь” приоритет процесса имеет две составляющие пользовательскую и
системную. Значения этих составляющих задают поля дескриптора процесса p_nice и p_cpu,
соответственно. Полное значение приоритета в фазе “пользователь”
устанавливается на основе определенной комбинации его составляющих в полях p_nice и p_cpu.
Начальное
значение пользовательской составляющей приоритета определяется константой NZERO
обычно равной 20. Пользовательская составляющая может быть изменена системным
вызовом nice. Его аргумент определяет величину
модификации поля p_nice и может задаваться в
пределах от 0 до NZERO для непривилегированного процесса или в пределах от
NZERO - до NZERO для привилегированного процесса. Поскольку значение пользовательской
составляющей приоритета наследуется при порождении процесса, то
непривилегированный процесс может только уменьшить приоритет, полученный от
предка. Привилегированный потомок может как уменьшить, так и увеличить свой
приоритет относительно предка.
Начальное
значение системной составляющей приоритета (p_cpu)
в фазе “пользователь” равно 0. Ее изменение зависит от времени использования
процессора, т.е. времени, пока процесс остается текущим, работая в фазе
“пользователь”. Для формирования системной составляющей приоритета используются
прерывания от аппаратного таймера. При частоте сети питания 50 Гц прерывания от
таймера генерируются 50 раз в секунду. Каждое таймерное
прерывание увеличивает значение поля p_cpu,
т.е. уменьшает системную составляющую приоритета на 1.
Результирующий
приоритет процесса в фазе “пользователь” определяется по формуле:
p_pri = (p_nice
- NZERO) + (p_cpu/16) + PUSER.
Разность (p_nice - NZERO) учитывает модификацию
пользовательской составляющей приоритета системным вызовом nice.
Отношение (p_cpu/16) учитывает усредненное
значение системной составляющей приоритета. Усреднение необходимо, так как
неизвестно, какую часть таймерного интервала
проработал процесс на момент очередного прерывания от таймера. Кроме того,
нежелательно частое переключение процессора между процессами с близкими
значениями приоритетов. В частности, для равноприоритетных
процессов в фазе “пользователь” выбранное значение усреднения (1/16)
гарантирует переключение процессора не ранее, чем через 16 таймерных
интервалов (320 мс), когда отношение (p_cpu/16)
увеличится на 1. Константа PUSER по умолчанию равная 50, вводится для
принудительного увеличения приоритета в фазе “пользователь” по отношению к
приоритету в фазе “система”. Это сделано с целью стимулировать переключение
процессора на выполнение процессов в фазе система, в частности, для ускорения
доступа “разбуженных” процессов к ресурсам процессора. Для вычисления
приоритета используется системная функция setpri
, которой в качестве аргумента передается дескриптор процесса. Приоритет
процесса, вычисленный функцией setpri,
сравнивается с приоритетом текущего процесса, который сохраняет системная
переменная curpri. Если приоритет какого-либо
процесса из очереди диспетчера выше приоритета текущего, реализуется переключение
процессора на более приоритетный процесс по схеме внутренней синхронизации
процессов.
Свопинг и пейджинг
процессов
Ограниченный
объем RAM в общем случае не позволяет разместить в ней множество образов
существующих процессов. Поэтому образы пассивных процессов, для размещения
которых нет места в RAM, располагаются в специально отведенной области внешней
памяти, называемой областью свопинга. Образы активных процессов располагаются в
RAM. Перекачку (свопинг) образов процессов между оперативной и внешней памятью
обеспечивает диспетчерский процесс (планировщик свопинга) .swapper
(или sched для SUN OS) с идентификатором 0. Он
осуществляет загрузку в RAM образов активных процессов и выгрузку в область
свопинга образов пассивных процессов.
Свопинг
происходит при практической реализации механизмов синхронизации,
диспетчеризации и управлении иерархией процессов. Например, когда недостаточно
места для размещения в RAM образа порожденного процесса-потомка, образ его
предка может быть выгружен (откачен) в область свопинга, чтобы освободить место
под образ потомка. В другом случае образ “разбуженного” процесса с высоким
приоритетом может быть загружен (подкачен) из области свопинга в RAM для
реализации процессорной обработки. В более общем случае образ любого активизированного
процесса может быть загружен (подкачен) из области свопинга в RAM при наличии
необходимости и свободной памяти, так же как образ любого пассивного процесса
может быть выгружен (откачен) из RAM в область свопинга, чтобы освободить
ресурсы памяти для более приоритетного процесса.
Диспетчерский
процесс swapper, реализуя механизм свопинга,
должен решать две задачи по определению процессов-претендентов для откачки из и
подкачки в RAM. Для решения этих задач диспетчерский процесс, не имея фазы
“пользователь”, осуществляет бесконечный цикл в фазе “система”. Цикл начинается
с просмотра таблицы процессов для поиска процесса-претендента на загрузку или
расширение своего образа в RAM. Если претендентов нет, диспетчер переходит в
состояние ожидания их появления, используя системную функцию sleep которая назначает ему наивысший приоритет PSWP
после пробуждения. диспетчер “пробуждается” системной функцией wakeup при появлении претендента на загрузку в RAM.
Если в RAM
недостаточно свободного места для подкачки образа процесса-претендента на
загрузку, диспетчер выгружает (откачивает) в область свопинга необходимое число
пассивных процессов. Кандидаты на откачку определяются, прежде всего, среди
“спящих” процессов с низким приоритетом (ниже PZERO), которые ожидают завершения
сравнительно медленных операций ввода-вывода. Если таких процессов несколько,
выбирается процесс с максимальным образом в RAM.
Чтобы
обеспечить однозначность выбора процесса для загрузки в RAM или для выгрузки в
область свопинга при прочих равных условиях, применяется временной критерий
оценки. С этой целью в поле p_time структуры struct proc
дескриптора любого процесса фиксируется время непрерывного пребывания в RAM или
в области свопинга соответственно тому, где находится образ процесса. для
свопинга выбирается процесс с максимальным значением в поле p_time.
В современных версиях OS UNIX применяется альтернативный свопингу механизм,
который использует страничную организацию памяти и называется пейджинг (paging). Пейджинг реализует перемещение активных страниц образов
процессов из области свопинга в RAM, называемое подкачкой страниц по
требованию, а также обратное перемещение пассивных страниц из RAM в область
свопинга, называемое изъятием страниц. Схема реализации пейджинга
подобна свопингу, за исключением того, что перемещению между RAM и областью
свопинга подвергается не целиком образ процесса, а его отдельные страницы. При
этом в RAM должны присутствовать только активные страницы образа процесса, к
которым происходит частое обращение. Пассивные страницы, к которым нет
обращений, могут быть откачены в область свопинга. Таким образом, при пейджинге загрузка в RAM полного образа процесса не
является обязательной. Последнее обстоятельство обуславливает ряд преимуществ
пейджинговой схемы по сравнению с традиционным механизмом свопинга, из которых
наиболее существенными являются следующие.
· Отсутствие ограничений на размер
образа процесса по объему физической памяти. Связано с тем, что в RAM размещаются только активные
страницы процесса, а не полные сегменты его образа.
· Ускоренный старт процесса. Становится возможным, поскольку
загрузка сравнительно небольшого числа активных страниц может быть реализована
быстрее, чем загрузка всех сегментов процесса.
· Экономия оперативной памяти. Поскольку для работы процесса
необходима загрузка только активных страниц, память не расходуется на хранение
редко используемых кодов и данных.
· Увеличение производительности. Становится ощутимым при
параллельном выполнении больших процессов, которые часто обращаются к
небольшому подмножеству своих активных страниц.
Недостатком
схемы пейджинга являются накладные расходы по
обработке так называемых отказов страниц, которые связаны с поиском нужной
страницы, если она не загружена в RAM. Кроме того, обработка отказов страниц
требует реализации операций ввода-вывода, прерывающих работу процессора для
подкачки нужной страницы в RAM из области свопинга. Поэтому частые отказы
страниц увеличивают время выполнения процесса. В идеальном случае процесс
работает с небольшим числом активных страниц, резидентных в RAM, когда отказы
страниц с последующей подкачкой нужных страниц по требованию происходят редко.
Для
размещения страниц в RAM при подкачке их по требованию используется пул
свободных страниц. Определенный уровень наличия свободных страниц поддерживает
процедура изъятия страниц, которая откачивает содержимое пассивных страниц в
область свопинга и возвращает изъятые страницы в пул свободных страниц.
Сохранение содержимого изъятой страницы в области свопинга происходит, если
содержание страницы было модифицировано. Процедуры подкачки страниц по
требованию и изъятия страниц являются основными в механизме пейджинга.
Их реализует следящий процесс pageout (pagedaemon в SUN OS), называемый демоном страниц. Так же
как и диспетчерский процесс swapper, управляющий
свопингом, демон страниц — это один из начальных процессов OS UNIX. Он имеет
идентификатор 2. Демон страниц следит за возрастом страниц и определяет, какие
пассивные страницы следует отобрать у процессов, чтобы вернуть их в пул
свободных страниц. Он также обеспечивает подкачку страниц по требованию в
случае отказов страниц. Демон страниц активизируется, когда начинает ощущаться
недостаток свободной памяти или для обработки отказов страниц.
В общем
случае демон страниц успешно решает все проблемы по управлению памятью с
помощью своих базовых процедур подкачки по требованию и изъятия страниц. Однако
могут возникнуть критические ситуации, когда демон страниц не может
предоставить необходимое число свободных страниц для удовлетворения запросов
процессов к RAM и уровень свободной памяти опустится ниже определенного
предела, заданно го системным параметром GPGSLO. В этом случае инициатива
передается диспетчерскому процессу, который планирует и реализует свопинг целых
процессов. Свопинг подразумевает возвращение в пул свободных страниц всех
страниц образа процесса независимо от их возраста. Реализация свопинга
продолжается, пока не восстановлен допустимый уровень свободной памяти. После
этого инициатива по управлению памятью возвращается демону страниц.