Тема OS10асу. Понятие процесса и ядра В основе UNIX лежит концепция процесса - основной единицы управления и единицы потребления ресурсов. Процесс представляет собой программу в состоянии выполнения, причем в UNIX в рамках одного процесса не могут выполняться никакие параллельные действия. Каждый процесс работает в своем виртуальном адресном пространстве. Совокупность участков физической памяти, отображаемых на виртуальные адреса процесса, называется образом процесса. Не следует смешивать понятия процесс и программа. Программа - это план действий, а процесс - это само действие. Понятие процесс включает: 1. программный код 2. данные 3. содержимое стека 4. содержимое адресного и других регистров CPU. Таким образом, для одной программы могут быть созданы несколько процессов, в том случае, если с помощью одной программы в компьютере выполняется несколько несовпадающих последовательностей команд. За время существования процесс многократно изменяет свое состояние. Различают следующие состояния процесса: " новый (new, процесс только что создан) " выполняемый (running, команды программы выполняются в CPU) " ожидающий (waiting, процесс ожидает завершения некоторого события, чаще всего операции ввода - вывода) " готовый (ready, процесс ожидает освобождения CPU) " завершенный (terminated, процесс завершил свою работу) Переход из одного состояния в другое не может выполняться произвольным образом. На рисунке приведена типовая диаграмма переходов для состояний процессора. Каждый процесс представлен в операционной системе набором данных, называемых process control block . В process control block процесс описывается набором значений, параметров, характеризующих его текущее состояние и используемых операционной системой для управления прохождением процесса через компьютер. При управлении процессами операционная система использует два основных типа информационных структур: дескриптор процесса (структура proc) и контекст процесса (структура user). Дескриптор процесса содержит такую информацию о процессе, которая необходима ядру в течение всего жизненного цикла процесса, независимо от того, находится ли он в активном или пассивном состоянии, находится ли образ процесса в оперативной памяти или выгружен на диск. Дескрипторы отдельных процессов объединены в список, образующий таблицу процессов. Память для таблицы процессов отводится динамически в области ядра. На основании информации, содержащейся в таблице процессов, операционная система осуществляет планирование и синхронизацию процессов. В дескрипторе прямо или косвенно (через указатели на связанные с ним структуры) содержится информация о состоянии процесса, расположении образа процесса в оперативной памяти и на диске, о значении отдельных составляющих приоритета, а также его итоговое значение - глобальный приоритет, идентификатор пользователя, создавшего процесс, информация о родственных процессах, о событиях, осуществления которых ожидает данный процесс и некоторая другая информация. Контекст процесса содержит менее оперативную, но более объемную часть информации о процессе, необходимую для возобновления выполнения процесса с прерванного места: содержимое регистров процессора, коды ошибок выполняемых процессором системных вызовов, информацию о всех открытых данным процессом файлов и незавершенных операциях ввода-вывода (указатели на структуры file) и другие данные, характеризующие состояние вычислительной среды в момент прерывания. Контекст, так же как и дескриптор процесса, доступен только программам ядра, то есть находится в виртуальном адресном пространстве операционной системы, однако он хранится не в области ядра, а непосредственно примыкает к образу процесса и перемещается вместе с ним, если это необходимо, из оперативной памяти на диск. В UNIX для процессов предусмотрены два режима выполнения: привилегированный режим - "система" и обычный режим - "пользователь". В режиме "пользователь" запрещено выполнение действий, связанных с управлением ресурсами системы, в частности, корректировка системных таблиц, управление внешними устройствами, маскирование прерываний, обработка прерываний. В режиме "система" выполняются программы ядра, а в режиме "пользователь" - оболочка и прикладные программы. При необходимости выполнить привилегированные действия пользовательский процесс обращается с запросом к ядру в форме так называемого системного вызова. В результате системного вызова управление передается соответствующей программе ядра. С момента начала выполнения системного вызова процесс считается системным. Таким образом, один и тот же процесс может находиться в пользовательской и системной фазах. Эти фазы никогда не выполняются одновременно. В данных версиях UNIX процесс, работающий в режиме системы, не мог быть вытеснен другим процессом. Из-за этого организация ядра, которое составляет привилегированную общую часть всех процессов, упрощалась, т.к. все функции ядра не были реентерабельными. Однако, при этом реактивность системы страдала - любой процесс, даже низкоприоритетный, войдя в системную фазу, мог оставаться в ней сколь угодно долго. Из-за этого свойства UNIX не мог использоваться в качестве ОС реального времени. В более поздних версиях, и в SVR4 в том числе, организация ядра усложнилась и процесс можно вытеснить и в системной фазе, но не в произвольный момент времени, а только в определенные периоды его работы, когда процесс сам разрешает это сделать установкой специального сигнала. В SVR4 имеется несколько процессов, которые не имеют пользовательской фазы, например, процесс pageout, организующий выталкивание страниц на диск. Порождение процессов Порождение процессов в системе UNIX происходит следующим образом. При создании процесса строится образ порожденного процесса, являющийся точной копией образа породившего процесса. Сегмент данных и сегмент стека отца действительно копируются на новое место, образуя сегменты данных и стека сына. Процедурный сегмент копируется только тогда, когда он не является разделяемым. В противном случае сын становится еще одним процессом, разделяющим данный процедурный сегмент. После выполнения системного вызова fork оба процесса продолжают выполнение с одной и той же точки. Чтобы процесс мог опознать, является ли он отцом или сыном, системный вызов fork возвращает в качестве своего значения в породивший процесс идентификатор порожденного процесса, а в порожденный процесс NULL. Типичное разветвление на языке C записывается так: if( fork() ) { действия отца } else { действия сына } Идентификатор сына может быть присвоен переменной, входящей в контекст процесса-отца. Так как контекст процесса наследуется его потомками, то дети могут узнать идентификаторы своих старших братьев, так образом сумма знаний наследуется при порождении и может быть распространена между родственными процессами. Наследуются все характеристики процесса, содержащиеся в контексте. На независимости идентификатора процесса от выполняемой процессом программы построен механизм, позволяющий процессу придти к выполнению другой программы с помощью системного вызова exec. Таким образом в UNIX порождение нового процесса происходит в два этапа - сначала создается копия процесса-родителя, то есть дублируется дескриптор, контекст и образ процесса. Затем у нового процесса производится замена кодового сегмента на заданный. Вновь созданному процессу операционная система присваивает целочисленный идентификатор, уникальный за весь период функционирования системы. Ядро (операционной системы) - программа, функцией которой является управление базовыми объектами системы (для UNIX-а это два объекта - файл и процесс). Ядро в своем теле размещает необходимые таблицы данных. Ядро считается некоторой неразделяемой частью ОС. Оно обычно работает в режиме супервизора, все остальные функции ОС могут работать и в других режимах. - центральная часть операционной системы, обеспечивающая приложениям координированный доступ к ресурсам компьютера, таким как процессорное время, оперативная память, внешнее оборудование. Обычно предоставляет сервисы файловой системы. 1 Типы архитектур ядер операционных систем 1.1 Монолитное ядро 1.2 Модульное ядро 1.3 Микроядро 1.4 Экзоядро 1.5 Гибридное ядро Типы архитектур ядер операционных систем Монолитное ядро - предоставляет богатый набор абстракций оборудования. Все части монолитного ядра работают в одном адресном пространстве. Старые монолитные ядра требовали перекомпиляции при любом изменении состава оборудования. Большинство современных ядер позволяют во время работы подгружать модули, выполняющие части функции ядра. Достоинства: Скорость работы, упрощённая разработка модулей. Недостатки: Поскольку всё ядро работает в одном адресном пространстве, сбой в одном из компонентов может нарушить работоспособность всей системы. Примеры: Традиционные ядра UNIX, такие как BSD; Linux; MS-DOS. Модульное ядро - современная, усовершенствованная модификация архитектуры монолитных ядер операционных систем компьютеров. В отличие от <классических> монолитных ядер, считающихся ныне устаревшими, модульные ядра, как правило, не требуют полной перекомпиляции ядра при изменении состава аппаратного обеспечения компьютера. Вместо этого модульные ядра предоставляют тот или иной механизм подгрузки модулей ядра, поддерживающих то или иное аппаратное обеспечение (например, драйверов). При этом подгрузка модулей может быть как динамической (выполняемой <на лету>, без перезагрузки ОС, в работающей системе), так и статической (выполняемой при перезагрузке ОС после переконфигурирования системы на загрузку тех или иных модулей). Все модули ядра работают в адресном пространстве ядра и могут пользоваться всеми функциями, предоставляемыми ядром. Поэтому модульные ядра продолжают оставаться монолитными. Модульные ядра удобнее для разработки, чем традиционные монолитные ядра, не поддерживающие динамическую загрузку модулей, так как от разработчика не требуется многократная полная перекомпиляция ядра при работе над какой-либо его подсистемой или драйвером. Выявление, локализация, отладка и устранение ошибок при тестировании также облегчаются. Модульные ядра предоставляют особый программный интерфейс (API) для связывания модулей с ядром, для обеспечения динамической подгрузки и выгрузки модулей. В свою очередь, не любая программа может быть сделана модулем ядра: на модули ядра накладываются определённые ограничения в части используемых функций (например, они не могут пользоваться функциями стандартной библиотеки С/С++ и должны использовать специальные аналоги, являющиеся функциями API ядра). Кроме того, модули ядра обязаны экспортировать определённые функции, нужные ядру для правильного подключения и распознавания модуля, для его корректной инициализации при загрузке и корректного завершения при выгрузке, для регистрации модуля в таблице модулей ядра и для обращения из ядра к сервисам, предоставляемым модулем. Не все части ядра могут быть сделаны модулями. Некоторые части ядра всегда обязаны присутствовать в оперативной памяти и должны быть жёстко "вшиты" в ядро. Также не все модули допускают динамическую подгрузку (без перезагрузки ОС). Степень модульности ядер (количество и разнообразие кода, которое может быть вынесено в отдельные модули ядра и допускает динамическую подгрузку) различна в различных архитектурах модульных ядер. Ядра Linux в настоящее время имеют более модульную архитектуру, чем ядра *BSD (FreeBSD, NetBSD, OpenBSD). Общей тенденцией развития современных модульных архитектур является всё большая модуларизация кода (повышение степени модульности ядер), улучшение механизмов динамической подгрузки и выгрузки, уменьшение или устранение необходимости в ручной подгрузке модулей или в переконфигурации ядра при изменениях аппаратуры путём введения тех или иных механизмов автоматического определения оборудования и автоматической подгрузки нужных модулей, универсализация кода ядра и введение в ядро абстрактных механизмов, предназначенных для совместного использования многими модулями (примером может служить VFS - <виртуальная файловая система>, совместно используемая многими модулями файловых систем в ядре Linux). [править] Микроядро Основная статья: Микроядро Микроядро предоставляет только элементарные функции управления процессами и минимальный набор абстракций для работы с оборудованием. Бо?льшая часть работы осуществляется с помощью специальных пользовательских процессов, называемых сервисами. Достоинства: Устойчивость к сбоям оборудования, ошибкам в компонентах системы. Недостатки: Передача данных между процессами требует накладных расходов. Примеры: QNX; Mach, используемый в GNU/Hurd и Mac OS X; AIX; Minix ; ChorusOS ; AmigaOS; MorphOS. [править] Экзоядро Основная статья: Экзоядро [править] Гибридное ядро Гибридные ядра это модифицированные микроядра, позволяющие для ускорения работы запускать <несущественные> части в пространстве ядра. Имеют <гибридные> достоинства и недостатки. Примеры: Windows NT, DragonFly BSD. Ядро? Ядро в ботанике - внутренняя часть плодов и семян, заключённая в твёрдую оболочку. Ядро (атома) в ядерной физике - центральная часть атома, имеющая положительный заряд, в которой сосредоточена практически вся его масса. ядро (клетки) в биологии - органелла клетки у многих одноклеточных и всех многоклеточных организмов. По наличию или отсутствию в клетках оформленного ядра все организмы делят соответственно на эукариот и прокариот. Ядро планеты в науках о Земле и о планетах - центральная часть планет, обладающая высокой плотностью. См ядро Земли. Пушечное ядро - старинный оружейный снаряд в виде шарообразного литого (первоначально каменного) тела. Во второй половине XIX века в связи с заменой гладкоствольных орудий нарезными ядра вышли из употребления. Спортивное ядро - в лёгкой атлетике - снаряд для толкания. Ядро в нейрофизиологии (лат. nucleus, мн. ч. nuclei) - скопление серого вещества в определённом участке ЦНС, обеспечивающее выполнение определённых функций. Примеры: вентралатеральные ядра таламуса, медиодорсальное ядро, красное ядро, хвостатое ядро. Ядро (операционной системы) в компьютерах - основная программа операционной системы. Обеспечивает управление аппаратной частью компьютера, распределение ресурсов, управление процессами, поддержку файловых систем, управление памятью и т. п. Ядро в абстрактной алгебре: Ядро гомоморфизма, см. Словарь терминов теории групп Ядро линейного отображения, см. линейное отображение Ядро в переносном значении - глубинная сущностная часть чего-либо, суть, основа. Например, ядро теории, учения, ядро проблемы. Ядро в переносном значении - основная, важная часть какого-либо коллектива, организации, группы. Например, ядро разведывательного отряда, ядро организации. Ядро в обобщённом смысле - внутренняя, центральная часть чего-либо. Например, ядро кометы и т. д