进程的三种基本状态及其转换

本文介绍了进程的三种基本状态:就绪状态、执行状态和阻塞状态,并详细解释了不同状态之间的转换过程。

进程的基本状态:

①就绪(Ready)状态

当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。

②执行状态

进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。

③阻塞状态

正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

进程三种状态间的转换

就绪→执行处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
执行→就绪处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
执行→阻塞正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
阻塞→就绪处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

1.目的: 自行编制模拟程序,通过形象化的状态显示,深入理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。 2. 内容及要求: 1) 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2) 独立编写、调试程序。进程的数目、进程状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。 3) 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程基本信息、控制信息、资源需求及现场信息。 4) 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。 5) 代码书写要规范,要适当地加入注释。 6) 认真进行预习,完成预习报告。 7) 实验完成后,要认真总结,完成实验报告。 3.使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB块。
### 代码概述 使用 Python 编写一个模拟进程三种基本状态(就绪、执行、阻塞)及其转换过程的程序。通过事件触发状态变迁,体现操作系统中进程管理的核心机制。 --- ### 代码解析 ```python class ProcessStateSimulation: # 定义进程三种基本状态 READY = "就绪" RUNNING = "执行" BLOCKED = "阻塞" def __init__(self, pid): self.pid = pid self.state = ProcessStateSimulation.READY print(f"进程 {self.pid}: 初始化为「{self.state}」状态") def transition_to_running(self): """从就绪 -> 执行:由进程调度引起""" if self.state == ProcessStateSimulation.READY: self.state = ProcessStateSimulation.RUNNING print(f"进程 {self.pid}: 被调度,转入「{self.state}」状态") else: print(f"进程 {self.pid}: 当前处于「{self.state}」状态,无法转入执行") def transition_to_blocked(self): """从执行 -> 阻塞:由I/O请求等事件引起""" if self.state == ProcessStateSimulation.RUNNING: self.state = ProcessStateSimulation.BLOCKED print(f"进程 {self.pid}: 发起I/O请求,转入「{self.state}」状态") else: print(f"进程 {self.pid}: 只有执行状态才能转入阻塞") def transition_to_ready_from_blocked(self): """从阻塞 -> 就绪:由I/O完成引起""" if self.state == ProcessStateSimulation.BLOCKED: self.state = ProcessStateSimulation.READY print(f"进程 {self.pid}: I/O完成,转入「{self.state}」状态") else: print(f"进程 {self.pid}: 当前未阻塞,无法因I/O完成转为就绪") def transition_to_ready_from_running(self): """从执行 -> 就绪:由时间片用完引起""" if self.state == ProcessStateSimulation.RUNNING: self.state = ProcessStateSimulation.READY print(f"进程 {self.pid}: 时间片用完,转入「{self.state}」状态") else: print(f"进程 {self.pid}: 只有执行状态才会因时间片完转为就绪") def get_current_state(self): return self.state # === 演示进程状态转换过程 === if __name__ == "__main__": p = ProcessStateSimulation(1) p.transition_to_running() # 就绪 -> 执行 p.transition_to_ready_from_running()# 执行 -> 就绪(时间片完) p.transition_to_running() # 就绪 -> 执行 p.transition_to_blocked() # 执行 -> 阻塞(I/O请求) p.transition_to_ready_from_blocked()# 阻塞 -> 就绪(I/O完成) p.transition_to_running() # 就绪 -> 执行 ``` --- ### 运行结果示例: ``` 进程 1: 初始化为「就绪」状态 进程 1: 被调度,转入「执行」状态 进程 1: 时间片用完,转入「就绪」状态 进程 1: 被调度,转入「执行」状态 进程 1: 发起I/O请求,转入「阻塞」状态 进程 1: I/O完成,转入「就绪」状态 进程 1: 被调度,转入「执行」状态 ``` --- ### 知识点 1. **进程三态模型**:就绪、执行、阻塞是进程基本状态状态之间由特定事件驱动转换。 2. **状态转换条件**:调度 → 执行;时间片完 → 就绪;I/O请求 → 阻塞;I/O完成 → 就绪。 3. **事件驱动设计**:通过方法封装状态变化逻辑,体现操作系统内核对进程的控制机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值