操作系统:linux
处理器:arm
内核版本:4.x

目录:

  • 进程状态

    • R (TASK_RUNNING)
    • S (TASK_INTERRUPTIBLE)
    • D (TASK_UNINTERRUPTIBLE)
    • Z(EXIT_ZOMBIE)
  • 其他进程状态
  • 组织方式

进程状态

执行ps aux命令可以看到进程有以下这些状态:

Ss、S、I<、I、SN、Ssl、S<、S<s、Rsl、Ssl+、SNsl、S<l、R+等

他们的含义可以通过man ps找到:

PROCESS STATE CODESHere are the different values that the s, stat and state output specifiers(header "STAT" or "S") will display to describe the state of a process:D    uninterruptible sleep (usually IO)R    running or runnable (on run queue)S    interruptible sleep (waiting for an event to complete)T    stopped by job control signalt    stopped by debugger during the tracingW    paging (not valid since the 2.6.xx kernel)X    dead (should never be seen)Z    defunct ("zombie") process, terminated but not reaped by its parentFor BSD formats and when the stat keyword is used, additional characters may be displayed:<    high-priority (not nice to other users)N    low-priority (nice to other users)L    has pages locked into memory (for real-time and custom IO)s    is a session leaderl    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)+    is in the foreground process group

主要关注以下几个状态:

R (TASK_RUNNING)

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

S (TASK_INTERRUPTIBLE)

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

D (TASK_UNINTERRUPTIBLE)

与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。

Z(EXIT_ZOMBIE)

僵尸状态,此时进程相关资源已经被释放,但还保留着task_struct结构体。当父进程执行wait4调用获取其相关信息时,进程将变为DEAD状态人间蒸发。由于这个过程很短暂,所以很难捕捉到。


如上图所示,内核中大部分进程生命周期就在这些状态中转换。通过fork或者clone系统调用,产生新的进程。处于运行状态的进程由于需要等待资源,进入睡眠态,根据能不能被信号唤醒分为TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE两种,资源来临时进程会被wake_up变成TASK_RUNNING,进入rq队列等待调度器调度。进程执行任务完毕后主动退出或被信号杀死时,进入僵尸态等待父进程回收。


其他进程状态

除了上面介绍的那些进程状态外,task_struct的state还可以取其他的值。

/* Used in tsk->state: */
#define TASK_RUNNING                    0x0000
#define TASK_INTERRUPTIBLE              0x0001
#define TASK_UNINTERRUPTIBLE            0x0002
#define __TASK_STOPPED                  0x0004
#define __TASK_TRACED                   0x0008
/* Used in tsk->exit_state: */
#define EXIT_DEAD                       0x0010
#define EXIT_ZOMBIE                     0x0020
#define EXIT_TRACE                      (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_PARKED                     0x0040
#define TASK_DEAD                       0x0080
#define TASK_WAKEKILL                   0x0100
#define TASK_WAKING                     0x0200
#define TASK_NOLOAD                     0x0400
#define TASK_NEW                        0x0800
#define TASK_STATE_MAX                  0x1000/* Convenience macros for the sake of set_current_state: */
#define TASK_KILLABLE                   (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED                    (TASK_WAKEKILL | __TASK_STOPPED)
#define TASK_TRACED                     (TASK_WAKEKILL | __TASK_TRACED)

TASK_WAKEKILL:收到致命信号时,唤醒进程。调用vfork时,父进程就会处与
TASK_KILLABLE状态(TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)。

TASK_PARKED、TASK_WAKEKILL、TASK_NOLOAD、TASK_NEW都是内核为了实现一些特殊功能,而存在的特殊state,这里挖一个小坑不展开。


组织方式


除了这种树以外,内核还采用链表、hash table和radix tree来组织进程PCB。基树是一种节省空间的数据结构,利用它可以从pid找到task_struct的地址。

(二)进程管理之进程状态及组织方式相关推荐

  1. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

  2. 操作系统实验二 进程管理

    进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...

  3. 【操作系统实验】实验二 进程管理

    进程管理 实验2-1 使用fork创建进程 代码 实验2-2 使用exec替换子进程程序 代码 实验2-3 分析进程的父进程 代码 实验2-4 共享存储区机制进程通信 代码 实验2-5 消息队列实现进 ...

  4. linux内核笔记二 进程管理

    三.系统的进程管理 1.系统的进程运转方式 系统时间 (jiffies 系统滴答) cpu内部有一个RTC(系统的定时器),会在上电的时候调用mktime函数算出1970年一月一日0时开始到当前开机点 ...

  5. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  6. Linux进程管理:进程状态和CPU平均负载

    常见的linux进程状态如下: 关于源文件xmid,可以从Mind-Mapping获取 这里借助进程状态来描述一下linux系统中的平均负载的概念 当我们感觉到系统变慢时,通常通过top和uptime ...

  7. 计算机操作系统实验二 进程管理

    一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...

  8. 进程管理——查看进程状态

    1.uptime       使用uptime命令可显示系统当前时间.用户已登录系统的时间.系统中登录用户的数量.过去的1.5.15分钟内运行队列中的平均进程数量.   注意:通常,只要每个cpu的当 ...

  9. 操作系统(二 )| 进程管理初探(前趋图、程序执行、进程的定义特征基本状态,进程的创建终止,阻塞唤醒,挂起激活)

    文章目录 前趋图和程序执行 前趋图 程序的顺序执行 程序的并发执行 进程的定义和特征 进程的基本状态 就绪状态 运行状态 阻塞状态 挂起状态 进程控制块(PCB) 作用: 块中信息: PCB的组织方式 ...

最新文章

  1. day44前端开发1之html基础
  2. Pycharm的运行和简单调试
  3. linux怎样测试tty,linux – 提示自定义:如何检测何时没有tty
  4. 初中数学知识点总结_初中数学知识点总结大全_经典版_
  5. bash颜色、变量、数组、相关脚本示例
  6. js判断字符串是否为空_每日一课 | Python 如何判断一个字符串是否包含另一个字符串?...
  7. 【英语学习】【Level 07】U05 Best Destination L1 Float and shop
  8. (翻译)开始iOS 7中自动布局教程(二)
  9. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题
  10. java课题设计实验报告,JAVA简单记事本程序设计实验报告
  11. 【鲲鹏HCIA考试】随堂习题卷三
  12. jsp做看板_DataGear 使用静态HTML模板快速制作数据可视化看板
  13. 挺带劲!这款免费开源的监控系统真强大~
  14. 有关秩的等式和不等式
  15. 电脑计算机管理看AHCI,怎么将电脑硬盘模式修改为ahci模式?
  16. 如何使用eNSP模拟器连接本地虚拟机
  17. 京东物流 × StarRocks : 打造服务分析一体化平台Udata
  18. 博客园添加live2D看板娘和樱花飘落背景
  19. 让老版的MACBOOK支持SideCar
  20. 业务知识栈——社会保险业务系统—基础概览

热门文章

  1. ubuntu下配置msmtp+mutt发送邮件
  2. Android To get local formatting use getDateInstance(), getDateTimeInstance(), or getTimeInstance(),
  3. 哪有计算机课程,计算机基础课程的目标有以下哪几个( ? ?)
  4. Oracle DBA学习基础篇(一) Oracle体系结构 学习笔记
  5. python文件的打开模式有几种_以下选项中,不是Python打开文件模式的是( )_学小易找答案...
  6. 一些不错的开源代码网站
  7. java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
  8. supervisor 常见错误及其解决方案
  9. 如何把普通的五比四的照片做成5寸照片
  10. 发现魔方阵的一个有趣现象