Дескриптор процесу і структура task structure

Ядро зберігає інформацію про всі процеси в двохзвязної списку, який називається task list3  (Список задач) Кожен елемент цього списку є дескриптором процесу і має тип структури struc t task_struct, яка описана у файлі include / linux / schedh Дескриптор процесу містить всю інформацію про певний процесі

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

3 Іноді в літературі п про побудову ю Операційні х систем це т список називається tas k arra y (масив задач) Оскільки в ядрі Linux використовується звязаний список, а не статичний масив, його називають  task     list

i

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

Виділення дескриптора процесу

Память для структури task_struc t виділяється за допомогою підсистеми виділення памяті, яка називається слябової розподільник (slab allocator), для можливості повторного використання обєктів і розфарбовування кеша (cache coloring) (див главу 11, Управління памяттю) У ядрах до серії 26 структура task_struc t зберігалася в кінці стека ядра кожного процесу Це дозволяє для апаратних платформ, у яких досить мало регістрів процесора (як, наприклад, платформа х86), обчислювати місцеположення дескриптора процесу, тільки знаючи значення регістра покажчика стека (stack pointer), без використання додаткових регістрів для зберігання самого адреси цього місця розташування Так як тепер дескриптор процесу створюється за допомогою слябової розподільника, була введена нова структура thread_info, яка зберігається в області дна стека (для платформ, у яких стек росте в бік зменшення значення адреси памяті) або в області вершини стека (для платформ, у яких стек росте у бік збільшення значення адреси памяті) 4 (рис 32)

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процесса

Рис 32 Дескриптор процесу і стек ядра

Структура struct thread_info для платформи х86 визначена у файлі

thread_infoh> в наступному вигляді

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 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*