进程资源和进程状态 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE

摘要:本文主要介绍进程资源和进程状态.进程资源由两部分组成:内核空间进程资源以及用户空间进程资源.进程状态,就绪/运行状态、等待状态(可以被中断打断)、等待状态(不可以被中断打断)、停止状态和僵死状态.

1.进程资源

    进程是Linux系统下资源管理的基本单位,每个进程都有自己的独立的运行空间.为了更好的管理Linux所访问的资源,系统引入了进程控制(PCB)的概念,PCB结构体.
    进程资源由两部分组成:内核空间进程资源以及用户空间进程资源.
    内核空间进程资源:指的就是PCB相关信息.包括进程控制块本身、打开的文件表项、当前目录、当前终端信息、线程基本信息、可访问内存地址、PID、PPID、UID、EUID等,也就是说内核通过PCB可以访问到进程所有的资源.这些资源只能通过系统调用才能访问到.进程退出后,资源由另一进程来回收.
    用户空间进程资源:通过成员mm_struct映射的内存空间.实质就是进程的代码段、数据段、堆、栈、以及可以共享访问的库的内存空间.这些资源进程可以直接访问.在进程退出时主动释放.在进程运行时,可以通过文件 /proc/{pid}/maps来产看可以访问的地址空间.

2.进程状态

    人生三大错觉之一:QQ、暴风影音、浏览器等可以一起运行,难道进程是并行运行的.非也非也.对于单CPU系统来说在某一时刻,只能有一个进程处于运行状态,占有CPU的使用权,其他进程都处于其他状态,等待系统资源,各进程根据调度算法在某些状态之间不停地的切换.但由于CPU处理效率较快,使用户感觉不到其中的变化.
    在Linux2.6内核中,用户级进程拥有以下几种状态:就绪/运行状态、等待状态(可以被中断打断)、等待状态(不可以被中断打断)、停止状态和僵死状态.
TASK_RUNNING:正在运行或处于就绪状态:就绪状态是指进程申请到了CPU以外的其他所有资源,正所谓:万事俱备,只欠东风.提醒:一般的操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在Linux下统一为 TASK_RUNNING状态.
TASK_INTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比如等待键盘输入、socket连接、信号等等),但可以被中断唤醒.一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态.毕竟皇帝只有一个(单个CPU时),后宫佳丽几千;如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来.
TASK_UNINTERRUPTIBLE:处于等待队伍中,等待资源有效时唤醒(比如等待键盘输入、socket连接、信号等等),但不可以被中断唤醒.
TASK_ZOMBIE:僵死状态,进程资源用户空间被释放,但内核中的进程PCB并没有释放,等待父进程回收.
TASK_STOPPED:进程被外部程序暂停(如收到SIGSTOP信号,进程会进入到TASK_STOPPED状态),当再次允许时继续执行(进程收到SIGCONT信号,进入TASK_RUNNING状态),因此处于这一状态的进程可以被唤醒.
用户级进程之间的状态切换关系如图2所示.

  进程资源和进程状态 TASK_RUNNING TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE_第1张图片
图2 用户进程状态切换图

笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.

-- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(GNU/Linux环境编程,GNU/Linux环境高级编程)