Linux进程状态
1.进程状态
状态在Kernel源码中的定义:
static const char * const task_state_array[] = {
"R (running)",
"S (sleeping)",
"D (disk sleep)",
"T (stopped)",
"t (tracing stop)",
"X (dead)",
"Z (zombie)",
};
- R-- 运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
- S-- 睡眠状态(sleeping): 意味着进程在等待事件完成(也叫做可中断睡眠)
- D-- 磁盘休眠状态(Disk sleep)也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束
- T-- 停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
- X-- 死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
- Z-- 僵尸状态 (zombie) : 已经死亡的进程, 依然占着某些资源
可以通过ps aux / ps axj 命令查看进程状态
2.运行状态R
只有该状态下的进程才有可能在CPU中执行,为什么说是可能呢?因为在Linux下,正在运行和就绪(在运行队列中, 要拿到时间片才能运行)的进程都视作运行状态。Linux 下 R 状态的进程的task_struct结构 (PCB) 被放入对应的CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。
进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上行。
3.睡眠状态S(可中断睡眠)
处于这个状态的进程因为等待某个事件的发生,比如wait()阻塞,而被挂起。 这些进程的task_struct被放入对应事件的等待队列中。当等待的事件发生时(由外部中断触发、或由其他进程触发),对应等待队列中的这个睡眠状态的进程被唤醒。通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于S 状态。
如下代码:子进程由于sleep进入S状态,父进程由于wait阻塞等待子进程退出,也处于S状态。
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
int main(){