【Linux】进程状态

发布于:2022-11-07 ⋅ 阅读:(884) ⋅ 点赞:(0)

🌈前言

本篇文章进行操作系统中进程状态的学习!!!


🌷1、进程状态

🌸1.1、概念

凡是学进程,都要想到进程控制块(PCB) – task_struct

  • 在学习OS中的进程状态时,书上的描述为了在Linux、Windows、Android中都能说的通,往往加深了理解的难度

  • 我们可以先学习具体的Linux进程状态,然后再介绍然后再介绍OS学科的状态如何理解

  • 操作系统是计算机中的一门“哲学”,要考虑很多情况

贴几张不同的进程状态图

在这里插入图片描述

在这里插入图片描述


🌹1.2、具体的进程状态

具体的进程状态可以分为四种:

  1. 运行态:进程只要被加载到运行队列中

如何理解进程被加载到运行队列中?

  • 运行队列也是一个对象,也可以通过描述再组织进行管理

  • 运行队列的属性其中有PCB指针,可以通过队列的性质或复杂的数据结构进行管理

  • 调度器的主要作用是在就绪队列中选择优先级最高的任务运行,如果优先级最高的任务不止一个,则选择队头的任务运行

  • 当运行队列中的进程被调度时,CPU会执行该进程的代码

在这里插入图片描述


  1. 终止态:进程已经终止,但还存在,只是永远不运行了,随时等待被释放

进程都已经终止了,为什么不立刻释放资源,而要维护一个终止态呢?

  • 因为释放进程的资源需要时间

  • CPU不可能一直盯着这个进程,可能还会在做其他事情,所以要维护一个终止态

  • 例子:比如你去吃饭,吃完后,叫老板结账,老板可能没回应你,他可能在给别人点餐


  1. 阻塞态:进程在等待某种资源时(非CPU资源),资源没有就绪的时候,该进程会到对应的资源等待队列中进行排队,该进程的代码并没有运行,就叫做"阻塞态"
  • 一个进程在被CPU执行的时候,用的不仅仅是CPU的资源

  • 进程可能申请更多的资源,如:磁盘、网卡、显卡、显示器资源和声卡资源等等…

  • 申请对应的资源无法满足时,是需要排队的,比如:CPU资源在运行队列中排队

  • 申请其他慢设备的资源在对应的队列中进行排队

在这里插入图片描述


  1. 挂起态:当内存不足时,OS会将短期内不会被调度的进程的数据和代码挪动到磁盘中的swap分区,当内存足够时,会重新加载到内存中

在这里插入图片描述


🍀1.3、Linux进程状态

Linux内核源代码中的状态

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = 
{
	"R (running)", /* 0 */
	"S (sleeping)", /* 1 */
	"D (disk sleep)", /* 2 */
	"T (stopped)", /* 4 */
	"t (tracing stop)", /* 8 */
	"X (dead)", /* 16 */
	"Z (zombie)", /* 32 */
};
  • R (running)运行状态:进程是在运行中或在运行队列中

  • S (sleeping)睡眠状态:意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)

  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束

  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行

  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态