CHS_02.2.1.2+进程的状态与转换

CHS_02.2.1.2+进程的状态与转换

  • 进程的状态和转换
    • 进程的状态——创建态、就绪态
    • 进程的状态——运行态
    • 进程的状态——阻塞态
    • 进程的状态——终止态
  • 进程状态的转换
    • 进程的状态
    • 进程的组织——链接方式
    • 进程的组织——索引方式
  • 进程的组织
  • 知识回顾

进程的状态和转换

CHS_02.2.1.2+进程的状态与转换_第1张图片

那我们会介绍进程所拥有的各种各样的状态 和他们之间在什么情况下需要转换
另外 我们还会介绍进程的组织方式的问题 也就是各个进程的pcb之间要
用什么样的方式把它们组织起来这样的一个问题

那首先我们来看一下进程有哪些状态

进程的状态——创建态、就绪态

CHS_02.2.1.2+进程的状态与转换_第2张图片

在上个小节当中我们提到过 其实我们的程序 也就是可执行文件 平时是存放在硬盘里的

而当这个程序想要执行的时候 需要把这个可执行文件把它调入内存 同时呢 操作系统会为它建立相应的pcb 也就是建立一个相应的进程

那当一个进程正在被创建的这个期间 这个进程的状态就是处于创建态

在这个阶段 操作系统会给这个进程分配相应的系统资源 比如说给他分配一些内存空间 另外呢 在这个阶段 操作系统也会完成对pcb的一个初始化的工作

而当一个进程完成了创建工作之后 他就会进入一个新的状态 叫做就绪态

处于就绪态的进程其实是已经具备了运行的条件 只不过此时cpu比较忙 他还没有空闲 所以cpu暂时不能
为这个进程服务 那一个系统当中可能会有很多很多个处于就序态的进程

那么 当cpu空闲的时候 操作系统就会从这些处于就绪态的进程当中选择其中的一个 让他上cpu运行

而如果一个进程此时正在cpu上运行的话 那么这个进程就处于运行态

进程的状态——运行态

CHS_02.2.1.2+进程的状态与转换_第3张图片

那么 经过之前的学习 我们知道 一个进程它正在运行意味着此时cpu正在处理这个进程背后的那个程序 也就是cpu正在执行这个进程相应的那些指令序列

比如说cpu执行了进程二的指令一指令二指令三那我们假设此时进程二的指令三是发出了一个系统调用

而这个系统调用是请求操作系统给他分配打印机资源 而此时打印机设备他很忙 他正在为别的精神服务

所以这个打印机资源暂时不能分配给进程二所以这个进程二接下来的这个指令也就是要往打印机输出数据 这条指令就

没办法往下执行 那既然这个进程接下来的这些指令暂时不能往下执行的话 那么显然我们不应该让这个进程一直占用着cpu资源

所以 类似于刚才我们所说的这种情况 很多时候进程在运行的过程当中有可能会请求等待某个事件的发生

比如说像刚才我们所说的 他会等待系统给他分配某一种系统资源 或者他需要等待其他进程的响应等等

总之 这个进程在运行的过程当中有可能会主动的请求等待某个事件的发生

进程的状态——阻塞态

CHS_02.2.1.2+进程的状态与转换_第4张图片

而当这个事件发生之前 这个进程是没有办法继续往下执行的 所以在这个时候操作系统就会剥夺这个进程对cpu的使用权 让这个进程下cpu 并且让他进入到一个新的状态叫做阻塞态
也就是说 这个进程因为等待某个事件而被阻塞了 那当这个cpu再次空闲之后 操作系统又会选择一道处于就绪态的进程 让他上cpu运行

接下来的故事是这样的 这个打印机设备之前不是正在为别的进程服务吗

那如果说这个打印机的服务已经结束 那这个打印机就会空闲下来 所以当打印机空闲下来的时候 他就可以分配给刚才请求打印机的那个进程 也就是进程二

所以当操作系统把这个打印机资源分配给进程二的时候 这个进程二等待的事件其实就已经发生了

此时 操作系统会让这个进程二从阻塞态再次回到就绪态

也就是说 当他等待的这个事件发生了之后 这个进程就再次

拥有了上处理机运行的条件 那我们让这个故事继续下去 假设

