Разработка ядра Linux | страница 42
>CLONE_FILES
и >CLONE_SIGHAND
, так как большинство потоков пространства ядра должны указывать эти флаги в параметре >flags
.Чаще всего поток пространства ядра продолжает выполнять свою функцию вечно (или, по крайней мере, до перегрузки системы, но когда она произойдет в случае ОС Linux- неизвестно). Функция потока обычно содержит замкнутый цикл, в котором поток пространства ядра по необходимости возобновляет выполнение, исполняет свои обязанности и снова переходит в приостановленное состояние.
В следующих главах более детально будут рассмотрены конкретные примеры потоков пространства ядра.
Завершение процесса
Как это ни грустно, но любой процесс в конечном итоге должен завершиться. Когда процесс завершается, ядро должно освободить ресурсы, занятые процессом, и оповестить процесс, который является родительским для завершившегося, о том, что его порожденный процесс, к сожалению, "умер".
Обычно уничтожение процесса происходит тогда, когда процесс вызывает системный вызов >exit()
явно или неявно при выходе из главной функции программы (компилятор языка С помещает вызов функции >exit()
после возврата из функции >main()
). Процесс также может быть завершен непроизвольно. Это происходит, когда процесс получает сигнал или возникает исключительная ситуация, которую процесс не может обработать или проигнорировать. Независимо от того, каким образом процесс завершается, основную массу работы выполняет функция >do_exit(),
а именно указанные далее операции.
• Устанавливается флаг >PF_EXITING
в поле >flags
структуры >task struct
.
• Вызывается функция >del_timer_sync()
, чтобы удалить все таймеры ядра. После выхода из этой функции гарантируется, что нет никаких ожидающих таймеров и никакой обработчик таймера не выполняется.
• Если включена возможность учета системных ресурсов, занятых процессами (BSD process accounting), то вызывается функция >acct_process()
для записи информации об учете ресурсов, которые использовались процессом.
• Вызывается функция >__exit_mm()
для освобождения структуры >mm_struct
, занятой процессом. Если эта структура не используется больше ни одним процессом (другими словами, не является разделяемой), то она освобождается совсем.
• Вызывается функция >exit_sem()
. Если процесс находится в очереди ожидания на освобождение семафора подсистемы IPC, то в этой функции процесс удаляется из этой очереди.
• Вызываются функции >__exit_files()
, >__exit_fs()
, >exit_namespace()
и >exit_signals()