Linux进程调度(1)-进程状态

Linux进程调度算是非常重要的知识点了,现在多进程、多线程开发如此普遍,多少还是要对Linux的进程调度系统有些熟悉的。在开始讲解真正的进程调度知识之前,有必要先说一下进程状态这个小知识。

分类

Linux进程状态主要分为:

1、R (TASK_RUNNING),可执行状态

2、S (TASK_INTERRUPTIBLE),可中断的睡眠状态

3、D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态

4、T/t (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态

5、Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程

6、X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁

ps aux命令可以查看当前进程处于何种状态。

R (TASK_RUNNING)

处于running状态的进程并不表示此刻该进程正在CPU上运行,只是代表该进程处于可被运行的状态,具体此刻有没有被运行取决于Linux系统的调度。所以很多时候有的人为了区分这两者状态,会把能够被调度运行但是此刻没有运行的状态称为Ready状态。

S (TASK_INTERRUPTIBLE),可中断的睡眠状态

一般情况下,如果你的程序没有问题的话,你的大部分进程/线程应该处于这个状态下。进程什么时候会进入这个状态呢?一般情况是程序自己主动调用了诸如sleep这样的函数或者等待某些条件满足。第一个sleep很好理解,第二个怎么理解呢。举个例子,你在网络通信中调用了read函数(默认的阻塞式调用),但是实际上此刻并没有数据进来,那么你就会被投入到这个状态,直到数据来了你才会被唤醒。

D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态

这个状态和S状态有点像,区别是能不能被中断。通常我们强行结束一个进程时使用kill方法,kill方法实际上是给该进程发送了一个信号,该进程收到该信号以后退出,处于S状态的进程就可以响应这样的信号,而处于D状态的进程则无法响应外界的信号。那你可能会疑问,处于D状态交互性很不好啊,为什么需要这个状态呢?熟悉数据库的可能知道事务这个词,表示一段数据库操作要么全部执行,要么全部不执行,不会部分执行成功,部分不执行。很多时候有些操作必须完整执行,不能被打断,这个时候我们就需要D状态。

T/t (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态

向进程发送SIGSTOP信号,它就会响应该信号而进入TASK_STOPPED状态。

GDB调试程序时,程序则会进入TASK_TRACED状态.

Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程

首先说明一点,每个进程都有一个父进程(init进程除外)。如果一个进程退出后,其父进程没有调用wait获取其退出状态,那么这个进程的退出状态就会一直被保留(主要是task_struct这个结构体),这个进程就成为了僵尸进程。这个实际上也是内存泄露。

X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁

这是一个临时状态,一般情况下是看不到的。现在多线程开发,创建新线程的时候可以指定detach属性,这样当该线程结束时不需要父线程为它收尸,它退出时就不会变成僵尸进程,而是短暂的进入X状态然后退出。

(本文章部分参考https://www.cnblogs.com/littlecharacter/p/12154588.html)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值