此时正在cpu上运行的这个进程进程一他已经运行结束了 那在他运行结束的时候 他会发出一个叫做exit的

系统调用 那这个系统调用其实就是要请求操作系统终止这个进程

进程的状态——终止态

那此时这个进程的状态就会变成终止态 然后操作系统会让这个进程下cpu
CHS_02.2.1.2+进程的状态与转换_第5张图片

并且做一系列的善后的工作 他会回收这个进程所占有的各种资源 包括什么内存空间啊 什么打印机设备啊 等等

总之 所有的资源都需要回收 并且最后他还会回收这个进程的pcb

而当终止进程的这些工作完成了之后 这个进程就从这个系统当中彻底消失了

好的 那么我们再用一个图 把刚才所提到的这些进程的状态和他们的转换再给串一下

进程状态的转换

CHS_02.2.1.2+进程的状态与转换_第6张图片

一个进程在运行之前需要被创建 在创建的过程当中 系统会完成一系列相应的工作 包括

新建pcb 还有给这个进程分配一系列的资源等等 那如果一个进程正在被创建的话 那这个进程此时就是处于创建态的

当一个进程被创建完毕之后 他就拥有了可以上处理机上cpu运行的

这种条件 那这个时候进程就进入了就绪态 也就是说处于就绪态的进程

他其实只差处理机这种资源 其他他所需要的资源他已经都具备了

那如果处于就绪态的一个进程被操作系统调度 那这个进程就可以上处理机运行

当他在处理机上运行的时候 他就处于运行态 也就说 正在处理机上运行的进程其实是

既拥有了他所需要的其他所有的那些条件和资源 同时他也拥有了处理机这种资源

而有的时候 正在运行的进程可能会请求等待某些事件的发生

在这个事件发生之前 这个进程是没有办法继续往下执行的 所以 在这种情况下

进程不应该一直占用着处理机资源 所以此时这个进程应该被剥夺处理机资源

同时 除了处理及资源之外 他还在等待其他的某一种资源 或者说等待其他的某一种事件的发生

那如果说处于阻塞态的进程 他等待的事件发生了 那这个进程就可以从阻塞态又回到就绪态

那当他回到就绪态 就说明这个进程他已经拥有了除了处理机之外的所有的他想要的那些资源

所以从刚才的这个讲解过程当中 我们会发现 运行态到阻塞态的这个转换其实是进程自身主动的

一种选择主动的行为 一般来说都是进程通过系统调用的方式来申请某一种

系统资源或者请求等待某个事件的发生 所以这个转换的过程是进程主动选择的

而阻塞态到就序态的转变 他并不是进程自身能够控制的 比如说一个进程 他正在等待打印机资源 那么这个打印机资源什么时候分配给他 这并不是这个进程能够说了算的

所以阻塞态到就序态的转换它是一种被动的行为 它并不是进程自己可以控制的
所以大家需要注意的是 一个进程不可能直接从阻塞态转换为运行态

也不可能直接从就绪态转换为阻塞态 因为进程要变成阻塞态 那肯定是需要进程主动请求
而进程要发出这种主动请求 那就意味着这个进程肯定是正在cpu上运行 才可能发出这种主动请求 所以说只可能从运行态转换成阻塞态

而不可能从就绪态转换成阻塞态 那在之前的讲解中我们也提到过处于运行态的进程 它可以主动的请求运行结束

或者说 如果一个进程 他在运行的过程当中遇到了一些不可修复的错误 比如说整数除以零这样的错误

那在这种情况下 这个进程也应该被终止 那在操作系统对这个进程做相应的

终止工作的时候 这个进程就处于终止态 此时操作系统会回收进程所拥有的各种资源

并且会撤销他的pcb 那最后我们还要强调一个刚才没有提到的状态的转换
有的时候 进程可以直接从运行态转换成就绪态 比如说操作系统给进程分配的时间片用完了的时候

进程就会从运行态转换成就绪态 什么叫时间片用完呢 还记不记得我们在第一章当中提到过时钟中断

