Главная » Ядро Linux » Дескриптор процесса и структура task structure

0

Ядро хранит  информацию о всех процессах в двухсвязном списке, который называется task list3  (список задач). Каждый элемент этого списка является дескриптором процесса и имеет тип структуры  struc t  task_struct , которая описана в файле include/linux/sched.h . Дескриптор процесса содержит всю  информацию об определенном процессе.

2 В ядр е реализован системный вызов  wait4() . В операционно й  системе  Linux  через  библиотеку функций языка  С доступны  функции wait() ,  waitpid() ,  wait3( )  и  wait4() .  Все эти  функции возвращают информацию о состоянии завершившегося процесса, хотя в несколько разной  семантике.

3 Иногда в литературе  п о построени ю операционны х систем  это т список  называется   tas k   arra y (массив  задач).  Поскольку в ядре Linux  используется связанный список, а не статический массив, его  называют  task     list .

i

Структура  task_struc t — достаточно большая структура  данных  размером порядка  1,7 Кбайт  на 32-разрядной машине. Однако этот размер  не такой  уж большой, учитывая, что в данной структуре  содержится вся  информация о процессе, которая необходима ядру. Дескриптор процесса содержит данные, которые описывают выполняющуюся программу, — открытые файлы, адресное пространство процесса, ожидающие  на обработку  сигналы, состояние процесса и многое  другое (рис.  3.1).

Выделение дескриптора процесса

Память для  структуры  task_struc t  выделяется с помощью подсистемы выделения памяти, которая называется слябовый распределитель (slab  allocator), для возможности  повторного использования объектов и раскрашивания кэша  (cache  coloring) (см. главу 11, "Управление памятью"). В ядрах  до серии  2.6 структура  task_struc t хранилась в конце  стека ядра каждого  процесса. Это позволяет для аппаратных платформ, у которых  достаточно мало регистров процессора (как, например, платформа х86), вычислять местоположение дескриптора процесса, только  зная  значение регистра указателя стека (stack pointer), без использования дополнительных регистров для хранения самого  адреса этого местоположения. Так как теперь дескриптор процесса  создается с помощью слябового распределителя, была введена  новая  структура thread_info , которая хранится в области  дна стека  (для  платформ, у которых  стек растет в сторону уменьшения значения адреса памяти) или в области  вершины стека (для  платформ, у которых  стек растет  в сторону  увеличения значения адреса  памяти)4 (рис. 3.2.).

struct task struct

struct task_struct struct task_struct

structtask struct

Дескриптор  процесса

unsigned  long  state;

int prio;

unsigned long policy;

struct task_struct *parent; struct list_head tasks; pid_t   pid;

Список задач (task list)

Рис.  З.1.  Дескриптор   процесса и список  задач

4Причиной создания структуры thread_info было не только наличие аппаратных платформ, обедненных регистрами процессора, но и то, что положение этой структуры позволяет достаточно просто рассчитыпать смешения адресов для значений ее нолей при использовании языка ассемблера.

Стек ядра процесса

Начало стека

Наибольшее значение адреса памяти

Указатель стека

current_thread_infо()

Структура struct thread_infо

Наименьшее значение адреса

Структура  thread_infо содержит указатель на дескриптор процесса

Структура struct task_structпроцесса

Рис 3.2. Дескриптор   процесса  и  стек  ядра

Структура struct thread_info для платформы х86 определена в файле <asm/

thread_info.h > в следующем виде.

struct thread_info {

struct task_struct      *task;

struct exec_domain      *exec_domain; unsigned long           flags; unsigned long          status;

  u32                   cpu;

  s32                  preempt_count; mm_segment_t            addr_limit; struct restart_block    restart_block; unsigned long           previous_esp;

__u8                   supervisorytack[0];

};

Для каждой  задачи ее структура thread_info хранится в конце  стека ядра этой задачи. Элемент структуры thread_info с именем tas k является указателем на структуру task_struct этой задачи.

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии