注: 这是对 [Abraham Silberschatz. 操作系统概念 第七版. 高等教育出版社, 2010.1] 一书的概述性阅读笔记
同时也是对学校操作系统课程部份作业的整理
CH3&5&6 进程通信、同步与调度
1.进程通信
操作系统内并发执行的进程可以是独立进程或协作进程,协作进程影响或能被其他进程所影响,进程协作能够实现信息共享,提高运算速度,利于模块化以方便多任务。而协作进程需要进程间通讯机制(IPC)来允许进程交换数据和信息,进程间通信有共享内存和消息传递两种基本模式。
共享内存允许以最快的速度进行方便的通信,通信进程间通过系统调用建立共享内存的区域,进程在共享区域读写来交换信息,数据形式和位置取决于进程而不受控于操作系统,进程也负责保证不想向同一区域同时写入数据。消息传递模式不需要共享地址空间从而避免了冲突,对于交换少量数据显得非常方便,尤其对于分布式环境极为有用,消息传递工具至少提供发送和接收两种操作来实现数据交换,这2种方法并不互相排斥,能在统一操作系统内同时实现。
客户机—服务器通信可能通过socket,远程过程调用及java的远程方法调用来实现。
2.进程同步
协作进程通过共享逻辑地址空间或通过文件和消息来共享数据,共享数据的并发访问可能产生数据的不一致,因此引入进程同步的概念以确保共享同一逻辑地址空间的协作进程有序执行,维护数据的一致性。
软件同步的经典算法Peterson算法为临界区问题提供了很好的解答,其适用于2个进程在临界区和剩余区间的交替执行,在2个进程间共享true和flag数组2个数据项,分别指示哪个进程可以进入临界区以及哪个进程想要进入其临界区,限制2个进程同时进入临界区执行。
临界区问题也能够通过硬件同步实现,单处理器环境在修改共享变量时禁止中断即可实现,多处理器环境下现代计算机系统大多提供了硬件指令实现不可中断地检查和修改子的内容,从而解决临界区问题。
信号量(semaphore)提供了一种方便且有效的机制以处理进程同步,当一个进程修改信号量值时,不能有其他进程同时修改同一信号量的值,对其值的修改必须被不被中断地执行。具有等待队列的信号量的实现可能出现多个进程无限等待一个事件而该事件仅能由等待进程之一产生的死锁现象。
信号量的使用不正确仍会导致时序错误,且难以检测,通过高级同步构造管程以解决该类错误,条件变量提供了一个方法以供管程阻塞执行。
3.进程调度
(1)调度概念
通过在进程之间切换CPU,操作系统可以提高计算机的吞吐率。对于单处理器系统,每次只允许一个进程执行,其他进程必须等待,直到CPU空闲,采用多道程序设计,在进程执行到等待某些I/O请求的完成时CPU就会空闲,操作系统将CPU使用权交给其他进程,从而提高CPU的使用率,此即进程的调度。在真实系统上设计和选择合适的调度算法以实现更好的性能。
(2)调度算法
先到先服务调度(FCFS):先请求CPU的进程先分配到CPU,该算法易于实现,但平均等待时间通常较长,由于I/O进程处于就绪队列等待CPU约束进程完成而产生的”护航效应”,也会导致CPU和设备使用率降低。
最短作业优先调度(SJF):该算法将每个进程与其下一个CPU区间段相关联,当CPU空闲时,会将使用权赋予下一CPU区间最短的进程,该算法的平均等待时间最短,但如何确切知道下一个CPU区间的长度较难实现。
优先级调度(PS):每一进程有一优先级与其相关,具有最高优先级的进程会分配到CPU,SJF属于优先级调度的一个特例。
轮转法调度(RR):该算法是专门为分时系统而设计的,定义一个称为时间片的较小时间单元,为就绪队列中的每个进程分配不超过一个时间片的CPU。
多级队列调度:将就绪队列按照进程属性分为多个独立队列,每个队列具有自己的调度算法,队列之间通常采用固定优先级抢占调度。
多级反馈队列调度:与多级队列调度不同,允许进程在队列之间移动,根据不同CU区间的特点区分进程
(3)多处理器调度
对于多个CPU的情形,负载分配成为可能,但调度问题相应地更加复杂。
多处理器系统中,CPU调度的一种方法是由一个处理器处理所有调度、I/O、系统活动而其他处理器仅执行用户代码,另一种方法是对称多处理(SMP)方法,即每个处理器自我调度,每个处理器都有其私有就绪队列。
在SMP系统中,保持所有处理器的工作负载平衡极为重要,负载平衡设法将工总负载平均地分配到所有处理器上,但这将导致进程在处理器之间移动,从而抵消处理器亲和性所带来的优点。