一文详解操作系统进程管理( 四 )


4.2.3 最短作业优先最短作业优先(Shortest Job First, SJF),顾名思义即进程按照作业时间长短排队,作业时间段的排前面先执行,如 下图 。

一文详解操作系统进程管理

文章插图
 
4.2.4 最短剩余时间优先最短剩余时间优先(Shortest Remaining Time Next),从就绪队列中选择剩余时间最短的进程进行调度 。该算法可以理解最短作业优先和时间片轮转的结合 。如果没有时间片,那么最短剩余时间其实就是最短作业时间,因为每个进程都是从头执行到尾 。
4.2.5 优先级调度假设就绪队列中有如下进程
进程执行时间优先级P151P223P332
按照优先级调度,执行顺序为p1->p3->p2 。如果多个进程优先级相同,则按照先来先服务的方式依次执行 。
优先级调度可以进一步细分为抢占式和非抢占式 。
非抢占式:和上面提及的非抢占式类似,一旦该进程占有CPU就将一直执行到结束或者阻塞 。
抢占式:进程执行期间,一旦有更高优先级的进程进入就绪队列,那么该进程就会被暂停,重回就绪队列,让更高优先级的进程执行 。但是为了防止最高优先级进程一直执行,每个进程依然有自己的时间片,每次时间片结束后,会根据一定规则降低该进程优先级,避免某些最高优先级长作业进程一直占用CPU 。
4.2.6 多级反馈队列调度多级反馈队列调度基于时间片轮转和优先级调度,设置多个就绪队列,赋予每个就绪队列优先级,优先级越高的队列进程的时间片越短 。如下图,第1级就绪队列优先级最高,进程的时间片长度最短,第2级就绪队列次之,以此类推 。
一文详解操作系统进程管理

文章插图
 
当有新的进程创建时,先进入第1级就绪队列,时间片结束之前就运行完毕,则终止,否则进入第2级队列等待下一次调度 。在n级队列之前,进程按照先到先服务规则依次调度,到了第n级队列(最后一级)采用时间片轮转调度 。仅当第1级队列为空时,才调度第2级队列的进程,如果第i级队列的进程正在运行,此时有一个更高优先级的进程进入,则会停下第i级的进程,让它回到第i级队列尾部,转而执行更高优先级的进程,即满足优先级调度算法的原则 。
5.进程间通信进程间通信目的一般有共享数据,数据传输,消息通知,进程控制等 。以 Unix/Linux 为例,介绍几种重要的进程间通信方式:共享内存,管道,消息,共享内存,信号量,信号
5.1 共享内存多个进程可以读写同一块内存区域,是效率最高的进程间通信方式 。
一文详解操作系统进程管理

文章插图
 
由于多个进程都可以读写内存,所以需要一定的同步机制来保证数据读写安全问题,关于这种机制,需要花费较大篇幅,这里读者可根据文章末尾提供的参考资料查看,笔者后续也会再另起一篇专门介绍 。
5.2 管道首先简单介绍一下什么是生产者/消费者问题 。一个或多个生产者,生产一些数据,将其放置到共享缓冲区中,由消费者从缓冲区中取走数据 。同一个缓冲区同一时间内只允许生产者或者消费者一方访问,不能同时访问 。当缓冲区满了,生产者不再向其中添加数据,当缓冲区空了,消费者不再向其读取数据 。
管道就是基于生产者/消费者模型来实现通信的,最基本的管道通信由一端的读进程,管道,还有另一端的写进程构成,通信的介质是共享文件,也称为管道文件 。管道可以分为匿名管道和命名管道,此处主要介绍命名管道 。管道有一个特点:数据一旦被读取了,就从管道中删除,以释放空间便于写入更多数据 。如下图
一文详解操作系统进程管理

文章插图
 
如果需要实现双端通信,则需要两个管道,如下图 。
一文详解操作系统进程管理

文章插图
 
这里有一个注意点:第二个图是半双工通信,即虽然通信可以双向,但是同一时间只能单向传输 。管道可以理解为一种共享存储(是磁盘存储而不是内存存储)的优化方式,保证同一缓冲区的数据,只能一端写入,一端读取,无法多端同时进行写操作 。
5.3 信号信号一般用于一些异常情况下的进程间通信,是一种异步通信,它的数据结构一般就是一个数字,比如Unix就提供了如下信号(摘自《操作系统精髓与设计原理》第6版 6.7.5章节)


推荐阅读