Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Создание процессов: системные вызовы forkQ, vforkQ и cloneQ
1191 if (! IS_ERR(p)) { 1192 struct completion vfork; 1194 if (clone_flags & CLONE_VFORK) { 1195 p-> vfork_done = & vfork; 1196 init_completion(& vfork); 1197 } 1199 if ( (p-> ptrace & PT_PTRACED) || (clone_flags & CLONE_STOPPED)) { 1203 sigaddset(& p-> pending.signal, SIGSTOP); 1204 set_tsk_thread_flag(p, TIF_SIGPENDING); 1205 } Строка 1189 Здесь выполняется проверка ошибок указателей. Если мы обнаруживаем ошибку в указателях, мы возвращаем ошибку указателя без выполнения дальнейших действий. Строки 1194-1197 Здесь выполняется проверка того, что do_f ork () была вызвана из vfork (). Если это так, выполняются специфичные для vfork () действия. Строки 1199-1205 Если родитель отслеживается или клонирование установлено в режим CLONE_ STOPPED, дочерний процесс получает сигнал SIGSTOP до начала выполнения и поэтому запускается сразу в остановленном состоянии. kernel/fork.с 1207 if (! (clone_flags & CLONE_STOPPED)) { 1222 wake__up_forked_process (p); 1223 } else { 1224 int cpu = get_cpu(); 1226 p-> state = TASK_STOPPED; 1227 if (! (clone_flags & CLONE_STOPPED)) 1228 wake_up_forked_process(p); /* делается в последнюю очередь */ 1229 ++total_forks; 1231 if (unlikely (trace)) { 1232 current~> ptrace_message = pid; 1233 ptrace_notify ((trace « 8) | SIGTRAP); 1234 } Глава 3 • Процессы: принципиальная модель выполнения 1236 if (clone_flags & CLONE_VFORK) { 1237 wait_for_completion(& vfork); 1238 if (unlikely (current-> ptrace & PT_TRACE__VFORK_DONE) ) 1239 ptrace_notify ( (PTRACE_EVENT_VFORK_DONE « 8) | SIGTRAP); 1240 } else 1248 set__need_resched (); 1249 } 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 (текущее состояние). Первое состояние процесса - TASK__INTERRUPTIBLE. Это происходит при создании процесса в функции copy_process (), которая вызывается do_f ork (). Второе состояние процесса - TASK_RUNNING устанавливается перед выходом из do_f ork (). Эти два состояния гарантированно присутствуют в жизни любого процесса. Следом за этими состояниями процесс может оказаться еще в двух состояниях. Последнее состоя- 3.4 Жизненный цикл процесса ние, в которое устанавливается процесс, - это TASK_ZOMBIE, во время вызова do_exit (). Давайте рассмотрим различные состояния процессов и способы перехода между этими состояниями. Мы рассмотрим, как наш процесс переходит из одного состояния в другое. Состояния процесса Когда процесс выполняется, это значит, что его контекст загружен в регистры процессора и в память, а определяемая контекстом программа выполняется. В каждый момент времени процесс может не выполнятся по самым различных причинам. Процесс может не иметь возможности продолжать работу по причине ожидания ввода, который не происходит, или планировщик может решить, что он выполнялся в течение максимально разрешенного времени, и это может стопорить другой процесс. Процесс считается готовым, когда он не выполняется, но может быть выполнен (после перепланировки) или блокирован, когда ожидает ввода. Рис. 3.10 показывает абстрактные состояния процесса и перечисляет возможные состояния задачи в Linux, соответствующие каждому состоянию. Табл. 3.5 раскрывает четыре перехода и показывает, как они осуществляются. Табл. 3.6 связывает абстрактные состояния со значениями, используемыми в ядре Linux для обозначения этих состояний.
Рис. 3.10. Переходы между состояниями процесса Таблица 3.5. Краткий перечень переходов Переход Агент перехода Готов - выполняется (А) Выбран планировщиком Выполняется - готов (В) Временной отрезок кончился (неактивен). Процесс приостановлен (активен) Глава 3 • Процессы: принципиальная модель выполнения Таблица 3.5. Краткий перечень переходов (Окончание) Заблокирован - готов (С) Поступают сигналы. Ресурс становится доступным Выполняется - заблокирован (D) Процесс спит или чего-то ожидает Таблица 3.6. Связь флагов Linux с абстрактными состояниями процесса Абстрактное состояние Состояние задачи Linux Готов TASK_RUNNING Выполняется TASK_RUNNING Заблокирован TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE TASK_ZOMBIE TASK_STOPPED ПРИМЕЧАНИЕ. Состояние set_current_process () может быть установлено, если имеется прямой доступ к настройке структуры задачи: current-> state = TASK_INTERRUPTIBLE. Вызов set__current_process (TASK_INTERRUPTIBLE) даст тот же эффект. Переход между состояниями процесса Теперь мы рассмотрим типы событий, которые заставляют процесс переходить из одного состояния в другое. Абстрактные процессы перехода (см. табл. 3.5) включают переход из состояния ожидания в состояние выполнения, переход из состояния выполнения в состояние готовности, переход из заблокированного состояния в состояние готовности и переход из состояния выполнения в заблокированное состояние. Каждый переход может переводить в более чем один переход между различными состояниями задач Linux. Например, переход из блокированного состояния в выполняемое может происходить из одного из четырех состояний задач Linux: TASK_INTERRUPTIBLE, TASK_ZOMBIE, TASK_UNINTERRUPTIBLE или TASK_STOPPED в состояние TASK_RUNNING. Рис. 3.11 и табл. 3.7 описывают эти переходы. Теперь мы опишем различные переходы между состояниями применительно к переходам между состояниями задачи Linux, подпадающими под основные категории переходов процесса. Жизненный цикл процесса
Рис. 3.11. Переход между состояниями задачи Таблица 3.7. Краткий перечень переходов задачи Начальное состояние задачи Linux Конечное состояние задачи Linux Агент перехода
TASKJJNINTERRUPTIBLE TASK_INTERRUPTIBLE TASK_STOPPED TASK_ZOMBIE TASK_INTERRUPTIBLE TASK_STOPPED TASK_UNINTERRUPTIBLE TASK_STOPPED TASK_UNINTERRUPTIBLE TASK_RUNNING TASK INTERRUPTIBLE TASK_RUNNING
TASK RUNNING Процесс входит в очередь ожидания Процесс входит в очередь ожидания Процесс получает сигнал SIGSTOP или процесс отслеживается Процесс убит, но родитель не вызвал sys_wait4 () В течение получения сигнала В течение пробуждения Процесс получает ожидаемый ресурс. Процесс получает ожидаемый ресурс или установлен на выполнение в результате полученного сигнала Выключен и включен планировщиком Глава 3 • Процессы: принципиальная модель выполнения Готовность к выполнению Абстрактный переход между состояниями процесса «готовность к выполнению» не соотносится с существующими переходами между состояниями Linux, потому что это состояние не изменяется (остается в TASK_RUNNING). Тем не менее процесс переходит из очереди готовности в состояние выполнения (очередь выполнения), когда он действительно выполняется на процессоре. TASK_RUNNING в TASK_RUNNING Linux не имеет специального состояния для различения задачи, выполняемой на процессоре в данный момент, и задачи, остающейся в состоянии TASK_RUNNING, даже когда задача перемещается из очереди и его контекст выполняется. Планировщик выбирает задачу из очереди выполнения. Гл. 7 описывает, как планировщик выбирает следующую задачу для установки на выполнение. Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 741; Нарушение авторского права страницы