Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой ОС / РГР Открытое ПО / РГР Открытое ПО.doc
Скачиваний:
45
Добавлен:
15.06.2014
Размер:
268.8 Кб
Скачать

3 Сравнение ядер

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

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

3.1.1 Linux

Процесс в Linux (как и в UNIX) – это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, автоматически создается процесс, в котором выполняется оболочка (shell), например, /bin/bash.

В Linux поддерживается классическая схема мультипрограммирования. Linux поддерживает параллельное выполнение процессов пользователя. Каждый процесс выполняется в собственном виртуальном адресном пространстве, т.е. процессы защищены друг от друга и крах одного процесса никак не повлияет на другие выполняющиеся процессы и на всю систему в целом. Один процесс не может прочитать что-либо из памяти (или записать в нее) другого процесса без «разрешения» на то другого процесса. Санкционированные взаимодействия между процессами допускаются системой.

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

В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить – это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.

Для создания процессов используются два системных вызова: «fork()» и «exec». «fork()» создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса – основной и порожденный. Функция «fork()» возвращает «0» в порожденном процессе и PID (Process ID – идентификатор порожденного процесса) – в основном. PID – это целое число.

Теперь можно запустить программу с помощью вызова «exec». Параметрами функции «exec» является имя выполняемого файла и, если нужно, параметры, которые будут переданы этой программе. В адресное пространство порожденного с помощью «fork()» процесса будет загружена новая программа и ее выполнение начнется с точки входа (адрес функции main).

3.1.2 FreeBsd

BSD, так же как и Linux, поддерживает многозадачность. ВBSDтакже внедрен механизм нитей и потоков управления. Каждая задача или выполняющийся поток называется процессом. Контекст процесса BSD состоит из состояния пользовательского уровня, включая содержимое его адресного пространства и окружения времени выполнения, и состояния уровня ядра, в который включаются параметры планировщика задач, управляющие ресурсы и идентифицирующая информация. В контекст включается все, что используется ядром при предоставлении своих сервисов процессу. Пользователи могут создавать процессы, управлять их выполнением и получать уведомления при изменении состояния выполнения процессов. Каждому процессу, как и вLinux, назначается уникальное число, называемое идентификатором процесса (PID). Это число используется ядром для идентификации процесса при сообщении пользователю об изменении его состояния, и пользователем для указания процесса в системном вызове.

Ядро создает процесс, дублируя контекст другого процесса. Новый процесс считается порожденным процессом исходного родительского процесса. Контекст, копируемый в ходе создания процесса, включает как состояние выполнения процесса уровня пользователя, так и системное состояние процесса, управляемое ядром. В целом можно сказать, что создание процесса в BSDиLinuxидентично.

В системе определен набор сигналов, которые могут быть отправлены процессу. Сигналы в BSD сделаны по образу аппаратных прерываний. Процесс может определить пользовательскую подпрограмму, которая будет являться обработчиком, и которой должен будет перенаправляться сигнал. Когда сигнал генерируется, он блокируется от повторного появления до тех пор, пока не будет перехвачен обработчиком. Перехват сигнала включает в себя сохранение контекста текущего процесса и построение нового, в котором запускается обработчик. Затем сигнал направляется обработчику, который может либо прервать процесс, либо передать управление обратно выполняемому процессу (может быть, после установки значения глобальной переменной). Если обработчик возвратил управление, сигнал разблокируется и может быть сгенерирован (и получен) снова.

Некоторые сигналы не могут быть перехвачены или проигнорированы. К таким сигналам относятся SIGKILL, прерывающий неуправляемый процесс, и сигнал управления заданиями SIGSTOP. Все сигналы имеют один и тот же приоритет. Если обработки ожидают несколько сигналов, то порядок их направления процессу зависит от реализации.

Соседние файлы в папке РГР Открытое ПО