进程间的状态切换

这篇博客介绍了进程的三状态模型——运行态、就绪态和阻塞态,详细阐述了状态之间的切换过程,如就绪态到运行态、运行态到就绪态、运行态到阻塞态以及阻塞态到就绪态的转换。同时,文章还探讨了Linux操作系统中的7种进程状态,包括运行状态、睡眠状态、磁盘休眠状态、停止状态、追踪停止状态、死亡状态和僵尸状态,以及这些状态的转换情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在任意时刻下,通常只有一个进程可以被加载到计算机的CPU上运行。

三状态模型

任何一个进程在它的生命周期内都会处于下面三种状态,使用这三种状态可以简单描述运行在计算机上的进程之间的状态切换,进程的一生都处在这三种状态间相互转换。

  • 运行态(Running):指该进程正在被CPU调度运行。
  • 就绪态(Ready):指该进程满足被CPU调度的所有条件但此时并没有被调度执行。
  • 阻塞态(Blocked):指该进程正在等待某事件的发生之后才可以继续被CPU调度运行。

三状态模型之间的切换

CPU在调度进程时,只会去操作系统维护的处于就绪态的进程PCB链表中调度,所以三状态模型之间的切换只有4种切换方式:

  • 就绪态—>运行态:当操作系统的调度程序从就绪态的链表中调度一个进程时,该进程的进程状态就会被切换为运行态,与此同时CPU即会开始运行此进程。
  • 运行态—>就绪态:当一个进程的时间片到达,CPU必须去调度下一个进程时,此时处于运行态的进程的进程状态就会被切换为就绪态并重新进入操作系统就绪态的进程链表。
  • 运行态—>阻塞态:当CPU正在运行一个进程时,该进程此时需要等待一个时间的完成才能继续运行(例如:程序的I/O流 …),这时操作系统就会将该进程的进程状态切换为阻塞状态,直到进程所需要的等待事件完成。
  • 阻塞态—>就绪态:进程从运行态直接切换为阻塞态,当进程所需要的事件完成之后,操作系统不会直接将该进程的状态切换为运行态,而是将该进程的状态切换为就绪态,等待CPU的调度。

FE8Sfg.png

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 */ 
};

从Linux源码中可以看出,Linux下有7中进程状态:

  • R运行状态(Running):处于运行状态的进程并不带表一定就正在被CPU调度运行,它包括了正在被CPU运行的进程和可以被CPU调度运行的程序,也就是说改状态包含了三状态模型中的就绪态和运行态。
  • S睡眠状态(Sleeping):处于改状态的进程表示该进程正在等待某时间的完成,通常也称为可中断睡眠状态,该状态属于三状态模型中的阻塞态。
  • D磁盘休眠状态(disk sleep):该状态也叫做不可中断睡眠状态,处于该状态的进程通常都在等待I/O操作的结束,该状态也属于三状态模型中的阻塞态。
  • T停止状态(stopped):我们可以通过向进程发送SIGSTOP信号让目标进程处于停止状态,通过向处于停止状态的进程发送SIGCON信号让目标进程继续运行,该状态也属于三状态模型中的阻塞态。
  • t追踪停止状态(tracing stop)
  • X死亡状态(dead):该状态只是一个返回状态,不会在任务列表中见到,该状态属于退出状态。
  • Z僵尸状态(zombie):当一个进程退出,但它的父进程并没有去收回该进程的信息时,该进程所处的状态叫做僵尸状态,该状态属于退出状态。

Linux系统进程状态间的切换

FEaoQS.png

创建一个新进程,操作系统会为该新进程创建一个空白PCB(task_struct),用来存储该进程的各项信息。

