Створення процесів системні виклики forkQ, vforkQ та cloneQ

1191 if (!IS_ERR(p))

1192 struct completion vfork; 1193

1194 if (clone_flags & CLONE_VFORK)

1199 if ( (p->ptrace & PT_PTRACED) (clone_flags & CLONE_STOPPED))

1204 set_tsk_thread_flag(p, TIF_SIGPENDING);

Рядок 1189

Тут виконується перевірка помилок покажчиків. Якщо ми виявляємо помилку у покажчиках, ми повертаємо помилку покажчика без виконання подальших дій.

Рядки 1194-1197

Тут виконується перевірка того, що do_f ork() була викликана з vfork(). Якщо це так, виконуються специфічні для vfork() дії.

Рядки 1199-1205

Якщо батько відстежується або клонування встановлено в режим CLONE_STOPPED, дочірній процес отримує сигнал SIGSTOP до початку виконання і тому запускається відразу в зупиненому стані.

1207 if (!(clone_flags & CLONE_STOPPED))

1222 wake__up_forked_process (p);

1224 int cpu = get_cpu(); 1225

1226 p-state = TASK_STOPPED;

1227 if (!(clone_flags & CLONE_STOPPED))

1228 wake_up_forked_process(p); /* робиться в останню чергу */

1229 ++ total_forks; 1230

1231 if (unlikely (trace))

1233 ptrace_notify ((trace «8) SIGTRAP);

Глава 3 • Процеси: принципова модель виконання

1236 if (clone_flags & CLONE_VFORK)

1238 if (unlikely (current->ptrace & PT_TRACE__VFORK_DONE) )

1239 ptrace_notify ((PTRACE_EVENT_VFORK_DONE «8) SIGTRAP) ;

1250 return pid; 1251>

Рядки 1226-1299

У цьому блоці ми встановлюємо стан завдання TASK_STOPPED. Якщо прапор CLONE_STOPPED у clone_f lags невстановлений, ми будимо дочірній процес. В іншому випадку ми залишаємо його чекати сигналу пробудження.

Рядки 1231-1234

Якщо для батька встановлено ptracing, ми надсилаємо повідомлення.

Рядки 1236-1239

Якщо здійснюється виклик vf ork (), тут блокується батько і надсилається повідомлення про початок стеження. Це реалізується за допомогою приміщення батька в чергу очікування, де він залишається в стані TASK_UNINTERRUPTIBLE до того моменту, як дочірній процес викликає exit() або execve().

Рядок 1248

Для поточного завдання (батька) встановлюється need_resched. Це дозволяє дочірньому процесу запуститись першим.

Життєвий цикл процесу

Тепер, коли ми розглянули, яким чином процес створюється, нам слід побачити, що відбувається протягом його життя. За цей час процес може побувати у різних станах. Перехід між цими станами залежить від виконуваних процесом дій і від характеру сигналів, що встановлюються. Наша програма-приклад може знаходитись у станах TASK_INTERRUPTIBLE та TASK__RUNNING (поточний стан).

3.4 Життєвий цикл процесу

ня, в яке встановлюється процес, - це TASK_ZOMBIE, під час виклику do_exit(). Давайте розглянемо різні стани процесів та способи переходу між цими станами. Ми розглянемо, як наш процес переходить із одного стану в інший.

Стани процесу

Коли процес виконується, це означає, що його контекст завантажений в регістри процесора і в пам'ять, а програма, що визначається контекстом, виконується. У кожний момент часу процес може не виконуватися з різних причин. Процес може не мати можливості продовжувати роботу через очікування введення, яке невідбувається, або планувальник може вирішити, що він виконувався протягом максимально дозволеного часу, і це може стопорити інший процес. Процес вважається готовим, коли він не виконується, але може бути виконаний (після перепланування) або блокований, коли очікує на введення.

Мал. 3.10 показує абстрактні стани процесу та перераховує можливі стани завдання в Linux, що відповідають кожному стану. Табл. 3.5 розкриває чотири переходи та показує, як вони здійснюються. Табл. 3.6 пов'язує абстрактні стани зі значеннями, які використовуються в ядрі Linux для позначення цих станів.