Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Акуленок_часть1.doc
Скачиваний:
41
Добавлен:
13.11.2019
Размер:
1.43 Mб
Скачать

2.1.2. Структура ядра

Итак, ядро содержит системные программы для решения задач администрирования, переконфигурирования и поддержки файловой системы, в частности:

  • для настройки параметров конфигурации системы;

  • для перекомпоновки ядра (если она необходима) и добавления новых драйверов устройств;

  • для создания и удаления учетных записей пользователей;

  • создания и подключения физических файловых систем;

  • установки параметров контроля доступа к файлам.

Для решения этих задач системное программное обеспечение (работающее в пользовательском режиме) часто использует системные вызовы.

Условно ядро можно представить в виде нескольких тесно взаимодействующих компонент (рис. 2.2):

Рис. 2.2. Структура ядра

  • распределение системных ресурсов;

  • поддержка файловой системы;

  • контроль доступа к компьютеру;

  • управление памятью.

Наиболее подробно структура ядра представлена на рис. 2.3.

Можно выделить три основные подсистемы:

  • файловая подсистема;

  • подсистема управления процессами и памятью;

  • подсистема ввода/вывода.

Функции ядра доступны через интерфейс системных вызовов. Системные вызовы обеспечивают:

  • сопоставление действий пользователя с запросами драйверов устройств;

  • создание и прекращение процессов;

  • реализацию операций ввода–вывода;

  • доступ к файлам и дискам;

  • поддержку функций терминала.

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

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

Рис. 2.3. Подсистемы ядра

2.1.3. Файловая подсистема

Файловая подсистема обеспечивает унифицированный интерфейс доступа к данным, расположенным на дисковых накопителях, и к периферийным устройствам. Одни и те же функции ореn(), read(), write() могут использоваться как при чтении или записи данных на диск, так и при выводе текста на принтер или терминал.

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

Файловая подсистема обеспечивает перенаправление запросов, адресованных периферийным устройствам, соответствующим модулям подсистемы ввода/вывода.

2.1.4. Подсистема управления процессами

Запущенная на выполнение программа порождает в системе один или более процессов. Подсистема управления процессами контролирует:

  • создание и удаление процессов;

  • распределение системных ресурсов (памяти, вычислительных ресурсов) между процессами;

  • синхронизацию процессов;

  • межпроцессное взаимодействие.

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

Модуль планировщика процессов или распределитель (scheduler) разрешает конфликты между процессами в конкуренции за системные ресурсы (процессор, память, устройства ввода/вывода). Планировщик запускает процесс на выполнение, следя за тем, чтобы процесс монопольно не захватил разделяемые системные ресурсы. Наиболее распространенным алгоритмом планирования в системах разделения времени является кольцевой режим (round robin). Основной смысл алгоритма состоит в том, что время процессора делится на кванты фиксированного размера, а процессы, готовые к выполнению, выстраиваются в кольцевую очередь. У этой очереди имеются два указателя – начала и конца. Когда процесс, выполняющийся на процессоре, исчерпывает свой квант процессорного времени, он снимается с процессора, ставится в конец очереди, а ресурсы процессора отдаются процессу, находящемуся в начале очереди. Если выполняющийся процесс откладывается (например, по причине обмена с некоторым внешним устройством) до того, как он исчерпает свой квант, то после повторной активизации он становится в конец очереди (не смог доработать – не вина системы). Это схема разделения времени в случае, когда все процессы одновременно помещаются в оперативной памяти.

Однако ОС UNIX всегда была рассчитана на то, чтобы обслуживать больше процессов, чем можно одновременно разместить в основной памяти. Другими словами, часть процессов, потенциально готовых выполняться, размещалась во внешней памяти (куда образ памяти процесса попадал в результате своппинга). Поэтому требовалась несколько более гибкая схема планирования разделения ресурсов процессора. В результате было введено понятие приоритета. В ОС UNIX значение приоритета определяет, во–первых, возможность процесса пребывать в основной памяти и на равных конкурировать за процессор. Во–вторых, от значения приоритета процесса, вообще говоря, зависит размер временного кванта, который предоставляется процессу для работы на процессоре при достижении своей очереди. В–третьих, значение приоритета, влияет на место процесса в общей очереди процессов к ресурсу процессора.

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

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

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

Если ядро выгружает процессы на устройства выгрузки целиком, такая реализация системы UNIX называется системой со свопингом (подкачкой); если же на устройство выгрузки выводятся страницы памяти, такая система называется системой с замещением страниц.

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

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