Может ли поток или процесс пространства ядра быть дочерним по отношению к процессу пользовательского пространства?

Решено :это код (весь код см. в моем вопросе выше ):Exec=thunderbird -compose "attachment='$ (echo %F | sed 's/\ \//,\/\//g' )',to=[некоторая учетная запись],subject=[ некоторая тема],body=arrivo :$ (date "+%x")\n partenza :,from=[some account]"

1
15.08.2020, 19:17
1 ответ

Потоки ядра — это потоки, работающие постоянно в режиме ядра.

введите команду ps -efl. Вы узнаете эти потоки ядра по тому факту, что их имена заключены в квадратные скобки. И, обратив внимание на идентификатор родительского процесса, вы заметите, что большинство из них являются сыновьями PID 2 ([kthreadd] ), другие — сыновьями PID 1 (init[3])

Так что, по сути, ответ на ваш вопрос :нет!

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

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


РЕДАКТИРОВАТЬ :После интересного комментария от @Stephen Kitt:

Хотя верно, что init будет коммутировать в пространство пользователя, по существу, с самого начала (ядро ​​инициализирует )не что иное, как аутентичный поток ядра. (о.г. не "обычный процесс")Поток ядра, который должен быть создан первым (, чтобы получить PID=1 ), но создаст kthreads, если он будет запланирован до kthreadd.

Нам просто нужно заглянуть в код (init/main.c)

static noinline void __ref rest_init(void){
...
rcu_scheduler_starting();
...
pid = kernel_thread(kernel_init, NULL, CLONE_FS);
... 
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
1
18.03.2021, 23:12

Теги

Похожие вопросы