Основная задача ядра - управление ресурсами компьютера и управления их доступностью другим программам для запуска и использования. Как правило, основными ресурсами ядра являются:
- ЦП. Это - центральная часть компьютерной системы, отвечает за функционирование и выполнение программ. Ядро берет на себя ответственность за принятие решений о числе процессорного времени, выделяемого для запущенных программ.
- Память компьютера. Память используется для хранения команд и данных программы. Как правило, оба эти элемента должны быть в памяти для возможности выполнения программы. Часто несколько программ запрашивают доступ к памяти, иногда они требуют больше памяти, чем у компьютера. Именно ядро отвечает за решение о предоставлении соответствующего количества памяти каждому процессу и что делать, когда памяти не достаточно.
- Любые устройства ввода / вывода (I / O), подключенные к компьютеру, такие как клавиатура, мышь, дисководы, принтеры, мониторы и тому подобное. Ядро выделяет возможность запроса от приложений для выполнения операций ввода / вывода соответствующего устройства и предоставляет пользователю удобные абстракции основных функций устройства.
Ключевые аспекты, необходимые для управления ресурсами является определение домена выполнения (адресного пространства), а также механизма защиты, который используется для работы с доступом к ресурсам домена. Ядра также обычно предоставляют методы для синхронизации и взаимодействия между процессами (так механизм межпроцессорного взаимодействия или IPC). Ядро может выполнять эти функции самостоятельно или полагаться на некоторые процессы, которые запускаются им для обеспечения условий для других процессов, хотя в этом случае ядро должно предоставить некоторые средства IPC, чтобы позволить этим специальным процессам доступ к внутренней структуре прикладных процессов. Наконец, ядро должно обеспечить запущенные программы методами, которые позволяют делать запросы на доступ к этим объектам.
Управление процессами
Основной задачей ядра является возможность выполнения программ и их поддержка с помощью аппаратных абстракций. Процесс определяет, к каким частям памяти может получить доступ приложение. (Для этого раздела приложения, процесс и программа используются как синонимы). Управление процессами в ядре должен учитывать встроенные аппаратные средства для защиты памяти.
Для запуска программы ядро обычно определяет адресное пространство для процессов, загружает код в память, готовит стек для программы и начинает выполнение программного кода в заданном месте.
Многозадачность ядра позволяет давать пользователю иллюзию того, что число процессов, которые могут одновременно работать на компьютере больше, чем максимальное число процессов, которые компьютер физически способен одновременно выполнять. Как правило, максимальное количество одновременных процессов в системе равно количеству процессоров.
В вытесняющей многозадачности, ядро предоставляет каждому процессу некоторое фиксированное количество времени, при этом быстро переключаясь между каждым процессом так, что у пользователя возникает ощущение одновременности выполнения этих процессов. Количество времени, которое выделяется для каждого процесса, определяется с помощью алгоритма планирования выполнения задач. Этот алгоритм также определяет приоритетность выполнения процессов. Ядро обычно предоставляет этим процессам некоторый интерфейс для взаимодействия между собой: так называемые средства взаимодействия между процессами, а основными подходами является разделяющая память, обмен сообщениями и вызов удаленных процедур.
Другие операционные системы (в частности на меньших, менее мощных компьютерах) могут использовать кооперативную многозадачность, где каждый процесс выполняется непрерывно до тех пор, пока этот процесс не пошлет специальный запрос к ядру, что дает разрешение на начало выполнения другого процесса. Старые версии Windows и Mac OS использовали кооперативную многозадачность, но в конечном итоге, с ростом мощности компьютеров, они перешли на вытесняющую многозадачность.
Операционная система также может иметь поддержку многопроцессорности ; в этом случае программы и нити могут выполняться на разных процессорах. Для этого ядро должно быть повторно используемым, что означает возможность запуска двух или более частей кода одновременно.
Управление памятью
Ядро имеет полный доступ к системной памяти и предоставляет процессам безопасный доступ к ней в случае необходимости. Зачастую первым шагом для достижения этого является создание виртуальной памяти, обычно это достигается с помощью файла подкачки и сегментной адресации памяти. Виртуальная адресация позволяет ядру сделать определенный физический адрес видимой под другим виртуальным адресом. Пространства виртуальных адресов могут быть различными для различных процессов; память, к которой имеет доступ один процесс под виртуальным адресом, может иметь совсем другой виртуальный адрес в пространстве другого процесса. Это позволяет абстрагировать разные процессы друг от друга, что предотвращает использование одного участка памяти различными процессами.
На многих системах виртуальный адрес может ссылаться на еще несуществующие данные. Слой абстракции, снабженный виртуальной адресацией, позволяет операционной системе использовать другие накопители данных, такие как жесткие диски или флэш-память. В результате операционная система позволяет использовать больше памяти, чем физически есть на компьютере.
Виртуальное адресование также позволяет создание виртуальных разделов памяти в двух разделенных областях, одна из которых зарезервирована для ядра, а вторая для приложений (пространство пользователя). Приложения не имеют возможности доступа к памяти пространства ядра, что достигается использованием специальных защитных механизмов в ЦП.
Управление устройствами
Для выполнения полезных функций, ядру нужно иметь доступ к периферийным устройствам, которые руководствуются им при помощи драйверов. Например, для того, чтобы показать на экране, программа сначала посылает запрос к ядру, которое перенаправляет его к драйверу видеокарты, который ответственен за фактическое отражение пикселей.
Ядро должно сохранять список всех имеющихся устройств. Этот список может быть известен заранее (например, во встроенных системах, где ядро ??переписывается каждый раз при смене аппаратного обеспечения), настроенный пользователем (чаще на старых системах или системах, которые не предназначены для персонального пользования) или найден операционной системой во время выполнения.
В системах plug and play менеджер устройств сначала сканирует различные порты, а затем пытается распознать подключенные устройства, и найти для них нужный драйвер.
Реализация управления устройствами очень отличается в разных операционных системах, но, во всяком случае, ядро ??должно предоставить интерфейс ввода / вывода, чтобы позволить драйверам иметь доступ напрямую к устройству, через какой порт или участок памяти.
Системные вызовы
Чтобы действительно выполнить нужную работу, процесс должен иметь доступ к службам, предоставляемым ядром. Реализация этого интерфейса разная в каждом ядре, но большинство ядер содержит библиотеку на C и программный интерфейс к ней, которая в свою очередь обращается к функциям ядра. Метод, с помощью которого осуществляется обращение к ядру, очень варьируется в зависимости от реализации. Если применяется изоляция памяти, то пользовательский процесс не имеет прямого доступа к ядру, так как это было бы нарушением правил доступа центрального процессора. Среди существующих методов выделяются:
- Использование симулированного программного прерывания. Этот метод доступен на большинстве аппаратных платформ, а потому очень распространен.
- Использование шлюз вызова. Шлюз вызова - специальный адрес в памяти ядра, в месте, известном процессору. Когда процессор замечает обращение к этому адресу, он вместо этого перенаправляет его в целевое место без нарушения доступа. Такой метод требует аппаратной поддержки, но аппаратное обеспечение для него достаточно распространенное.
- Использование специальной инструкции системного вызова. Этот способ требует специфически аппаратной поддержки, которой может не быть в популярных архитектурах (в особенности x86). Инструкции системных вызовов все же были добавлены к современным моделям процессоров x86 и много операционных систем их активно используют.
- Использование очереди в памяти. Программа, которая делает большое количество запросов, но не нуждается в ожидании результата каждого из них, может добавлять эти запросы в специальный участок оперативной памяти, которая периодически сканируется ядром.