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

2024-01-14 11:04
文章标签 转换 进程 状态 1.2 chs 02.2

本文主要是介绍CHS_02.2.1.2+进程的状态与转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

进程的状态和转换

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

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

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

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

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

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

进程的状态——运行态

在这里插入图片描述

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

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

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

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

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

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

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

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

进程的状态——阻塞态

在这里插入图片描述

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

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

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

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

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

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

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

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

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

进程的状态——终止态

那此时这个进程的状态就会变成终止态 然后操作系统会让这个进程下cpu
在这里插入图片描述

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

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

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

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

进程状态的转换

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

进程的状态

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

进程的组织——链接方式

在这里插入图片描述

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

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

此时 处于运行态的进程的pcb 而就需对列指针它所指向的这个对列
在这里插入图片描述

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

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

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

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

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

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

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

进程的组织——索引方式

在这里插入图片描述

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

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

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

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

进程的组织

在这里插入图片描述

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

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

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

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

知识回顾

在这里插入图片描述

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

这篇关于CHS_02.2.1.2+进程的状态与转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604925

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

usaco 1.2 Milking Cows(类hash表)

第一种思路被卡了时间 到第二种思路的时候就觉得第一种思路太坑爹了 代码又长又臭还超时!! 第一种思路:我不知道为什么最后一组数据会被卡 超时超了0.2s左右 大概想法是 快排加一个遍历 先将开始时间按升序排好 然后开始遍历比较 1 若 下一个开始beg[i] 小于 tem_end 则说明本组数据与上组数据是在连续的一个区间 取max( ed[i],tem_end ) 2 反之 这个

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动