当进程创建完之后,我们知道他会经历等待,就绪,运行状态,最终终止
那么进程在哪里经历这些状态呢?
还记得我们的汽车类比吗?
不同状态的车就被放到不同的道路上排队,进程进入系统时,就会被加入到作业队列中
这个作业队列是一种统称,包括就绪队列,阻塞队列,以及I/O队列等
下图来自《操作系统概念》
长方形表示队列,原型表示为队列服务的资源,箭头表示系统内进程的流向
我们可以看到,当一个进程在就绪队列中,一旦分到CPU将会发生以下时间之一
1发出一个I/O请求,并被放到I/O队列中
(简单来说就是必须要输入输出某些东西才能计算,就像一个C程序中的边输入边计算,很重要,因为此时该队列就会失去CPU资源,然后被其他进程占有,这里会经常出题,往往需画图计算)
2创建一个新的子进程,并等待其结束
3等待中断,由于中断而被强制释放CPU,并被放回到就绪队列中
刚刚我们从进程的角度来解释进程调度,就是在这个过程中进程经历了什么,现在,我们从操作系统的角度看,他是如何做到这些的
首先理解三个概念
长期调度:从作业池中选择进程,装入内存中准备执行
短期调度:从准备执行的进程中选择进程,并为之分配CPU
中期调度:比较奇葩,将进程从内存中移出,之后再重新进来,目的是为了降低多道程序的程度,以免CPU切换频率过高(这会导致CPU利用率的问题)
他们之间的区别很简单,就是使用的频率,短期最高,中期次之,长期最慢
而且长期调度是中期和短期的前提
(为了显示逼格,来英文版的图)
增加了中期调度的队列图
以上是进程的队列情况和操作系统的三种调度,单个进程的经历就是如此,接下来,我们来看看进程间的通信
再看一遍进程定义:进程是进程映像的运行过程,是系统进程资源分配和调度的一个独立单位
重点看后半句,这意味着进程都是像分子般的独立个体,别的分子是不允许进入我的体内的。
也就是说进程之间无法相互访问,所以需要有第三方——共享内存。
就像虽然两个人不能直接交换东西,但是两个人拥有同一个包,一个人放东西,一个人取东西
不过此时要注意的是,避免甲在放的时候乙又在取,同时还有包已经满了,甲不知道还在放或者包空了,乙还在去等等情况,这需要双方有交流机制(我们称为信号量),也是后面的一大知识点,(到这其实我明白一个道理,操作系统的知识都是伴随着解决问题而一点一点出现的,所以带着解决问题的心态去学就不会觉得空了)
那除了共享空间还有其他方法吗?当然有,消息传递
因为进程之间的通信本质上是数据交换,有两种方式
直接通信方式:直接将消息发给接受进程
间接通信方式:先发给某个中间实体,然后接受进程从中间实体取得信息,这个中间实体称为信箱
简单吧?那我问你,间接通信和共享空间的区别是什么?
——————————我是分割线——————————
又盗一个图
图中表示消息message,a图是消息传递(注意中间实体在内核中),b图为共享内存
当然了消息传递也会带来问题,不用想就知道——延迟,就像qq一样你不上网我发给你的消息你永远看不到。所以会存在同步和异步问题,解决方案在后面又是一堆方法(o(╯□╰)o)
值得一提的是,除了以上两种,还有一种特殊的方法——管道通信
他是消息传递的一种特殊方式
管道就是连接一个读进程和写进程以实现他们之间通信的一个共享文件
具体方法是:像管道提供输入的发送进程(写进程),以字符流形式将数据送入写管道
然后接收进程接收管道输出的数据
就像双方建立了长期战略伙伴关系,约好了特殊的消息传递方式,速度当然比一般的消息传递快
但是也会有问题,就是此时必须要确定双方都在,同步,所以要求比较高。
笔记3和4其实埋下了后面关于进程管理的学习的主要内容,包括死锁,信号量,同步和异步,进程调度的算法等,了解这些才算真正开始深入操作系统,加油!