<think>嗯,用户现在问的是进程的三个状态以及它们之间的切换。之前用户问过文法二义性和语言二义性,可能是在学习操作系统相关的知识,现在转到了进程管理这一块。需要先确认进程的三个基本状态是什么。通常来说,进程的三个主要状态是就绪、运行和阻塞,但有时候不同的教材可能会有不同的划分,比如有些会提到新建态和终止态,但用户这里明确说是三个状态,所以应该按照经典的三态模型来回答。 首先,要明确每个状态的定义。就绪状态进程已经准备好,只等调度器分配CPU时间;运行态是进程正在CPU上执行;阻塞态是进程在等待某个事件,比如I/O完成。状态之间的切换需要哪些触发条件呢? 接下来,用户可能需要知道状态切换的原因。比如,从运行到阻塞可能是因为进程发起了I/O请求,或者等待某个资源;从运行到就绪可能是因为时间片用完或被更高优先级的进程抢占;从阻塞到就绪则是当等待的事件完成,比如I/O操作结束,此时进程重新具备运行条件,但需要等待调度器分配CPU。 另外,可能需要考虑是否有遗漏的状态或者是否需要补充其他相关状态。但用户明确提到三个状态,所以应该专注于这三个。同时,是否需要图示?可能用文字描述更合适,但用户可能希望例子更具体。 需要检查是否每个转换都有例子,比如运行态到阻塞态的例子可以是请求文件读取,而阻塞到就绪可以是文件读取完成。同时,时间片用完导致运行态转为就绪态,这也是常见的例子。 还要注意术语的一致性,比如“阻塞”有时也被称为“等待”状态,但应该使用用户可能熟悉的术语。另外,是否需要提到调度程序的作用?比如,当进程从运行转为就绪时,调度程序会选择下一个进程运行。 可能用户在学习进程管理时,需要理解这些状态转换如何影响操作系统的调度和资源分配。因此,在回答中强调这些转换的实际意义和影响会更好。比如,阻塞状态释放CPU,让其他进程运行,提高系统效率。 另外,是否应该提到多线程或多进程环境下的情况?可能暂时不需要,保持回答简洁,专注于三个状态的转换。 总结来说,回答的结构应该先介绍三个状态的定义,然后用箭头图表示转换关系,再详细说明每个转换的条件和例子。确保语言清晰,例子具体,帮助用户理解进程状态的变化过程及其背后的原因。</think>以下是关于进程三个状态及其切换的详细说明: --- ### **进程的三种基本状态** 在操作系统中,进程的生命周期可归纳为三个核心状态: 1. **就绪态(Ready)** - **定义**:进程已获得所需资源(除CPU外),**准备好被调度执行**,等待分配CPU时间片。 - **特点**: - 多个进程可同时处于就绪态,形成**就绪队列**。 - 例如:进程A因时间片耗尽退出运行态,进入就绪态等待下次调度。 2. **运行态(Running)** - **定义**:进程**正在CPU上执行指令**。 - **特点**: - 单核CPU同一时刻仅一个进程处于运行态。 - 例如:进程B被调度器选中,从就绪态转为运行态。 3. **阻塞态(Blocked/Waiting)** - **定义**:进程因**等待某事件(如I/O完成、信号量释放)**而暂停执行,主动让出CPU。 - **特点**: - 不参与CPU竞争,直到等待的事件发生。 - 例如:进程C请求读取磁盘文件,进入阻塞态等待I/O操作完成。 --- ### **状态间的切换条件** 进程状态转换由**事件触发**,具体规则如下: #### **1. 就绪态 → 运行态** - **触发条件**: - 调度器选中该进程,为其分配CPU时间片。 - **示例**: - 进程A在就绪队列中等待,被调度算法(如轮转调度)选中后开始执行。 #### **2. 运行态 → 就绪态** - **触发条件**: - **时间片耗尽**:进程用完分配给它的CPU时间。 - **更高优先级进程抢占**:系统强制剥夺当前进程的CPU使用权。 - **示例**: - 进程B执行时,时间片到期,被迫让出CPU并回到就绪态。 #### **3. 运行态 → 阻塞态** - **触发条件**: - 进程主动**请求等待资源**(如发起I/O操作、申请互斥锁)。 - 进程**需要外部事件触发**(如等待用户输入)。 - **示例**: - 进程C调用`read()`函数读取文件,进入阻塞态直到磁盘返回数据。 #### **4. 阻塞态 → 就绪态** - **触发条件**: - **等待的事件完成**(如I/O操作结束、信号量被释放)。 - **示例**: - 进程D等待的网络数据包到达,操作系统将其移回就绪队列。 --- ### **状态转换示意图** ``` (事件完成) 阻塞态 ←----------- 就绪态 ↑ | | (等待事件) ↓ (调度分配) 运行态 ---------→ 就绪态 (时间片耗尽/抢占) ``` --- ### **实际意义与扩展** 1. **提高CPU利用率**: - 阻塞态进程让出CPU,使其他进程能及时执行,避免CPU空闲。 2. **多任务协作**: - 状态切换机制支持多个进程并发执行(如浏览器渲染页面时,后台下载文件)。 3. **扩展状态(补充)**: - **新建态(New)**:进程刚被创建,尚未进入就绪队列。 - **终止态(Terminated)**:进程执行结束,等待资源回收。 --- ### **示例场景** 1. **Web服务器处理请求**: - 运行态:处理HTTP请求。 - 阻塞态:等待数据库查询结果。 - 就绪态:查询完成,等待CPU继续生成响应。 2. **视频播放器缓冲**: - 运行态:解码视频帧。 - 阻塞态:等待网络数据填充缓冲区。 - 就绪态:缓冲区有数据后,等待解码。 --- 通过状态切换,操作系统实现了高效的资源管理与多任务调度,这是现代计算系统并发能力的核心基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值