当前课程知识点:操作系统(RISC-V) > 第九讲 进程和线程 > 9.4 三状态进程模型 > 9.4 三状态进程模型
下面我们来介绍三状态进程模型
在前面我们介绍的进程状态当中
我们已经说到了
进程主要的几种状态
实际上这时候呢主要的
这个就绪运行阻塞或者叫等待
这三种状态搁在里头呢就构成了
我们这里的三状态进程模型
那如果大家看这个图的话
那这个图里呢不止三种
还多了一个创建和退出
但是从整个进程
生命周期来讲核心的状态
是这个就绪运行和等待
那这三种状态呢是
我们这个三状态进程模型里的核心
这每种状态的含义是什么呢
运行是指进程
正在处理机上执行
那这是第一种
然后第二种状态呢是就绪
就绪是指
进程获取了除处理器以外资源
等待得到处理机就可以开始运行了
而等待呢
是指进程在等待
某一个事件的出现而暂停的状态
那这三种状态之外呢
再有两种辅助的状态
一个是创建这个状态呢
是一个过渡的状态
进程正在被创建
还没有完成
这个创建的过程
也就是它的分配资源
分配资源和相应的数据结构
完成初始化之后
那它就放在就绪队列里
这个创建的过程就结束了
每个进程呢在整个生命周期当中
它只会进来一次创建
然后还有一个退出
退出呢是指进程正从系统当中消失
也就是说系统正在回收它的资源
那在这个状态里头呢
它会是进程结束的最后的这个阶段
这五个状态呢是
我们三状态进程模型里的状态
在这个状态之外呢
之间呢我们有相应的状态的变迁
这里的变迁我们依次来介绍它的含义
启动实际上是指我进入到创建状态的
这是一个触发条件
我一个新的进程被创建出来
创建它的目的是为了执行一个程序
好程序进程创建的过程
创建完成了
那这时候就导致一个状态的变迁
那这就是由创建到就绪状态
这个变迁呢是指你的创建工作已经结束
就等待CPU的这个资源
有了CPU这个资源之后
它就可以开始运行了
而被调度这个变迁呢
是指我们在就绪队列里
选择出某一个适合运行的进程
然后分配给处理机然后
它就可以开始运行了
这是呢由就绪到运行的状态变迁
再有一个是运行到结束
这是指这个进程
已经完成或者说出错
那这时候呢由操作系统开始去
回收它的资源的触发操作
而从运行到就绪呢就是我们这里
这里标的是时间片用完
如果是被抢先的话
也是这两者之间的一个变迁
在这个变迁里头呢
那进程的状态是由运行回到了就绪
运行到等待呢
是指正在运行的进程
要等待某一个资源
而这个资源呢现在还没有
那这时候由此而进入等待
它无法正常运行
最后一个等待到就绪
进程要等待的事件出现了
到达了那这时候呢他就有阻塞
由等待变成了就绪状态
那我们在说这些
状态的变迁的时候呢
如果说我们在操作系统
你看它实际代码
你主要需要看的就是
这些状态的初始
它是在什么时间出现的
那你要找的关键代码呢就是
这些状态的标识的出现
比如说我们任何一个进程它开什么
开始是指我给它分配一个
唯一的进程标识
那这时候你就找到它
创建所在的位置了
而一个进程结束呢
是指它的进程ID PCB被回收
那这时你找到它的结束状态
而在中间呢
我们在进程控制块里头
都有一个成员叫做它的状态
那么这时候你去看那个状态的赋值
就能看到当前进程所在的状态
而这些对应着的这些变迁
你都应该能够在
进程状态的变迁过程当中
找到相应的关键代码来知道
我这个变迁是在什么地方进行的
好有了这些呢
我们就讨论清楚了三状态进程模型
-1.1 课程概述
--课程概述
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-1.8 OS实验概述
--视频
-2.1 从OS角度看计算机系统
-2.2 从OS角度看RISC-V
-2.3 Rust语言与系统编程
-2.4 RISC-V CPU启动
-2.5 RISC-V CPU启动进一步分析
-3.1 基本概念与原理
-3.2 硬件架构支持
-3.3 中断处理机制
-3.4 系统调用
--3.4 系统调用
-4.1 计算机体系结构和内存层次
-4.2 地址空间和地址生成
-4.3 连续内存分配
-4.4 碎片整理
--4.4 碎片整理
-4.5 伙伴系统
--4.5 伙伴系统
-4.6 SLAB分配器
-5.1 非连续内存分配的需求背景
-5.2 段式存储管理
-- 5.2 段式存储管理
-5.3 页式存储管理
-5.4 页表概述
--5.4 页表概述
-5.5 快表和多级页表
-5.6 RISC-V页映射机制
-5.7 使能RISC-V页表
-6.1 虚拟存储的需求背景
-6.2 覆盖和交换
-6.3 局部性原理
-6.4 虚拟存储概念
-6.5 虚拟页式存储
-6.6 缺页异常
--6.6 缺页异常
-6.7 RISC-V缺页异常
-7.1 页面置换算法的概念
-7.2 最优算法、先进先出算法和最近最久未使用算法
-7.3 时钟置换算法和最不常用算法
-7.4 Belady现象和局部置换算法比较
-7.5 页表自映射
-8.1 工作集置换算法
-8.2 缺页率置换算法
-8.3 抖动和负载控制
-8.4 面向缓存的页替换算法
-9.1 进程的概念
-9.2 进程控制块
-9.3 进程状态
--9.3 进程状态
-9.4 三状态进程模型
-9.5 挂起进程模型
-9.6 线程的概念
-9.7 用户线程
--9.7 用户线程
-9.8 内核线程
--9.8 内核线程
-9.9 进程地址空间与熔断 (meltdown) 漏洞
-10.1 进程切换
-10.2 进程创建
-10.3 进程加载
-10.4 进程等待与退出
-10.5 rCore进程和线程控制
-11.1 处理机调度概念
-11.2 调度准则
-11.3 先来先服务、短进程优先和最高响应比优先调度算法
--11.3 先来先服务、短进程优先和最高响应比优先调度算法
-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-11.5 实时调度
-11.6 优先级反置
-11.7 rCore调度框架
-12.1 对称多处理与多核架构
-12.2 多处理器调度概述
-12.3 O(1)调度
-12.4 CFS调度
-12.5 BFS调度算法
-13.1 背景
--13.1 背景
-13.2 现实生活中的同步问题
-13.3 临界区和禁用硬件中断同步方法
-13.4 基于软件的同步方法
-13.5 高级抽象的同步方法
-14.1 信号量
--14.1 信号量
-14.2 信号量使用
-14.3 管程
--14.3 管程
-14.4 哲学家就餐问题
-14.5 读者-写者问题
-14.6 Rust语言中的同步机制
-15.1 死锁概念
-15.2 死锁处理方法
-15.3 银行家算法
-15.4 死锁检测
-15.5 并发错误检测
-16.1 进程通信概念
-16.2 信号和管道
-16.3 Linux信号机制
-16.4 消息队列和共享内存
-16.5 D-Bus机制
-16.6 Binder机制
-17.1 文件系统和文件
-17.2 文件描述符
-17.3 目录、文件别名和文件系统种类
-17.4 虚拟文件系统
-17.5 文件缓存和打开文件
-17.6 文件分配
-17.7 空闲空间管理和冗余磁盘阵列RAID
-18.1 FAT文件系统
-18.2.1 EXT4文件系统-历史
-18.2.2 EXT4文件系统-支持大容量存储
-18.2.3 EXT4文件系统-支持恢复异常
-18.3 ZFS文件系统
-19.1 I/O特点
-19.2 I/O结构
-19.3 I/O数据传输
-19.4 磁盘调度
-19.5 Linux I/O子系统
-20.1 Linux内核错误分析
-20.2.1 用rust写操作系统-系统编程语言rust
--20.2.1 用rust写操作系统-系统编程语言rust
-20.2.2 用rust写操作系统-rust与操作系统开发
--20.2.2 用rust写操作系统-rust与操作系统开发
-21.1 Background
-21.2 Futures in Rust
-21.3 Generators and async/await
--21.3 Generators and async/await
-21.4 Self-Referential Structs & Pin
--21.4 Self-Referential Structs & Pin
-21.5 Waker and Reactor
-22.1 Overview
-22.2.1 How VMM works - CPU
-22.2.2 How VMM works - memory & I/O