Читать «Разработка ядра Linux» онлайн - страница 36
Роберт Лав
Потоки в пространстве ядра
Часто в ядре полезно выполнить некоторые операции в фоновом режиме. В ядре такая возможность реализована с помощью mm
для них равно NULL
). Эти потоки работают только в пространстве ядра, и их контекст не переключается в пространство пользователя. Тем не менее потоки в пространстве ядра планируются и вытесняются так же, как и обычные процессы.
В ядре Linux потоки пространства ядра выполняют определенные задания, наиболее часто используемые, — это
int kernel_thread(int (*fn)(void*), void* arg, unsigned long flags);
Новая задача создается с помощью обычного системного вызова clone()
с соответствующими значениями флагов, указанными в параметре flags. При возврате из системного вызова родительский поток режима ядра завершается и возвращает указатель на структуру task_struct
порожденного процесса. Порожденный процесс выполняет функцию, адрес которой указан в параметре fn
, в качестве аргумента этой функции передается параметр arg
. Для указания обычных флагов потоков пространства ядра существует флаг CLONE_KERNEL
, который объединяет в себе флаги CLONE_FS
, CLONE_FILES
и CLONE_SIGHAND
, так как большинство потоков пространства ядра должны указывать эти флаги в параметре flags
.
Чаще всего поток пространства ядра продолжает выполнять свою функцию вечно (или, по крайней мере, до перегрузки системы, но когда она произойдет в случае ОС Linux- неизвестно). Функция потока обычно содержит замкнутый цикл, в котором поток пространства ядра по необходимости возобновляет выполнение, исполняет свои обязанности и снова переходит в приостановленное состояние.
В следующих главах более детально будут рассмотрены конкретные примеры потоков пространства ядра.
Завершение процесса
Как это ни грустно, но любой процесс в конечном итоге должен завершиться. Когда процесс завершается, ядро должно освободить ресурсы, занятые процессом, и оповестить процесс, который является родительским для завершившегося, о том, что его порожденный процесс, к сожалению, "умер".