目录
书面上的进程状态
Linux系统中的进程状态
R状态
S状态
D状态
T状态
下面是kill命令的一些选项
t状态
X状态
Z状态
进程状态查看
书面上的进程状态
在课本上操作系统的进程状态分为三种
运行态,就绪态,阻塞态
运行态:占有CPU,并在CPU上运行;
就绪态:已经具备运行条件,但是由于没有空闲的CPU,而暂时不能运行;
阻塞态:因为等待某一事件而暂时不能运行。
细分的话,还有创建态,挂起态等
Linux系统中的进程状态
在Linux内核源码中有对进程状态的定义
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
R 运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
这里定义了一个循环打印的代码,在循环的途中,看他的进程状态 却是S(睡眠状态)
R状态
只是循环,什么都不干 却又是在R(运行状态)
这是为什么呢?
printf的本质要将结果打印到屏幕上,根据冯诺依曼体系,这个屏幕是外设
因为printf 而等待外设的资源
操作系统不允许在占有cpu资源的同时 还占有外设资源,并且访问cpu的速度非常快,这些代码一瞬间就执行完了,大部分的时间都在进行prinf的资源访问所以这里是S,可能运行这个程序几万次在某一次查看状态时正好是R状态
S状态
等待键盘输入的时候 就是S状态 可中断休眠
D状态
不可中断休眠
一般不会遇到D状态,做运维的这些可能会经常遇到D状态
系统宕机会遇到这种
T状态
暂停状态
用一个循环打印
用kill -19 让进程停止
下面是kill命令的一些选项
那么怎么恢复呢
用kill -18继续运行
但是,这里的状态变成了S(之前是S+) 而且用ctrl+c停止不了
原因:这里的+ 代表的是在前台运行,而不带+ 就是在后台运行,而ctrl只能关闭前台运行的进程,
这里想要关闭的话 用kill + pid
t状态
追踪状态,也属于暂停状态
例如 为了拦截用户的非法操作,操作系统会暂停进程
调试的时候,运行到断点处停下来 也是暂停状态
小t 出现了
X状态
这个状态只是一个返回状态,你不会在任务列表里看到这个状态
例如main函数退出 有个return 0 来给外部确认函数执行是否出现错误,如果有错误返回的就不是0
Z状态
如果一个进程退出了,立马X状态,立马退出,父进程有没有机会拿到退出结果呢?
Linux当进程退出的时候,一般进程不会立即彻底退出,而是要维持一个状态叫做Z,也叫做将是状态——方便后续父进程(os)读取子进程退出的退出结果
干掉子进程
Z状态 出现了
进程状态查看
ps aux / ps axj 命令