快速业务通道

TASK_KILLABLE:Linux 中的新进程状态

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-10

Linux? kernel 2.6.25 引入了一种新的进程状态,名为 TASK_KILLABLE,用于将进程置为睡眠状态,它可以替代有效但可能无法终止的 TASK_UNINTERRUPTIBLE 进程状态,以及易于唤醒但更加安全的 TASK_INTERRUPTIBLE 进程状态.2002 年,OpenAFS 文件系统驱动程序在阻塞所有信号之后等待事件中断时遇到了问题,而 TASK_KILLABLE 就是因此而被推出的.这种新的睡眠状态允许 TASK_UNINTERRUPTIBLE 响应致命信号.在本文中,作者将介绍这方面的内容,并结合 2.6.26 和早期版本 2.6.18 中的示例来讨论 Linux 内核发生的相关变化以及这些变化带来的新 API.

类似于文件,进程是任何 UNIX? 操作系统的基本元素.进程是执行可执行文件的指令的动态实体.除了执行其指令之外,进程有时还会管理 打开文件、处理器上下文、地址空间以及与程序相关的数据等.Linux 内核将关于进程的完整信息保存在进程描述符 中,它的结构被定义为 struct task_struct.您可以在 Linux 内核源文件 include/linux/sched.h 中看到 struct task_struct 的各个字段.

关于进程状态

在进程的生命周期内,可能会经历一系列互斥的状态.内核将进程的状态信息保存在 struct task_struct 的 state 字段中.图 1 展示了进程状态之间的转换.

我们先来了解一下各种进程状态:

●TASK_RUNNING:进程当前正在运行,或者正在运行队列中等待调度.
●TASK_INTERRUPTIBLE:进程处于睡眠状态,正在等待某些事件发生.进程可以被信号中断.接收到信号或被显式的唤醒呼叫唤醒之后,进程将转变为 TASK_RUNNING 状态.
●TASK_UNINTERRUPTIBLE:此进程状态类似于 TASK_INTERRUPTIBLE,只是它不会处理信号.中断处于这种状态的进程是不合适的,它可能正在完成某些重要的任务. 当它所等待的事件发生时,进程将被显式的唤醒呼叫唤醒.
●TASK_STOPPED:进程已中止执行,它没有运行,并且不能运行.接收到 SIGSTOP 和 SIGTSTP 等信号时,进程将进入这种状态.接收到 SIGCONT 信号之后,进程将再次变得可运行.
●TASK_TRACED:正被调试程序等其他进程监控时,进程将进入这种状态.
●EXIT_ZOMBIE:进程已终止,它正等待其父进程收集关于它的一些统计信息.
●EXIT_DEAD:最终状态(正如其名).将进程从系统中删除时,它将进入此状态,其父进程已经通过 wait4() 或 waitpid() 调用收集了所有统计信息.
●有关进程状态转换的详细信息,请参阅 参考资料 一节中的 UNIX 操作系统设计.

如前所述,进程状态 TASK_UNINTERRUPTIBLE 和 TASK_INTERRUPTIBLE 都是睡眠状态.现在,我们来看看内核如何将进程置为睡眠状态.

内核映射

Linux 内核提供了两种方法将进程置为睡眠状态.

将进程置为睡眠状态的普通方法是将进程状态设置为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE 并调用调度程序的 schedule() 函数.这样会将进程从 CPU 运行队列中移除.如果进程处于可中断模式的睡眠状态(通过将其状态设置为 TASK_INTERRUPTIBLE),那么可以通过显式的唤醒呼叫(wakeup_process())或需要处理的信号来唤醒它.

但是,如果进程处于非可中断模式的睡眠状态(通过将其状态设置为 TASK_UNINTERRUPTIBLE),那么只能通过显式的唤醒呼叫将其唤醒.除非万不得已,否则我们建议您将进程置为可中断睡眠模式,而不是不可中断睡眠模式(比如说在设备 I/O 期间,处理信号非常困难时).

当处于可中断睡眠模式的任务接收到信号时,它需要处理该信号(除非它已被屏弊),离开之前正在处理的任务(此处需要清除代码),并将 -EINTR 返回给用户空间.再一次,检查这些返回代码和采取适当操作的工作将由程序员完成.因此,懒惰的程序员可能比较喜欢将进程置为不可中断模式的睡眠状态,信号不会唤醒这类

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号