Архитектура операционных систем. Понятие ядра и процесса. Состояния и контекст процесса.
Структура UNIX - два слоя. Первый - ядро, взаимодействует с железом и обеспечивает переносимость всего остального ПО на компьютеры с разным аппаратным обеспечением. Ядро предоставляет программам определенный набор системных API, а также файловый ввод/вывод. Вторым слоем является программное обеспечение, прикладное или системное: командный интерпретатор, графическая оболочка и т. д
Заглянем глубже в ядро системы. Оно позволяет всем остальным программам общаться с периферийными устройствами, регулирует доступ к файлам, управляет память и процессами. Ядро - это связной, к которому обращаются посредством системных вызовов (запрашивая какую-то услугу). Основным достоинством ядра является строгая стандартизация системных API. За счет этого во многом достигается переносимость кода между разными версиями и различным аппаратным обеспечением
Все обращения к ядру системы можно разделить на две категории: программа вызывает подсистему управления файлами или подсистему управления процессами. Первая отвечает за все, что связано с файлами: управление, размещение, доступ. Процессы же - это, в общем случае, любые запущенные программы. Поэтому подсистема управления процессами служит для их жизнеспособности, синхронизации и управления.
ПРОЦЕССЫЯдро существует для обеспечения потребностей процессов. Программа в терминах UNIX представляет собой исполняемый файл. Это основа построения контекста процесса при его порождении. Порождение любого процесса в UNIX - это создание некоторой виртуальной машины. Она имеет свое собственное адресное пространство, куда помещаются процедурный сегмент и сегмент данных. Системные данные, используемые ядром для идентификации процесса, которые существуют в течении всего времени жизни процесса, образуют дескриптор (описатель) процесса. Множество дескрипторов образуют таблицу процессов.
Любой процесс в UNIX порождается с помощью системного вызова fork. После выполнения fork оба процесса продолжают выполнение с одной и той же точки.
Состояние процесса.У процесса есть 9 состояний:
1. Процесс выполняется в режиме задачи. 2. Процесс выполняется в режиме ядра. 3. Процесс не выполняется, но готов к запуску под управлением ядра. 4. Процесс приостановлен и находится в оперативной памяти. 5. Процесс готов к запуску, но программа подкачки должна загрузить его в оперативную память прежде чем он будет запущен под управлением ядра. 6. Процесс приостановлен, и программа подкачки выгрузила его во внешнюю память. 7. Процесс возвращён из режима ядра в режим задачи, ядро резервирует его. 8. Процесс вновь создан и находится в переходном состоянии. 9. Процесс существует, но не готов к выполнению, хотя и не приостановлен. 10. Процесс вызывает системную функцию exit и прекращает существование.
Контекст процесса
Системные данные, используемые при выполнении процесса (когда его образ загружен в RAM), составляют контекст процесса. Контекст процесса формально описан структурой struct user в файле /usr/include/sys/user.h. Эта структура включает следующие основные поля:
• u_procp - адрес дескриптора процесса в таблице процессов;
• u_ofile - адрес таблицы открытых файлов процесса;
• u_signal - адрес таблицы сигналов;
• u_pcb - блок управления процессом;
• u_cdir - текущий каталог процесса;
• u_rdir - корневой каталог процесса;
• u_textvaddr - виртуальный адрес процедурного сегмента;
• u_datavaddr - виртуальный адрес сегмента инициализированных данных;
• u_bssvaddr - виртуальный адрес сегмента неинициализированных данных.
Область контекста процесса имеет фиксированный размер и не входит в виртуальное адресное пространство процесса. В пространстве физических адресов контекст процесса располагается перед процедурным сегментом или перед сегментом данных в случае разделяемого процедурного сегмента. Контекст текущего процесса отображается в область текущего процесса виртуального адресного пространства ядра. Адрес этой области сохраняет системная переменная u, через которую поля контекста текущего процесса доступны подпрограммам ядра. Доступ к полям контекста процесса на уровне пользователя реализован через системные вызовы ядра, например, chdir, chroot, signal, ulimit.