Linux进程状态

目录

进程状态查看

书面上的进程状态

 Linux系统中的进程状态

R状态 

S状态

 D状态

T状态 

下面是kill命令的一些选项

t状态

X状态

Z状态

僵尸进程危害

孤儿进程 


进程状态查看

ps aux / ps axj 命令

书面上的进程状态

在课本上操作系统的进程状态分为三种

运行态,就绪态,阻塞态

运行态:占有CPU,并在CPU上运行;

就绪态:已经具备运行条件,但是由于没有空闲的CPU,而暂时不能运行;

阻塞态:因为等待某一事件而暂时不能运行。

细分的话,还有创建态,挂起态等

Linux进程状态_第1张图片

 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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

 Linux进程状态_第2张图片

Linux进程状态_第3张图片

这里定义了一个循环打印的代码,在循环的途中,看他的进程状态 却是S(睡眠状态)

Linux进程状态_第4张图片

R状态 

只是循环,什么都不干 却又是在R(运行状态)

这是为什么呢?

printf的本质要将结果打印到屏幕上,根据冯诺依曼体系,这个屏幕是外设

因为printf 而等待外设的资源

操作系统不允许在占有cpu资源的同时 还占有外设资源,并且访问cpu的速度非常快,这些代码一瞬间就执行完了,大部分的时间都在进行prinf的资源访问所以这里是S,可能运行这个程序几万次在某一次查看状态时正好是R状态

S状态

等待键盘输入的时候 就是S状态 可中断休眠

Linux进程状态_第5张图片

 D状态

不可中断休眠

一般不会遇到D状态,做运维的这些可能会经常遇到D状态

系统宕机会遇到这种

T状态 

暂停状态

用一个循环打印

 Linux进程状态_第6张图片

用kill -19 让进程停止

下面是kill命令的一些选项

Linux进程状态_第7张图片

 那么怎么恢复呢

用kill -18继续运行

 

 但是,这里的状态变成了S(之前是S+) 而且用ctrl+c停止不了

原因:这里的+  代表的是在前台运行,而不带+ 就是在后台运行,而ctrl只能关闭前台运行的进程,

这里想要关闭的话 用kill + pid

t状态

追踪状态,也属于暂停状态

例如 为了拦截用户的非法操作,操作系统会暂停进程

调试的时候,运行到断点处停下来 也是暂停状态

 小t 出现了

X状态

这个状态只是一个返回状态,你不会在任务列表里看到这个状态

例如main函数退出 有个return 0 来给外部确认函数执行是否出现错误,如果有错误返回的就不是0

Z状态

僵尸状态

 如果一个进程退出了,立马X状态,立马退出,父进程有没有机会拿到退出结果呢?
Linux当进程退出的时候,一般进程不会立即彻底退出,而是要维持一个状态叫做Z,也叫做将是状态——方便后续父进程(os)读取子进程退出的退出结果

干掉子进程

Linux进程状态_第8张图片

Z状态 出现了

僵尸进程危害

  进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

  维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB) 中,换句话 说,Z状态一直不退出,PCB一直都要维护?是的!

  那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空 间

孤儿进程 
什么是孤儿进程?
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作

父进程为什么直接退出为什么不会是僵尸进程?

因为父进程 也有自己对应的父进程,由bash对其回收 

 

你可能感兴趣的:(Linux笔记,linux,运维,服务器)