Состояние «умирания» задачи при непрерывном системном вызове с SIGKILL - PullRequest
0 голосов
/ 27 января 2020

Я прочитал этот пост о SIGKILL и был озадачен следующими утверждениями:

только некоторые системные вызовы прерываются, поэтому ядро ​​внутренне помечает процесс как в специальном «умирающем» состоянии до тех пор, пока системные вызовы или операции ввода-вывода не будут разрешены

...

После разрешения любых внутрипроцессных процедур ядра, состояние процесса изменяется с «умирающего» на «мертвое», и ядро ​​начинает его очищать

Но я не могу найти подтверждения этому в исходных кодах ядра. Состояния задачи определены в linux / sched.h :

#define TASK_RUNNING            0x0000
#define TASK_INTERRUPTIBLE      0x0001
#define TASK_UNINTERRUPTIBLE    0x0002
#define __TASK_STOPPED          0x0004
#define __TASK_TRACED           0x0008
/* Used in tsk->exit_state: */
#define EXIT_DEAD               0x0010
#define EXIT_ZOMBIE             0x0020
#define EXIT_TRACE              (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_PARKED             0x0040
#define TASK_DEAD               0x0080
#define TASK_WAKEKILL           0x0100
#define TASK_WAKING             0x0200
#define TASK_NOLOAD             0x0400
#define TASK_NEW                0x0800
#define TASK_STATE_MAX          0x1000

И нет никаких «умирающих» состояний ни в linux / sched.h, ни в других файлах планировщика. Может ли кто-нибудь уточнить, какое именно состояние задачи используется, чтобы пометить задачу как «умирающую» при непрерывном системном вызове?

1 Ответ

0 голосов
/ 27 января 2020

Из ответа на этот вопрос SO может показаться, что состояние "смерти" будет соответствовать состоянию "непрерывного сна":

Как отмечено в комментариях к ОП статус процесса (STAT) D указывает, что процесс находится в состоянии «непрерывного сна». В реальных условиях это обычно означает, что он ожидает ввода-вывода и не может / не будет ничего делать - в том числе и умирать - до тех пор, пока эта операция ввода-вывода не завершится.

Из в состояниях linux/sched.h может показаться, что TASK_UNINTERRUPTIBLE соответствует состоянию непрерывного сна. Из «Понимание Linux состояний процесса» (Йог sh Бабар):

Непрерывное состояние сна - это состояние, которое не будет обрабатывать сигнал сразу. Он активируется только в результате появления ожидаемого ресурса или после истечения времени ожидания в течение этого ожидания (если время ожидания указано, когда процесс переведен в спящий режим). Бесперебойное состояние в основном используется драйверами устройств, ожидающими дискового или сетевого ввода-вывода. Когда процесс непрерывно спит, сигналы, накопленные во время сна, замечаются, когда процесс возвращается из системного вызова или прерывания. В Linux системах. команда ps -l использует букву D в поле состояния (S), чтобы указать, что процесс находится в состоянии непрерывного сна. В этом случае флаг состояния процесса устанавливается следующим образом:

p->state = TASK_UNINTERRUPTABLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...