Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Создание процессов: системные вызовы forkQ, vforkQ и cloneQ





1191 if (! IS_ERR(p)) {

1192 struct completion vfork;
1193

1194 if (clone_flags & CLONE_VFORK) {

1195 p-> vfork_done = & vfork;

1196 init_completion(& vfork);

1197 }
1198

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();
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)) {

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 для обозначения этих состояний.

 

 

 

 

 

 

 

 

 

 

           
  Процесс готов A Процесс выполняется    
В  
  TASK.RUNNING TASK.RUNNING    
   
  > С     D    
    ч г    
  Процесс заблокирован TASKJNTERRUPTIBLE TASKJJNINTERRUPTIBLE TASK.ZOMBIE TASK.STOPPED    
           
                   

Рис. 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, подпадающими под основные категории перехо­дов процесса.


Жизненный цикл процесса



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

               
      TASK.RUNNING  
    Е < -----
  TASK.ZOMBIE   F Т Т А Т В
  с D [ т I    
   
  т   I TASKJJNINTERRUPTIBLE  
  TASK.ST0PPED  
и ^- т  
       
Г TASKJNTERRUPTIBLE  
J
     
               

Рис. 3.11. Переход между состояниями задачи

Таблица 3.7. Краткий перечень переходов задачи


Начальное состояние задачи Linux


Конечное состояние задачи Linux


Агент перехода


 


TASK__RUNNING TASK_RUNNING TASK_RUNNING TASK RUNNING

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

TASK RUNNING


Процесс входит в очередь ожидания

Процесс входит в очередь ожидания

Процесс получает сигнал SIGSTOP или процесс отслеживается

Процесс убит, но родитель не вызвал sys_wait4 ()

В течение получения сигнала

В течение пробуждения

Процесс получает ожидаемый ресурс.

Процесс получает ожидаемый ресурс или установлен на выполнение в результате полученного сигнала

Выключен и включен планировщиком



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


Готовность к выполнению

Абстрактный переход между состояниями процесса «готовность к выполнению» не соот­носится с существующими переходами между состояниями Linux, потому что это состоя­ние не изменяется (остается в TASK_RUNNING). Тем не менее процесс переходит из очереди готовности в состояние выполнения (очередь выполнения), когда он действи­тельно выполняется на процессоре.

TASK_RUNNING в TASK_RUNNING

Linux не имеет специального состояния для различения задачи, выполняемой на про­цессоре в данный момент, и задачи, остающейся в состоянии TASK_RUNNING, даже когда задача перемещается из очереди и его контекст выполняется. Планировщик выбирает задачу из очереди выполнения. Гл. 7 описывает, как планировщик выбирает следующую задачу для установки на выполнение.


Поделиться:



Популярное:

  1. Вопрос № 7 Экономический рост и национальное богатство. Внесистемные показатели объема национального производства: чистое экономическое благосостояние и индекс развития человеческого потенциала.
  2. Воссоздание земных поселений
  3. Вставка и работа с графическими объектами в Microsoft Word. Создание и работа с графическими надписями WordArt
  4. ГК РФ Статья 106.2. Создание производственного кооператива и его устав
  5. ГЛАВА 20 УПРАВЛЕНИЕ ПРОИЗВОДСТВОМ: СОЗДАНИЕ ОПЕРАЦИОННОЙ СИСТЕМЫ
  6. Глава 6 СОЗДАНИЕ ПРИБЫЛЬНЫХ ОБЪЯВЛЕНИЙ
  7. Глава 9. Паранормальное изменение и создание биологических форм
  8. ГЛАВА VIII. СОЗДАНИЕ УСЛОВИЙ ДЛЯ РАЗВИТИЯ И ДУХОВНО-ЦЕННОСТНОЙ ОРИЕНТАЦИИ ЧЕЛОВЕКА В ВОСПИТАТЕЛЬНЫХ ОРГАНИЗАЦИЯХ
  9. Главная цель государственного регулирования в сфере экономики - создание наилучших условий для развития экономики и предпринимательства на конкретной стадии развития общества.
  10. Инструментарий пробуждающего: создание якоря для состояния «аптайм»
  11. Использование и создание формул
  12. Лабораторная работа № 12. Создание форм для ввода данных в таблицы Microsoft Access


Последнее изменение этой страницы: 2016-03-25; Просмотров: 741; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.028 с.)
Главная | Случайная страница | Обратная связь