一个进程本来正在处理机上运行的好好的 但是此时如果cpu受到一个
时钟中断的信号 然后发现这个进程已经运行了很长时间了 不应该让他继续往下执行了
那这种情况就是所谓的时间片到时间片用完的一个状态 此时这个进程就应该被剥夺cpu的使用权
让他从运行态又回到就绪态
因为在这种情况下 其实进程他还是拥有继续往下执行的条件
他只不过是被剥夺了处理机而已
他并不需要在等待除了处理机之外的其他的事件发生

因此 进程是从运行态回到了就绪态 那我们在这涉及到了进程的五个状态

这就是经典的进程五状态模型 也有同学把这个模型称为丁字库模型 也确实很形象

进程的状态

CHS_02.2.1.2+进程的状态与转换_第7张图片

那在这五种状态当中 运行态就绪态阻塞态是基本状态 因为进程的整个生命周期当中其实大部分的时间啊 它是处于这三种状态的 所以他们是基本状态

另外 这需要强调一点 在单cpu的环境下 处于运行态的进程同一时刻最多只会有一个

而如果系统是多核cpu的话 那么就意味着多个进程可以并行的运行 那在这种情况下 就会有多个进程处于运行态

另外一点需要强调的是 阻塞态又可以称为等待态 创建态又可以叫新建态 终止态又可以叫结束态

所以他们的这些别名大家也稍微注意一下 那操作系统是怎么记录进程的这些状态的呢

其实在上个小节当中我们有提到过 在进程的pcb当中会有一个变量state

这个state就是用来表示进程的当前状态 比如说 我们可以用一表示 它处于创建态

然后 二表示它处于旧序台等等 另外 呢 操作系统会把处于同一个状态的

各个进程把他们的pcb有规律的组织起来 然后这样的话可以方便统一的管理

所以怎么把各个进程的pcb组织起来 这个问题就是进程的组织想要探讨的问题

那进程的组织方式有这样的两种一种是链接方式 一种叫索引方式 其实都很好理解

进程的组织——链接方式

CHS_02.2.1.2+进程的状态与转换_第8张图片

链接方式就是指啊操作系统会管理一系列的队列 那每个队列都会指向

相应状态的这些进程的pcb比如说有个执行指针 它指向的这个pcb就是

此时 处于运行态的进程的pcb 而就需对列指针它所指向的这个对列
CHS_02.2.1.2+进程的状态与转换_第9张图片

就是此时系统当中处于就绪态的这一些的进程 pc b对列 那为了方便对这些就绪进程的调度操作系统

经常会把优先级更高的那些进程的pcb放在这个对列的对头 那阻塞对列指针也一样

它指向的就是此时处于阻塞状态的那些进程的pcb 而在很多操作系统当中 它还会根据阻塞原因的不同

再把阻塞队列分成多个 比如说像这个样子这两个进程 他们是因为正在等待打印机资源而阻塞的

所以他们会放在等待打印机的这个阻塞队列当中 而这个进程他是正在等待磁盘这种资源 所以他放在了等待磁盘的这个阻塞队列当中

总之 操作系统用这样的方式把各个状态的进程pcb把它们

有规律的组织起来 这样可以方便操作系统对这些进程进行统一的管理

进程的组织——索引方式

CHS_02.2.1.2+进程的状态与转换_第10张图片

那除了链接方式之外 另一种组织方式叫做索引方式 操作系统会给各种状态的

进程建立相应的索引表 然后每一个索引表的表项也会指向相应的一个pcb 就像这个样子

那索引方式通过这张图就很容易理解了 但是大多数的操作系统都是使用的链接方式

所以这个地方有个简要的了解就可以了 那进程的组织方式这一块的内容大家只要稍微有个印象就可以

进程的组织

CHS_02.2.1.2+进程的状态与转换_第11张图片

总之 他回答的就是操作系统应该怎么把各个进程的pcb把它们组织起来这样的一个问题

那这个小节当中更值得注意的还是进程的状态 还要进程状态之间的转换这样的问题

那希望大家能够主动的去通过课后习题再对这一部分的内容进行巩固和理解

好的 那么以上就是这个小节的全部内容

知识回顾

CHS_02.2.1.2+进程的状态与转换_第12张图片

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

你可能感兴趣的:(操作系统,第二章进程与线程,#,进程与线程,java,服务器,linux,操作系统)