task_struct的state字段记录的进程的状态,可分为如下几种: 

#define TASK_RUNNING            0 

可运行状态。这是 “进程正在被CPU运行” 和 “进程正在可运行队列中等待被CPU运行” 统称。也可以将它们拆开成“RUNNING”和“READY”两种状态。 

#define TASK_INTERRUPTIBLE       1 

可中断的睡眠状态。当进程等待某个条件(比如某个资源,中断,信号)而被挂起时就处于该状态,当条件得到满足时,进程将会重新返回到TASK_RUNNING状态。 

#define TASK_UNINTERRUPTIBLE    2 

不可中断的休眠状态。与TASK_INTERUPTIBLE类似,但不同的是其不会响应信号,其会一直等待直到条件得到满足。 

#define TASK_ZOMBIE             4 

僵死状态。进程的执行被终止,但还未完全退出时的状态。系统总会假设一个进程退出前其父进程始终对其感兴趣,所以当进程被终止时,系统会通知父进程来收集相关信息,当父进程收集完毕后(发布wait()调用后),进程废除过程才会继续进行以丢弃数据。(如果子进程退出时,父进程已经不存在了,在父进程的工作会由init进程代理) 

#define TASK_STOPPED            8 

暂停状态。有一些信号可以让进程暂停被执行而处于暂停状态,比如SIGSTOP (Stop executing temporarily),  SIGTSTP (Terminal stop signal),  SIGTTIN (Background process attempting to read from tty),  SIGTTOU  (Background process attempting to write to tty). 另外,当一个进程被另外一个进程监视(ptrace)时,任何信号都会让被监视进程处于TASK_STOPPED状态(一个典型例子是程序的DEBUG时,被调试程序就经常处于该状态,看到有的资料上也将该状态分离出来,叫着TASK_TRACED) 

结合下面这个图我们可以看看一个进程的生命周期: 

调用fork函数而创建一个新进程后,如果紧接着调用了exec族函数的话,新进程会被放置到可执行队列等待被CPU执行,如果仅仅是调用fork函数,那么新进程的状态和父进程的状态完全相同(Run in User Mode 或Run in Kernel Mode)。 

当进程在用户模式运行时,如果发生了系统调用,则进程会进入到内核模式(Run in Kernel Mode)。 假设此时的是一个磁盘文件读取操作,而该操作比较慢,进程将放弃CPU而进入休眠状态(Sleeping)并且时机成熟(读取完成,数据就绪)而被唤醒。 

当进程退出(比如调用exit()函数)后,其会变成僵死进程而进入Zombie状态。 

linux 进程学习笔记-进程状态的更多相关文章

  1. linux 进程学习笔记-等待子进程结束

    <!--[if !supportLists]-->Ÿ <!--[endif]-->等待子进程结束 pid_t waitpid(pid_t pid, int *stat_loc, ...

  2. linux进程学习笔记

    学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Versio ...

  3. Linux 进程学习笔记

    1.什么是程序?什么是进程?它们有什么区别? 定义: 程序:程序(Program)是一个静态的命令集合,程序一般放在磁盘中,然后通过用户的执行来触发.触发后程序会加载到内存中成为一个个体,就是进程. ...

  4. linux 进程学习笔记-进程ID,PID

    PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...

  5. linux 进程学习笔记-进程调度

    在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调 ...

  6. linux 进程学习笔记-进程跟踪

    进程跟踪 long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Linux用ptrace来进行进 ...

  7. linux 进程学习笔记-进程信号sigal

    信号(或软中断)是在软件层次上对中断的一个模拟,其运行在“用户空间”,一个进程对另外一个或几个进程通过发送信号来实现异步通信.当接收进程接收到信号后,其可以注册一下处理函数来说对这些信号进行处理(也可 ...

  8. linux 进程学习笔记-运行新进程

    我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. ...

  9. linux 进程学习笔记-进程退出/终止进程

    <!--[if !supportLists]-->Ÿ <!--[endif]-->退出/终止进程 void _exit(int status) 与 void exit(int ...

随机推荐

  1. shell函数传递带空格的参数

    shell中的参数以空格为分割符,经常会碰到需要传递带空格的参数,例如传递带空格的文件名. 方法很简单:给参数加双引号. 但是实际效果要看你的函数内容,一种可能的情况是: 其实你真的传递进去了带空格的 ...

  2. ARM和STM32的区别及ARM公司架构的发展

    ARM和STM32的区别及ARM公司架构的发展 转:https://www.cnblogs.com/kwdeblog/p/5260348.html ARM是英国的芯片设计公司,其最成功的莫过于32位嵌 ...

  3. Struts2学习七----------Struts2后缀

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2后缀 - Struts2默认后缀是action - Struts2使用默认后缀时*.action和*都是同一个请求 - Struts2自 ...

  4. 研发团队如何借助Gitlab来做代码review

    代码review是代码质量保障的手段之一,同时开发成员之间代码review也是一种技术交流的方式,虽然会占用一些时间,但对团队而言,总体是个利大于弊的事情.如何借助现有工具在团队内部形成代码revie ...

  5. Hadoop起源

    本文来自Doug Cutting为<Hadoop权威指南>所作之序,感觉读一下还是挺有收获的. Hadoop 起源于Nutch项目.我们几个人有一段时间一直在尝试构建一个开源的Web搜索引 ...

  6. HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程

    在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...

  7. 过滤XSS的HTMLPurifier使用

    什么是HTMLPurifier? 在php里解决XSS最简单的方法是使用htmlspecialchars转义xml实体,但对于需要使用xml的时候就搏手无策了. HTML Purifier是基于php ...

  8. 【demo练习三】:图片水平滚动、点击按钮变更图片动画

    要求:四张图片水平滚动,每隔5秒进行一次循环,点击按钮随机变更图片. XAML前台代码: <Window x:Class="图片滚动.MainWindow" xmlns=&q ...

  9. 平滑处理 - cvSmooth() 函数实现

    前言 平滑是图像处理中很重要的操作,其主要用途是降噪.Open CV 提供了 5 种不同的平滑方法:简单模糊,简单无缩放变换的模糊,中值模糊,高斯模糊和双边滤波,它们都通过函数 cvSmooth 实现 ...

  10. VI使用说明 (转)

    vi使用方法(ZT)         vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Lin ...