Ядро Linux: В каком процессе запускается schedule ()? - PullRequest
3 голосов
/ 05 декабря 2011

Когда вы вызываете системный вызов, такой как fork в процессе X, ядро ​​считается выполняющимся в контексте процесса. Итак, можно сказать, что fork работает в процессе X, верно?

Но если schedule() вызывается (и это не вызов sys) в том же процессе, вы бы сказали, что он работает как часть X? Или это работает в процессе подкачки? Или это звучит абсурдно, учитывая монолитную природу ядра?

Ответы [ 4 ]

6 голосов
/ 05 декабря 2011

schedule() всегда выполняется в контексте процесса. Особенность в том, что он может изменить текущий контекст процесса, но он всегда имеет контекст процесса. До вызова context_switch() он запускается в контексте процесса, подлежащего замене, и после запуска в процессе заменяется.

В ядре Linux нет выделенной задачи «подкачки» (есть простоя задача, которая всегда выполняется, если больше ничего не подходит для запуска).

3 голосов
/ 05 декабря 2011

Это действительно зависит от того, откуда сделан вызов schedule(); schedule() может вызываться как из контекста процесса, так и из рабочей очереди. Рабочие очереди представляют собой потоки, запланированные ядром:

# ps auxw | grep worker
root      1378  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/1:0]
root      1382  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/2:0]
root      1384  0.0  0.0      0     0 ?        S    20:45   0:00 [kworker/3:1]
...

[..] означает, что процессы не выполняются в пространстве пользователя.

Функция worker_thread() вызывает schedule() после обработки рабочего элемента, но перед повторным запуском.

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

0 голосов
/ 05 декабря 2011

Q: Итак, можно сказать, что fork работает в процессе X, верно?

A: Да, абсолютно. Системный вызов, с помощью которого процесс ПРОСИТ «форк», происходит в пространстве пользователя. Акт системного вызова TRANSITIONS из пространства пользователя в пространство ядра. ОСУЩЕСТВЛЕНИЕ системного вызова может включать в себя множество отдельных этапов. Некоторые могут происходить в пространстве пользователя; другие шаги происходят в пространстве ядра.

В: ... с учетом монолитной природы ядра?

A: Проблема "пользовательского пространства" против "пространства ядра" абсолютно НИЧЕГО не имеет отношения к тому, является ли ядро ​​"монолитным", "микроядром" или чем-то еще полностью.

0 голосов
/ 05 декабря 2011

Планировщик заботится обо всех процессах, поэтому не запускается внутри одного процесса.

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

Вы не можете видеть все ядро ​​как запущенное для процессов (только системные вызовы).

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