Разработка ядра Linux
Шрифт:
а вызов
Флаги, которые передаются в системный вызов
Таблица 3.1. Флаги системного вызова clone
Флаг | Описание |
---|---|
CLONE_FILES | Родительский и порожденный процессы совместно используют открытые файлы |
CLONE_FS | Родительский и порожденный процессы совместно используют
|
CLONE_IDLETASK | Установить значение PID в нуль (используется только для холостых (idle) задач) |
CLONE_NEWNS | Создать новое пространство имен для порожденной задачи |
CLONE_PARENT | Родительский процесс вызывающего процесса становится родительским и для порожденного |
CLONE_PTRACE | Продолжить трассировку и для порожденного процесса |
CLONE_SETTID | Возвратить значение идентификатора TID в пространство пользователя |
CLONE_SETTLS | Для порожденного процесса создать новую область локальных данных потока (thread local storage, TLS) |
CLONE_SIGHAND | У порожденного и родительского процессов будут общие обработчики сигналов |
CLONE_SYSVSEM | У родительского и порожденного процессов будет общая семантика обработки флага SEM_UNDO для семафоров System V |
CLONE_THREAD | Родительский и порожденный процессы будут принадлежать одной группе потоков |
CLONE_VFORK | Использовать vfork : родительский процесс будет находиться а приостановленном состоянии, пока порожденный процесс не возобновит его работу |
CLONE_UNTRACED | Запретить родительскому процессу использование флага CLONE_PTRACE для порожденного процесса |
CLONE_STOP | Запустить процесс в состоянии TASK_STOPPED |
CLONE_CHILD_CLEARTID | Очистить идентификатор TID для порожденного процесса |
CLONE_CHILD_SETTID | Установить идентификатор TID для порожденного процесса |
CLONE_PARENT_SETTID | Установить идентификатор TID для родительского процесса |
CLONE_VM | У порожденного и родительского процессов будет общее адресное пространство |
Потоки в пространстве ядра
Часто в ядре полезно выполнить некоторые операции в фоновом режиме. В ядре такая возможность реализована с помощью потоков пространства ядра (kernel thread) — обычных процессов, которые выполняются исключительно в пространстве ядра. Наиболее существенным отличием между потоками пространства ядра и обычными процессами является то, что потоки в пространстве ядра не имеют адресного пространства (значение указателя
В ядре Linux потоки пространства ядра выполняют определенные задания, наиболее часто используемые, — это pdfush и ksoftirq. Эти потоки создаются при загрузке системы другими потоками пространства ядра. В действительности поток в пространстве ядра может быть создан только другим потоком, работающим в пространстве ядра. Интерфейс для запуска нового потока в пространстве ядра из уже существующего потока следующий:
Новая задача создается с помощью обычного системного вызова
Чаще всего поток пространства ядра продолжает выполнять свою функцию вечно (или, по крайней мере, до перегрузки системы, но когда она произойдет в случае ОС Linux- неизвестно). Функция потока обычно содержит замкнутый цикл, в котором поток пространства ядра по необходимости возобновляет выполнение, исполняет свои обязанности и снова переходит в приостановленное состояние.
В следующих главах более детально будут рассмотрены конкретные примеры потоков пространства ядра.
Завершение процесса
Как это ни грустно, но любой процесс в конечном итоге должен завершиться. Когда процесс завершается, ядро должно освободить ресурсы, занятые процессом, и оповестить процесс, который является родительским для завершившегося, о том, что его порожденный процесс, к сожалению, "умер".
Обычно уничтожение процесса происходит тогда, когда процесс вызывает системный вызов
• Устанавливается флаг
• Вызывается функция
• Если включена возможность учета системных ресурсов, занятых процессами (BSD process accounting), то вызывается функция
• Вызывается функция
• Вызывается функция
• Вызываются функции
• Устанавливается код завершения задания, который хранится в поле
• Вызывается функция
• Вызывается функция
Исходный код функции
К этому моменту освобождены все объекты, занятые задачей (если они используются только этой задачей). Задача больше не может выполняться (действительно, у нее больше нет адресного пространства, в котором она может выполняться), а кроме того, состояние задачи —