Системные вызовы выполняются в вызывающем процессе, который лишь переходит в привилегированное состояние.
Выделенный процесс для обработки прерываний от устройств отсутствует, поэтому все такого рода прерывания обрабатываются в контексте прерванного процесса.
Механизм прерываний гарантирует их обработку в привилегированном режиме.
Пользовательский процесс никогда не блокируется непосредственно: он делает это либо после попытки выполнения ввода или вывода, либо в результате вызова для взаимодействия с другим процессом, причем в обоих случаях сначала входит в ядро.
Процесс должен войти в ядро и для того, чтобы завершить свою работу.
4. Распределение памяти процессов UNIX (рис. 14.9)
Рис. 14.9. Распределение памяти процессов UNIX
На рис. 14.9показана схема адресных пространств двух процессов.
У каждого из процессов имеется собственное логическое адресное пространство.
Обычно адресное пространство процесса разделено на две части.
- В одной из них резидентно располагается ядро UNIX, которое для каждого процесса находится по одним и тем же логическим адресам. Диспетчер памяти блокирует доступ по этим адресам, когда процесс выполняется в пользовательском режиме.
- Другая часть адресного пространства предназначена собственно для процесса. При переключении контекста вся она может откачиваться на диск с целью освобождения памяти для других процессов.
Доступная пользовательскому коду часть адресного пространства делится на три логических сегмента:
- текст (программный код),
- данные
- и стек.
Сегмент текста защищен от записи и может использоваться совместно с другими процессами для выполнения общей программы.
Сегменты стека и данных приватны для процесса.
Эти сегменты называются логическими, поскольку каждый из них занимает непрерывную область логического адресного пространства процесса, однако на практике при использовании страничного управления памятью они нередко располагаются в физической памяти отдельными фрагментами и даже могут быть выгружены на диск.
При компиляции исходного кода программы формируется виртуальное адресное пространство процесса. При этом для каждого из сегментов предусматривается свой диапазон виртуальных адресов. В 32-х разрядных операционных системах, где максимально допустимый размер адресуемой памяти составляет 4 ГБ, виртуальное адресное пространство делится на т.н. квадранты, имеющие размер 1 ГБ каждый. Первый квадрант содержит сегмент кода, второй – сегмент данных, третий и четвертый – разделяемую память, разделяемые библиотеки и файлы, отображаемые на память. Таким образом, начальные виртуальные адреса для каждого из сегментов фиксированы.
В UNIX адресное пространство процесса состоит из регионов. Регион это логическое понятие, обозначающее непрерывный диапазон виртуальных адресов процесса, который может рассматриваться как самостоятельный объект с точки зрения защиты или совместного использования. Обычно сегменты загружаются в отдельные регионы. Так любой процесс состоит из регионов кода, данных и стека, кроме того дополнительно могут быть созданы специальные регионы разделяемой памяти, памяти отображаемой на файл и т.д. Для каждого региона в отдельности можно указать права доступа по чтению, чтению-записи и чтению-исполнению.
Регион может находиться в исключительном пользовании одного процесса или совместно использоваться несколькими. Разделение региона данных происходит только по прямому указанию пользователя и при явном взаимном согласии обоих процессов Регион - понятие логическое, они должны каким-то образом отображаться на физическое адресное пространство. Если бы регионы отображались в непрерывные диапазоны физических адресов памяти, возникала бы проблема фрагментации, поэтому регион отображается на некоторую совокупность страниц памяти. Это означает, что для каждого региона существует свое оглавление - список страниц, образующих его адресное пространство.
Каждый процесс хранит в своем контексте таблицу регионов процесса с указанием виртуальных адресов начала региона, его длины и атрибутов доступа к региону: право чтения, записи и чтения-исполнения. Кроме того для каждого региона хранится ссылка на таблицу размещения региона в памяти
Таким образом, в UNIX применена многоуровневая система отображения адресного пространства процесса сначала на регион, затем на страницы фиксированного размера и лишь последние отображены на физическую память компьютера.