Linux进程状态解析之R、S、D、T、Z

From: http://bbs.hx95.com/read-htm-tid-208094-fpage-2.html

R (TASK_RUNNING),可执行状态。

只有在该状态的进程才可能在CPU上运行。同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

正在CPU上执行的进程定义为RUNNING状态、可执行但尚未被调度执行的进程定义为READY状态,这两种状态统一为 TASK_RUNNING状态。

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

处于这个状态的进程,因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态。CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU将会响应不过来。

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

进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。

而TASK_UNINTERRUPTIBLE状态存在的意义在于,进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。

linux系统中也存在容易捕捉的TASK_UNINTERRUPTIBLE状态。执行vfork系统调用后,父进程将进入TASK_UNINTERRUPTIBLE状态,直到子进程调用exit或exec。通过下面的代码就能得到处于TASK_UNINTERRUPTIBLE状态的进程:

#include <stdio.h>
        #include <unistd.h>
        void main()
        {
                 if (!vfork());
                 sleep(100);
                 ruturn 0;
        }

编译运行,然后ps一下:

njs@njs:~/test$ ps -ax | grep a\.out
        4371 pts/0 D+ 0:00 ./a.out
        4372 pts/0 S+ 0:00 ./a.out
        4374 pts/1 S+ 0:00 grep a.out

然后我们可以试验一下TASK_UNINTERRUPTIBLE状态的威力。不管kill还是kill -9,这个TASK_UNINTERRUPTIBLE状态的父进程依然屹立不倒。

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

向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。

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

进程在退出的过程中,处于TASK_DEAD状态。

在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。释放掉task_struct,则需要建立一些新的数据结构,以便让父进程找到它的子进程的退出信息。

父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。

通过下面的代码能够制造一个EXIT_ZOMBIE状态的进程:

#include <stdio.h>
        #include <unistd.h>
        void main()
        {
                 if (fork());
                 while(1)
                 sleep(100);
        }

编译运行,然后ps一下:

njs@njs:~/test$ ps -ax | grep a\.out
        10410 pts/0 S+ 0:00 ./a.out
        10411 pts/0 Z+ 0:00 [a.out]
        10413 pts/1 S+ 0:00 grep a.out

只要父进程不退出,这个僵尸状态的子进程就一直存在。那么如果父进程退出了呢,谁又来给子进程“收尸”?当进程退出的时候,会将它的所有子进程都托管给别的进程(使之成为别的进程的子进程)。托管给谁呢?可能是退出进程所在进程组的下一个进程(如果存在的话),或者是1号进程。所以每个进程、每时每刻都有父进程存在。除非它是1号进程。

1号进程,pid为1的进程,又称init进程。linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命:1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙);2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于TASK_INTERRUPTIBLE状态,“收尸”过程中则处于TASK_RUNNING状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] react父子组件如何通信?

[react] react父子组件如何通信&#xff1f; props 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

PAT 1100

1100. Mars Numbers (20) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YuePeople on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars.The numbers 1 to 12 on Earch is called "jan, feb, m…

安装linux的准备

首先&#xff0c;在安装linux系统之前应首先做到规划。因为&#xff0c;一个好的服务器&#xff0c;工作台&#xff0c;甚至是个人PC都必须要做到规划。因为这样可以做到以最少的花费实现更高的服务要求。这个很好理解&#xff0c;比如你做邮件服务器就必须要选择一个大的硬盘预…

printf如何输出64位整数

From: http://blog.csdn.net/zzqhost/article/details/6064886 关于printf函数输出64位数的问题&#xff0c;其实在window下和linux下是不一样的&#xff1a; linux下是 printf("%lld/n",a); printf("%llu/n",a); windows下是 printf("%I64d/n"…

[react] 在react中你是怎么进行状态管理的?

[react] 在react中你是怎么进行状态管理的&#xff1f; 使用React原生的ContextuseContext(可选的加上useReducer)使用redux react-redux redux-thunk使用mobx mobx-react 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定…

iOS UI-常用控件

1 #import "ViewController.h"2 3 interface ViewController ()<UITextFieldDelegate>4 5 // 标题标签6 property (strong, nonatomic) UILabel *titleLablel;7 // 分段控制器8 property (strong,nonatomic) UISegmentedControl *segment;9 // 开关标签10 prop…

天龙八部***核心代码

天龙八部***核心代码 信息来源&#xff1a;邪恶八进制信息安全团队&#xff08;www.eviloctal.com&#xff09; 文章作者&#xff1a;认真的雪 我也来凑凑热闹..... 发一个网游***核心代码...无聊的时候写的.. 截取了用户名&#xff0c;密码&#xff0c;等级&#xff0c;仓库密…

