本文是《深入理解操作系统》第四章第六篇,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要的,本章就从程序员的角度来讲解到底什么是进程、操作系统是如何实现进程的。本文承接上篇《进程是如何实现的》,以下为本篇目录:
-
操作系统如何组织进程:队列
-
进程的行为特点:CPU密集型与I/O密集型
-
什么情况下会进行进程调度?
-
两种进程调度方式
-
调度算法
-
FIFO
-
短作业优先
-
最短作业优先完成
-
轮询调度Round-Robin
-
开创性工作:多级反馈队列
-
总结
在这一节中,我们将从各个角度来理解进程调度是如何实现的。
操作系统如何组织进程:队列
如果你观察过城市中的车流就会发现,虽然车可能会很多,但这些汽车都是走走停停,井然有序。操作系统中的进程也是如此,进程也会走走停停,运行一段时间后或者发起I/O请求被暂停,或者由于硬件产生中断而被操作系统暂停,但是当恢复运行后各个进程都能继续向前就像没有被暂停过一样,和汽车井然有序的在城市中行驶一样,进程在操作系统中不可以杂乱无章,那么操作系统应该怎么组织这些进程呢?
如果你去银行办理过业务的话就很容易理解啦,一般去银行的人都非常多,每个窗口都有一些人在排队等待,如果不巧赶到中午去的话那么通常只有一个窗口可以办理业务(因为其它银行职员要中午休息)。我们假设是在中午,因此只有一个银行职员在工作,那么所有人都排成一队等待。等到你的时候银行职员开始处理你的业务,处理一半发现需要你的身份证复印件,这时你不得不先离开银行去打印店。由于打印店生意火爆,因此你不得不再次在打印店排队等待,排到你拿到身份证复印件后再次返回银行继续排队。这次银行职员认为你的资料齐全,办理完业务后你就可以离开银行啦。
在这里例子中,你就好比进程,银行职员就好比CPU,银行职员处理你的业务就好比进程等到CPU后开始运行,你离开银行去打印店就好比进程的I/O请求,因此这里的关键就是排队等待。和这个例子一样,操作系统中同样维护了各种队列,处于就绪状态的进程就放在就绪队列(Ready Queue)当中排队等待CPU,被分配了CPU的进程就开始运行,其它进程继续在就绪队列中等待。
注意这里的队列就是我们在数据结构课程中学到的队列,那么进程在队列中排队等待该怎么实现呢?还记得进程在操作系统中其实就是用PCB来表示的吗,我们只需要建立一个简单的队列,里面存放处于就绪状态的PCB就可以了。至于如何实现队列,方法有很多种,最常见的方法是使用简单的链表来实现,你没有看错,进程就是用这些你熟悉的数据结构组织起来的,如下图所示:
本文剩余部分请参见这里《深入理解操作系统》。