Ядро и процессы.

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

     Основные функциональные затраты при работе программ ядра приходится именно на работу с таблицами. К ним относятся таблицы процессов, программного текста файлов, индексных дескрипторов файлов, связи драйвер и другие. Программная секция ядра в свою очередь состоит из двух частей: диспетчера процессов и диспетчера внешних устройств. Диспетчер процессов управляет процессами, в его функцию входят: определение последовательности процессов; обработка системы – вызовов; распределение ресурсов системы. Эта часть ядра является независимой и практически не изменяется при переносе о.с. с одной вычислительной машины, на другую.

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

В каждый момент времени процессор ЭВМ может находится в одной из 3-х состояний .

    • Работать в состоянии “система” если выполняются команды ядра;
    • Работать в состоянии “процесс” если выполняются команды пользовательского процесса;
    • Работать в состоянии “ожидания” если в системе нет процессов, готовых к выполнению.

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

    • Прерывание по таймеру;
    • Обработка системного вызова;
    • Прерывание от ввода-вывода.

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

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

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

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

     Процесс может находиться в одном из трех состояний: активном, готовом или блокированным (ожидания).

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

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

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

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

Контекст процесса

Процедурный сегмент

Сегмент данных

Динамический сегмент

Рис. 1.1 Структура пользовательского процесса.

     Контекст процесса - эта некоторая таблица, в которой хранится системная информация о процессе при его нахождении в основной памяти. Контекст процесса подвергается свопингу совместно с процедурным сегментом и сегментом данных.

     Процедурный сегмент- содержит команды процесса и их константы. В Unix все процедурные сегменты являются рентабельными. Процедурный сегмент и сегмент данных составляет образ процесса. Он формирует трансляцию программ, как совокупность двух указанных составных частей. Однако, задав при трансляции специальный параметр, если создадим образ процесса с разделяемым процедурным сегментом и сегментом данных, тогда процедурный сегмент будем называть чистым кодом. Чистый код хранит в своей памяти одну копию процедурного сегмента, она будет разделяться всеми процессами, а сегмент данных для каждого процесса будет свой. Например, интерпретатор shell.

     Создать новый процесс можно с помощью системного вызова fork. Порожденный процесс наследует все характеристики порождающего процесса. Приостановить работу можно с помощью системного вызова wait, до наступления события указанного в вызове, чтобы прейти к выполнению новой программы, через системный вызов ехес, следовательно, инициализация новой программы Unix – это практически всегда пара системных вызовов fork и exec.

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

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

     Менее важная, но более емкая информация хранится в контексте процессора, расположено в адресном пространстве ядра. Таблица процессов и контекст процесса взаимно дополняют друг друга. Их разделение необходимо в целях минимизации объёма ядра.

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

     Взаимодействие между процессами Unix осуществляется на логическом и информационном уровнях. На логическом уровне взаимодействие процессов происходит только через ядро системы, с использованием механизма сигналов. Ядро каждого процесса модулирует систему прерываний.

 

     Информационное взаимодействие между процессами осуществляется 3-мя способами:

  • Через передачу внешних аргументов (в пределах одного процесса);
  • Через файловую систему;
  • Через программный канал.

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