linux 进程状态

转载用于学习收藏:
原文1
原文2

进程的几种状态

  1. 运行状态(TASK_RUNNING):进程当前正在运行, 或者正在运行队列中等待调度。
  2. 可中断的阻塞状态(TASK_INTERUPTIBLE): 进程处于阻塞(睡眠) 状态, 正在等待某些事件发生或能够占用某些资源。 处在这种状态下的进程可以被信号中断。接 收 到 信 号 或 被 显 式 的 唤 醒 呼 叫 (如 调 用 wake_up 系 列 宏 : wake_up 、wake_up_interruptible 等) 唤醒之后, 进程将转变为 TASK_RUNNING 状态。
  3. 不可中断的阻塞状态(TASK_UNINTERUPTIBLE): 此进程状态类似于可中断的阻塞状态, 只是它不会处理信号, 把信号传递到这种状态下的进程不能改变它的状态。 在一些特定的情况下(进程必须等待, 直到某些不能被中断的事件发生), 这种状态是很有用的。 只有在它所等待的事件发生时, 进程才被显式的唤醒呼叫唤醒。
  4. 可终止的阻塞状态(TASK_KILLABLE): 这是Linux 内核 2.6.25 引入了一种新的进程状 态 。 状 态 的 运 行 机 制 类 似 于不可中断的阻塞状态, 只不过处在该状态下的进程可以响应致命信号。 它可 以 替 代 有 效 但 可 能 无 法 终 止 的 不 可 中 断 的 阻 塞 状 , 以及易于唤醒但安全性欠佳的可中断的阻塞状态。
  5. 暂停状态(TASK_STOPPED):进程的执行被暂停,当进程收到 SIGSTOP、SIGTSTP、SIGTTIN、 SIGTTOU 等信号时, 就会进入暂停状态。
  6. 跟踪状态(TASK_TRACED): 进程的执行被调试器暂停。 当一个进程被另一个进程监控时(如调试器使用 ptrace()系统调用监控测试程序), 任何信号都可以把这个进程置于跟踪状态。
  7. 僵尸状态(EXIT_ZOMBIE): 进程运行结束, 父进程尚未使用 wait 函数族(如使用 waitpid()函数) 等系统调用来“收尸”, 即等待父进程销毁它。 处在该状态下的进程“尸体” 已经放弃了几乎所有的内存空间, 没有任何可执行代码, 也不能被调度, 仅仅在进程列表中保留一个位置, 记载该进程的退出状态等信息供其他进程收集。
  8. 僵尸撤销状态(EXIT_DEAD): 这是最终状态, 父进程调用 wait 函数族“收尸”后, 进程彻底由系统删除。

内核可以使用 set_task_state 和 set_current_state 宏来改变指定进程的状态和当前执行进
程的状态。
在这里插入图片描述

进程D状态原理探析

在这里插入图片描述

  1. 内核 每隔一段时间都会统一接受所有进程的请求(这里可能与CPU时间片有关系,需要进一步确认),如果发现有进程发起了请求,首先内核会去获取进程所需要的资源,然后把这个进程暂时放到一个 parking 队列里;这里类似于需求收集阶段。
  2. 在需求收集结束后,会把发起请求的进程放到一个runnable 队列里,等待执行。
  3. 把 runnable 队列里的进程依次执行。

进程的 D 状态(Uninterruptible Sleep)发生在需求收集阶段。试想在这个阶段,当内核去获取进程所需要的资源的时候,比如从磁盘读取某一个文件,这个时候突然磁盘驱动不干活了(可能因为取的数据太多驱动没反应过来,也可能因为磁盘出了故障),这个时候内核就为难了,场面变得比较尴尬。

  1. 首先驱动是工作在内核态的,内核对驱动有绝对的信任权;其次进程发起请求了,自己作为老大于情于理都应该应承;
  2. 但是进程所要求的数据实在拿不到怎么办呢?这个时候内核只能把进程的状态临时转换为 D 状态,标明这个锅是内核自己的,内核正在尝试获取进程需要的资源,而且获取资源的途径是内核可控的(内核必须对全局的资源拥有控制权限,否则也不要当内核了)。

上面的情况,如果进程所需要的数据很快就被内核拿到了还好(大部分情况下都是如此),进程会从 D 状态转到可运行的状态;如果拿不到(比如真的磁盘出现了故障,而驱动代码又没有考虑到这种情况,或者驱动抛出了信号但是内核不承认),那么相应的进程就会一直处于 D 状态。非常戏剧性的是,只有处于可运行状态(Runnable)的进程可以接受终止信号( kill 信号),处于 D 状态的进程是没有办法被 kill 掉的;这也让终止 D 状态的进程变得复杂——必须重启服务器才能把 D 状态的进程杀掉……不过想一想也好理解,因为流程卡在内核那里,这个时候内核与进程是绑定的状态,内核限制进程不接受被 kill 的信号也是理所当然的(我的理解是,这里的内核过于自信了,我的故障机是4.4.0内核版本,或许高版本的已经没有这个问题了)。

进程D状态原理探析
https://blog.51cto.com/u_15127498/2671483

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值