Управление процессами.

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

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

Сегмент текста   Доступно пользователю     Область процесса     3 Гб
Сегмент данных
Сегмент стека
Стек ядра  
Область данных процесса  
Ядро Unix Общая область   1 Гб

Ядро Unix всегда находится по одним и тем адресам, диспетчер блокирует их, когда процесс выполняется в пользовательском режиме. Доступная пользователю адресная часть делится на 3 части: сегмент текста, сегмент данных, сегмент стека.

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

Сегмент данных содержит переменные, строки, массивы, другие данные программы, может модифицироваться.

Сегмент стека служит для хранения временных данных. Когда программа запускается, её стек уже не пуст, содержит переменные окружения, а также командную строку, введенную при вызове программы.

Каждый процесс может иметь свою область в области данных ядра. Здесь хранятся записи об открытых дескрипторах файла, о том, сколько времени ЦП использовал процесс, как процесс должен реагировать на каждый вид сигнала и т.д. Здесь же хранятся таблицы страниц, которые содержат сведения о размещении страниц памяти процесса.

Система управления памятью позволяет выполняться процессам, которые больше полной емкости ОЗУ компьютера. Для этого она делит области ОЗУ на страницы. Размер страницы устанавливается равным размеру блока диска.

В ОС Unix традиционно выполняются 2 системных процесса init и swapper. Все остальные процессы являются дочерними от init. Любой новый процесс создается с помощью вызова fork ( ). В ответ на вызов Unix создает новое адресное пространство с полной копией содержимого адресного пространства родительского процесса, а затем в адресное пространство с помощью системного вызова execve ( ) может быть загружено для выполнения программы. Таким образом обновляется сегмент текста и данных.

 

23 мая 2012 г.