Linux常用错误码--errno-base.h

经常会需要用到错误码&#xff0c;但是它具体的值 是什么呢&#xff0c;往往不太清楚&#xff0c;所以在使用的时候非常不舒服&#xff0c;下面把linux平台下常用的错误码列了下。 我是Fedora12系统&#xff0c;找到的定义文件是&#xff1a;/usr/include/asm-generic/errno-b…

[react] react组件的state和props两者有什么区别?

[react] react组件的state和props两者有什么区别&#xff1f; State 是一种数据结构&#xff0c;用于组件挂载时所需数据的默认值。State 可能会随着时间的推移而发生突变&#xff0c;但多数时候是作为用户事件行为的结果。 Props(properties 的简写)则是组件的配置。props 由…

[react] react与angular、vue有什么区别?

[react] react与angular、vue有什么区别&#xff1f; Angular以前有接触过&#xff0c;我的感觉是&#xff0c;这不像React和Vue一样是构架补充库&#xff08;比如需要另外的全家桶来配合使用&#xff09;&#xff0c;它的功能非常完整&#xff0c;更像是一个框架&#xff0c;…

Linux互斥锁的使用代码实现

From: http://blog.csdn.net/leo115/article/details/8037869 [cpp] view plaincopy#include <stdio.h> #include <pthread.h> #include <sched.h> #include <unistd.h> //对临界区的保护问题 void *fun1(void *arg); void *fun2(void *ar…

南京Uber优步司机奖励政策(12月28日到1月3日)

滴快车单单2.5倍&#xff0c;注册地址&#xff1a;http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单&#xff1a;http://www.cnblogs.com/mfryf/p/4612609.html 优步奖励低/不挣钱/怎么办?看这里&#xff1a;http://www.cnblogs.com/mfry…

[react] 说说你对声明式编程的理解?

[react] 说说你对声明式编程的理解&#xff1f; 声明式编程 区别于命令式编程,它的特点就是我告诉计算机做什么,但是没有告诉你怎么做. 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

有谁用过sendinput摸拟一个鼠标击键?

我想用&#xff0c;但定义了MOUSEINPUT和INPUT结构&#xff0c;编译是时出现这个错误&#xff1a; E:\My document\VCprograms\13\13.cpp(152) : error C2065: MOUSEINPUT : undeclared identifier E:\My document\VCprograms\13\13.cpp(152) : error C2065: INPUT : undeclare…

USB Camera摄像头(UVC 与 gspca)

From: http://www.cnblogs.com/leaven/archive/2010/08/19/1802934.html http://weijb0606.blog.163.com/blog/static/131286274201063145356429/ 我的摄像头终于出现图像了&#xff01; 李迟按&#xff1a;本文章不是教程&#xff0c;不是心得总结&#xff0c;而是记录我在…

[react] react有几种构建组件的方式?可以写出来吗?

[react] react有几种构建组件的方式&#xff1f;可以写出来吗&#xff1f; 1.无状态函数式组件 function HelloComponent(props, /* context */) { return <div>Hello {props.name}</div> } ReactDOM.render(<HelloComponent name"Sebastian" /&g…

随机存取存储器(RAM)

RAM&#xff08;random access memory&#xff09;随机存储器。存储单元的内容可按需随意取出或存入&#xff0c;且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容&#xff0c;故主要用于存储短时间使用的程序。 按照存储信息的不同&#xff0c;…

JAVA基础实例(三)--排序

冒泡排序 是一种简单的排序算法。它反复地走訪过要排序的数列&#xff0c;一次比較两个元素。假设他们的顺序错误就把他们交换过来。走訪数列的工作是反复地进行直到没有再须要交换&#xff0c;也就是说该数列已经排序完毕。这个算法的名字由来是由于越小的元素会经由交换慢慢“…

对象文件格式分析工具: objdump, nm,ar

From: http://blog.csdn.net/longxin007/article/details/1880477 前言 如果普通编程不需要了解这些东西&#xff0c;如果想精确控制你的对象文件的格式或者你想查看一下文件对象里的内容以便作出某种判断&#xff0c;刚你可以看一下下面的工具&#xff1a;objdump, nm, ar。…

[react] react的mixins有什么作用?适用于什么场景?

[react] react的mixins有什么作用&#xff1f;适用于什么场景&#xff1f; 1.mixin的作用是抽离公共功能&#xff0c;不存在渲染dom的需要&#xff0c;所以它没有render方法。如果你定义了render方法&#xff0c;那么他会和组件的render方法冲突而报错。 2.mixin不应该污染st…