что такое реентерабельное ядро - PullRequest
26 голосов
/ 22 июля 2009

Что такое реентерабельное ядро?

Ответы [ 4 ]

23 голосов
/ 22 июля 2009

Намного проще ответить:

Повторный вход в ядро ​​

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

Возвращающееся ядро ​​позволяет процессам (или, точнее, их соответствующим потокам ядра) отдавать ЦП в режиме ядра. Они не мешают другим процессам также переходить в режим ядра. Типичный вариант использования - IO wait. Процесс хочет прочитать файл. Это вызывает функцию ядра для этого. Внутри функции ядра у контроллера диска запрашиваются данные. Получение данных займет некоторое время, и функция заблокирована в течение этого времени. При использовании повторно входящего ядра планировщик будет назначать ЦП другому процессу (потоку ядра) до тех пор, пока прерывание от контроллера диска не покажет, что данные доступны и наш поток можно возобновить. Этот процесс все еще может получить доступ к IO (для которого нужны функции ядра), например, к вводу пользователя Система остается отзывчивой, а затраты времени процессора из-за ожидания ввода-вывода сокращаются.

Это в значительной степени стандарт для современных настольных операционных систем.

Выгрузка ядра

Приоритет ядра не влияет на общую пропускную способность системы. Вместо этого он стремится к лучшему реагированию.

Идея заключается в том, что обычно функции ядра прерываются только по аппаратным причинам: либо внешние прерывания, либо случаи ожидания ввода-вывода, когда он добровольно передает управление планировщику. Вместо этого упреждающее ядро ​​также прерывает и приостанавливает функции ядра, как если бы оно прерывало процессы в пользовательском режиме. Система более отзывчива, например, процессы. обрабатывая ввод мыши, просыпаются, даже когда в ядре выполняется тяжелая работа.

Приоритет на уровне ядра усложняет работу разработчика ядра: функция ядра не может быть приостановлена ​​только добровольно или обработчиками прерываний (которые в некоторой степени являются контролируемой средой), но также и любым другим процессом из-за планировщика. Необходимо соблюдать осторожность, например, избегать взаимоблокировок: поток блокирует ресурс A, но нуждающийся в ресурсе B прерывается другим потоком, который блокирует ресурс B, но затем нуждается в ресурсе A.

Возьмите мое объяснение упреждения с помощью крупицы соли. Я рад любым исправлениям.

11 голосов
/ 22 июля 2009

Все ядра Unix являются реентерабельными. Это означает, что несколько процессов могут выполняться в режиме ядра одновременно. Конечно, в однопроцессорных системах может выполняться только один процесс, но многие могут быть заблокированы в режиме ядра при ожидании ЦП или завершении какой-либо операции ввода-вывода. Например, после выдачи чтения на диск от имени процесса ядро ​​позволяет контроллеру диска обрабатывать его и возобновляет выполнение других процессов. Прерывание уведомляет ядро, когда устройство удовлетворило чтение, поэтому предыдущий процесс может возобновить выполнение.

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

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

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

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

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

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

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

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

Эта информация доступна на http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html

Подробнее о http://linux.omnipotent.net/article.php?article_id=12496&page=-1

3 голосов
/ 22 июля 2009

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

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

Реентерирующее ядро ​​обеспечивает лучшую производительность, поскольку для ядра нет contention . Ядро, которое не является реентерабельным, должно использовать lock , чтобы убедиться, что никакие два процесса не выполняют код ядра одновременно.

1 голос
/ 04 сентября 2013

Повторяемая функция - это функция, которая может использоваться несколькими задачами одновременно, не опасаясь повреждения данных. И наоборот, не входящая функция - это функция, которая не может совместно использоваться более чем одной задачей, если взаимное исключение функции не обеспечивается либо с помощью семафора, либо путем отключения прерываний во время критических участков кода. Функция повторного входа может быть прервана в любое время и возобновлена ​​в более позднее время без потери данных. Реентерабельные функции либо используют локальные переменные, либо защищают свои данные при использовании глобальных переменных.

Функция повторного входа:

Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions
...