Контексты выполнения кода ядра Linux - PullRequest
3 голосов
/ 02 июля 2011

Когда процесс, выполняющийся в пользовательском пространстве, выдает system call или запускает exception, он входит в пространство ядра и ядро ​​начинает выполняться от имени процесса. Говорят, что ядро ​​выполняется в process context. Аналогично, когда происходит прерывание, ядро ​​выполняется в interrupt context. Я изучал выполнение ядра в kernel thread, где процессы ядра выполняются в фоновом режиме.

Мои вопросы:

  1. Работает ли ядро ​​в каких-либо других контекстах?

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

Ответы [ 2 ]

3 голосов
/ 02 июля 2011

Ядро запускается периодически, оно устанавливает таймер для запуска прерывания с некоторой предопределенной частотой (100 Гц (Linux 2.4 / x86), 1000 Гц (ранняя версия Linux 2.6 / x86), 250 Гц (более поздняя версия Linux 2.6 / x86)).

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

Обратите внимание, что предпринимаются определенные усилия для оптимизации использования этого таймера: более новый Linux умнее, когда нет выполняемых задач, он устанавливает таймер в будущем настолько далеко, насколько это возможно, чтобы процессор мог спать дольше и глубжеи сохранить энергию (опция конфигурации ядра CONFIG_NOHZ).Запуск powertop покажет количество пробуждений в секунду, которое в неактивной системе может быть намного меньше, чем 250 пробуждений в секунду, которые вы ожидаете от традиционной реализации.

0 голосов
/ 02 июля 2011

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

Предположим, у вас есть процесс p, который выполняет следующий код: while(1);. Этот код никогда не вызовет ядро ​​и не вызовет никаких сбоев. ( может установить alarm(3) ранее, что приведет к доставке сигнала в будущем, или оно может превысить предел setrlimit(2) ЦП, в этом случае ядро ​​доставит сигнал процессу .)

Или, если другой процесс отправит p сигнал через kill(2), ядро ​​также доставит этот сигнал процессу.

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

И, конечно, выполнение процесса может быть прервано, чтобы процессор мог обрабатывать прерывания; или процесс с более высоким приоритетом может выгрузить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...