大家好,又见面了,我是你们的朋友全栈君。
本篇帖子继续上篇。有兴趣可以点击链接进行查看以前写过的文章。
【系统架构设计师】第一章:操作系统(1.1.1—1.1.2)
参考教材:
《系统架构设计师考试全程指导(第二版)》
《系统架构设计师教程》
1.2 处理器管理
在单用户多任务的操作系统中,或者多用户多任务的操作系统中,系统同时运行多个程序,这些程序的并行运行势必形成对系统资源的竞争使用。因此,操作系统必须能够处理和管理这种并行运行的程序,使之对资源的使用按照良性的顺序进行。
1.2.1 进程的状态
1.定义及分类
首先我们要搞清楚三个东西的区别:程序,进程,线程。
先想想看,什么是程序?
我们常说的编程,这个“程”字指的就是我们的程序。很明显,你写的是代码,而不是手写的运行起来以后的那个程序。那个是经过编译你的代码而得到的东西。
因此,我们可以得出结论:程序就是我们的代码,是一个静态的概念。
其次就是进程。
当我们编译好程序以后,运行的那个软件就是我们的进程。这个也很好理解,对吧?
当然,进程也不仅仅有这些,同时还有比如告诉系统,应该分配多少内存之类的信息。
因此,我们的结论是:
- 从动态的角度看,进程就计算机状态的一个有序集合。
- 从静态的角度看,进程由程序,数据,进程控制块(PCB)组成。
最后要说的是线程。
这个东西是书上没有的,不过我突然想到了,就临时补充了上来。所谓线程,其实就是一个相对的概念。
比如我们在写一个下载的程序的时候,我们就需要用到线程,并且将下载放到后台来进行。不然的话,我们的程序就会一直在下载中,导致用户在使用的时候,一旦使用下载功能,就会卡死在主界面。
这个系统用来执行我们下载而分配的到后台去运行的资源,就是我们的线程。所以,我们可以这样说:
线程也是一个被用来处理任务的资源,但是由于是我们进程所创建的,因此就叫做线程。
我们甚至可以将我们的主程序理解成一个我们电脑所产生的线程。
行了,关于进程的介绍就先说这么多吧。剩下其实还有更深的概念,比如守护线程之类的东西就先不提了。
2.进程的状态模型与转换
1.三态模型
我们知道了进程的概念以后,接下来需要知道的是进程的每种状态该如何去描述。
拿c语言来举例吧。
比如,我们写好一个程序,这个程序会读取我们输入的数字加一然后显示出来。我们可以很明显的看到两个过程:
- 程序自动运行的过程,比如读取我们输入的数字然后加一并且显示出来。这些是没有经过我们人工干预的过程。
- 程序暂停,等待我们输入所需要的数字的过程。
1和2其实就分别对应了我们进程中的两个过程:运行,等待
另外还有一个我们看不到的过程,就是 就绪 这个过程。
这个也很好理解吧?有时候你后台跑个lol+赛博朋克,系统的资源不够用了,想跑你自己写的这个程序,就得等有空闲的资源的时候才会去跑。
然后这时候你把这两个游戏关了,那么你的程序就有资源了。此可,你的程序就叫做就绪态。
我们可以很容易的写出三种形态的转换。
2.五态模型
我们其实还需要考虑一些极端的情况:如果我们同时开了1000个lol和1000个赛博朋克,那么此可你写的程序处于什么状态?等待态还是就绪态?
很显然,都不是。因为如此大的系统开销,电脑为了防止cpu被耗尽,就必须将一些程序挂起,等到有资源的时候在去唤醒。
此刻你的程序正处于磁盘的镜像中,因此就不参与进程的调度了。你可以认为你的程序从“活”变成了“死”。
这里给出了进程挂起的原因,和书上写的不太一样,不过大体相似,但是建议还是去看一下书。
为了方便区分“活”的等待态以及就绪态,和“死”的状态,我们先将三态模型中的等待态和就绪态的名字改为活跃阻塞态和活跃就绪态。
此可,我们的三态模型变成了:
活跃阻塞态,活跃就绪态,运行态
那我们想想当进程被挂起以后会有怎样的状态呢?
我们就要看被挂起的时候是什么状态。比如我们在活跃阻塞态的时候将进程挂起,那么被挂起的进程就叫做静止阻塞态。
如果在被挂起的时候是活跃就绪态,那么被挂起的进程就叫做静止就绪态。
于是,现在就有了我们新的五态模型:
活跃就绪态,活跃等待态,运行态,静止阻塞态,静止就绪态
我们依旧可以将五种状态的变化列出来。懒得写了,直接看别人写好的吧。
https://www.orzzone.com/process-state-transition.html
这一小节写了进程的简介以及三态模型和五态模型。下一节会讲信号量与pv操作。
下一节已更新。
【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作(一)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129026.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...