O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

Оно должно знать, например, приоритет процесса, выполняется ли он процессором или блокирован в ожидании какого-то события, какое ему присвоено адресное пространство, к каким файлам ему разрешено обращаться и т. д. Для этой цели служит дескриптор процесса, структура типа task struct, поля которой содержит всю информацию, касающуюся одного процесса. Помимо большого количества полей, содержащих атрибуты процесса, его дескриптор включает в себя несколько указателей на другие структуры, которые, в свою очередь, содержат указатели на третьи структуры.

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

Как можно догадаться по названию поля state дескриптора процесса, оно показывает, что происходит с процессом в данный момент. Оно состоит из массива флагов, каждый из которых обозначает возможное состояние процесса. В текущих версиях Linux эти состояния взаимно исключают друг друга, и, следовательно, в поле state всегда установлен только один флаг, а остальные сброшены. Перечислим возможные состояния процесса:

task running —процесс либо выполняется процессором, либо ждет своего выполнения;

task interruptible —процесс приостановлен (“спит”) до тех пор, пока не будет удовлетворено некоторое условие. Возникновение аппаратного прерывания, освобождение системного ресурса, ожидаемого процессом, или доставка процессу сигнала являются примерами условий, способных разбудить процесс (перевести его обратно в состояние task running);

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

task traced —выполнение процесса остановлено отладчиком. Когда ведется мониторинг процесса со стороны другого процесса (например, отладчик делает системный вызов ptrace, чтобы выполнить мониторинг тестируемой программы), любой сигнал может перевести процесс в состояние TASK_TRACED.

В поле state, а также в поле exit state дескриптора процесса можно хранить два дополнительных состояния. Как следует из названия второго поля, процесс переходит в одно из этих состояний, когда его выполнение заканчивается:

exit zombie —выполнение процесса завершено, но процесс – родитель еще не сделал системный вызов wait4 о или waitpido, возвращающий информацию о “скончавшемся” процессе. До того, как будет сделан системный вызов из группы wait, ядро не может уничтожить данные в дескрипторе завершившегося процесса, потому что они могут понадобиться родителю;

exit dead —заключительное состояние процесса. Он уничтожается системой, потому что процесс – родитель только что сделал для него системный вызов wait4() или waitpido. Переход из состояния exit zombie в exit dead позволяет избежать конфликтов одновременного обращения,

если другие потоки сделают системный вызов из группы wait для того же процесса.

Значение поля state обычно устанавливается обычным присваиванием, например:

p ->state = ТASK_RUNNING;

Ядро также использует макросы set_task_state И set current state.

Add A Comment