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. sql数据分页

    方法一.直接限制返回区间 (只适应于mysql) SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小; 优点:写法简 ...

  2. 【WPF学习笔记】之如何传递第一个登录界面的值到下一个页面显示:动画系列之(三)

    ... ... 承接系列(二) 在之前的登录后台已设置发送到主界面: 在主界面接收传递的值: using System; using System.Collections.Generic; using ...

  3. C++复习:位运算

    与          a&b :    1010&1100=1000  或          a|b  :  1010|1100=1110 异或       a^b :     101 ...

  4. 【BZOJ4945】[Noi2017]游戏 2-SAT

    [BZOJ4945][Noi2017]游戏 题目描述 题解:2-SAT学艺不精啊! 这题一打眼看上去是个3-SAT?哎?3-SAT不是NPC吗?哎?这题x怎么只有8个?暴力走起! 因为x要么不是A要么 ...

  5. SQL Server 中 GO 的用法(转)

    本科里学了那么多年SQL Server一直看到书上各种SQL语句中间夹杂着那么几个看似毫无意义的GO,看着就让人莫名,问老师,老师一般只会告诉你,不要理他,这个东西没用的.但是个性纠结并且有轻微强迫症 ...

  6. iOS与H5交互及UIWebView缓存

    iOS原生App与H5页面交互笔记 最近在做一个项目用到了原生App与H5交互,之前有做过简单的H5页面直接调用原生方法的例子,就是利用UIWebView中的代理方法 //webview每次加载之前都 ...

  7. the max number of open files 最大打开文件数 ulimit -n RabbitMQ调优

    Installing on RPM-based Linux (RHEL, CentOS, Fedora, openSUSE) — RabbitMQ https://www.rabbitmq.com/i ...

  8. php总结8——mysql函数库、增删改

    8.1 mysql函数库 php的函数   .php中用来操作mysql函数库的函数 常用函数 mysql_connect("主机名称/ip","用户名",&q ...

  9. hadoop2.3安装过程及问题解决

    三台serveryiprod01,02,03,当中01为namenode,02为secondarynamenode.3个均为datanode 3台server的这里提到的配置均需一样. 0.安装前提条 ...

  10. 一起来学linux:shell script(二)关于脚本

    (一)首先来看shell脚本的执行方式,shell脚本的后缀名都是sh文件. 1 sh test.sh 2 source test.sh 这两种方式有什么区别呢.test.sh 里的脚本很简单, 从键 ...