Кратко объясните каждое из состояний процесса в Linux?

Процесса в Linux может находиться в одном из пяти возможных состояний:

Работающий процесс (Running or Runnable) (R)
В данный момент код процесса выполняется. В рабочем состоянии (Running) процесс занимает ядро ЦП для выполнения своего кода. Однако алгоритм планирования потоков может заставить запущенный процесс отказаться от своего права на выполнение. Это делается для того, чтобы каждый процесс мог иметь справедливую долю ресурсов ЦП. В этом случае процесс будет помещен в очередь выполнения, и теперь его состояние является готовым к выполнению (Runnable), ожидая своей очереди на выполнение. Хотя состояния выполнения (Running) и готовым к выполнению (Runnable) различны, все вместе они сгруппированы в одно состояние, обозначаемое символом R.

Непрерываемый сон (Uninterruptible Sleep) (D) и Прерываемый сон (Interruptable Sleep) (S)
Во время выполнения процесса он может столкнуться с частью своего кода, где ему необходимо запросить внешние ресурсы. В основном запрос этих ресурсов основан на вводе-выводе, например, для чтения файла с диска или выполнения сетевого запроса. Поскольку процесс не может дальше продолжать выполнение без необходимых ресурсов, во время ожидания доступности требуемых ресурсов он останавливается и ничего не делает. В таких случаях процессы должны уступить свои циклы ЦП другим задачам, которые готовы к запуску, и, следовательно, они переходят в спящее состояние.

Существует два различных состояния сна: состояние непрерываемого сна (D) и состояние прерываемого сна (S). Непрерываемое спящее состояние будет ждать только доступности ресурсов, прежде чем оно перейдет в рабочее состояние, и не реагировать ни на какие другие сигналы. Прерываемое спящее состояние (S) будет реагировать и на сигналы и на доступность ресурсов.

Остановленный (Stopped) (T)
Из выполняющегося или готового к выполнению состояния (R) мы можем перевести процесс в остановленное состояние (T) с помощью сигналов SIGSTOP или SIGTSTP. Разница между обоими сигналами заключается в том, что мы отправляем SIGSTOP программно, например, запускаем команду kill -STOP {pid}. В этом случае процесс не может игнорировать этот сигнал и переходит в остановленное состояние. С другой стороны, мы отправляем сигнал SIGTSTP с помощью клавиатуры CTRL + Z. В отличие от SIGSTOP, процесс может при желании игнорировать этот сигнал и продолжать выполнение (R) после получения SIGTSTP. Находясь в этом состоянии, мы можем вернуть процесс в рабочее или готовое к выполнению состояние (R), отправив сигнал SIGCONT.

Зомби (Zombie) (Z)
Когда процесс завершает свое выполнение или завершается, он отправляет сигнал SIGCHLD родительскому процессу и переходит в состояние зомби. Процесс-зомби, также известный как несуществующий процесс, останется в этом состоянии до тех пор, пока родительский процесс не удалит его из таблицы процессов. Чтобы удалить завершившийся дочерний процесс из таблицы процессов, родительский процесс должен прочитать значение выхода дочернего процесса с помощью системных вызовов wait() или waitpid().