【Linux】进程状态

目录

1、Linux操作系统进程的状态

2、Linux内核进程状态

1、内核代码

2、R运行状态(running)

2.1进程有前台进程和后台进程

3、S睡眠状态(sleeping)

4、X死亡状态(dead)

5、Z僵尸状态(zombie)

5.1、Z僵尸状态是什么?

5.2、为什么维持Z僵尸状态?

5.3、僵尸进程危害

6、孤儿进程

6、1孤儿进程是什么?

 6、2 模拟孤儿进程:

6、3 为什么孤儿进程要被领养?


1、Linux操作系统进程的状态

新建:描述进程刚被创建出来,具备了进程相关数据结构,但是还不能运行

运行:task_struct结构体在运行队列中排队(等待某种资源),就叫做运行态。(进程还没有被CPU调度,正在等待调度器调度)

阻塞:等待非CPU资源就绪,进程所处的状态为阻塞状态

 系统中一定存在各自资源的,除了CPU,还有网卡,磁盘,显卡等其他设备,系统中不只是存在一种队列,磁盘也可能由多个进程要访问,所以多个进程要访问同一个资源要排队等待。

挂起:当内存不足的时候,OS通过适当置换进程的代码和数据到磁盘,进程状态就叫做挂起。

 如果磁盘的交换空间也满了,OS进行挂起和置换时有成本的,把内存数据置换到磁盘时一次I/O的过程,对于速度很慢的磁盘来说,不停换入换出会影响OS的效率,所以OS会在置换之间做平衡,如果SWAP分区满了,意味着OS的内存已经十分紧张了,OS会更频繁IO和磁盘中的数据做交换,来不断尝试在内存当中节省空间,这时直观表现就是OS变得特别慢,如果继续增加OS的压力,OS扛不住时会宕机。

2、Linux内核进程状态

1、内核代码

/*
* 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.
*/
//保存Linux状态的指针数组
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 */
};

2、R运行状态(running)

R运行状态(running):
真正的运行状态可能在队列当中等待,也有可能正在被CPU调度 

  

2.1进程有前台进程和后台进程
前台进程:前台进程会影响命令行交互,进程状态前面有个+号,代表前台进程,前台进程一启动,执行命令没有效果,可以被键盘Ctrl+c终止,
后台进程:后台进程不影响命令行交互, 执行程序./myproc & 进程就在后台运行,那么输入各自命令也能正常执行,进程一直在后台运行 , Ctrl+c无法终止,如果要kill该进程,可以执行kill -9 id号。

3、S睡眠状态(sleeping)

S睡眠状态(sleeping):

意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。

4、D磁盘休眠状态:

有时候也叫不可中断睡眠状态( uninterruptible sleep ),在这个状态的
进程通常会等待 IO 的结束。
当服务器压力过大的时候,OS会通过一定的手段,杀掉一些进程来节省空间,如果进程正在磁盘进行读写操作,磁盘就要处于D状态,进程处于D状态,OS不会杀掉D状态的进程,要等待D状态自动醒来才能杀掉,此时D状态时深度睡眠和不可中断睡眠。

5、T停止状态(stopped):

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。

6、X死亡状态(dead

X 死亡状态( dead ):这个状态只是一个返回状态,你不会在任务列表里看到这个状态,意味着当前资源可以被回收。

5、Z僵尸状态(zombie)

5.1、Z僵尸状态是什么?

一个进程已经退出,但是还不允许被OS释放,处于一个被检测的状态,一般是父进程检测或OS检测。

5.2、为什么维持Z僵尸状态?

维持该状态,为了让父进程和OS来进行回收,Z状态变为X状态。

僵死状态( Zombies )是一个比较特殊的状态。当进程退出并且父进程(使用 wait() 系统调用 , 后面讲) 没有读取到子进程退出的返回代码时就会产生僵死( ) 进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入 Z 状态
模拟僵尸进程:
5.3、僵尸进程危害
1、进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
2、维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话 说,Z状态一直不退出,PCB一直都要维护?是的!
3、那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?
是的!因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空
4、内存泄漏:C++中自己malloc或者new空间不释放,父进程创建的子进程没有回收,导致僵尸问题,也是内存泄漏

6、孤儿进程

6.1、孤儿进程是什么?

父进程退出,子进程还在,子进程就叫做孤儿进程。

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程” ,孤儿进程被1号init进程领养,有(1号进程)init进程回收
6.2、 模拟孤儿进程:
6.3、 为什么孤儿进程要被领养?
未来子进程退出的时候,父进程早已不在,需要领养进程来进行回收,目的时当子进程再退出时

系统可以回收它的资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值