目录
I/O设备的缓冲机制
I/O通道的分类和工作原理
内存空间分配算法
进程调度算法
死锁的预防和避免方法
实时调度算法
磁盘访问调度算法
文件存储空间管理方法
虚拟存储器的分段、分页中断机制
虚拟存储器的页面转换算法
多处理机系统的分类
多处理机的分布式同步算法
多处理机的同步锁机制
多处理机系统的调度算法及其性能评价指标
多媒体操作系统的进程实时调度算法
多媒体操作系统的磁盘访问调度算法
I/O设备的缓冲机制
设备管理的目标是提高设备的利用率以及提高CPU与I/O设备之间的并行工作能力,由此相继出现了中断技术、缓冲技术等。
缓冲的引入
原因:
(1)缓和CPU与I/O设备间速度不匹配的矛盾
(2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制
(3)解决数据粒度不匹配的问题
(4)提高CPU与I/O设备之间的并行性
凡是数据来到速度和离去速度不匹配的地方都可以使用缓冲。缓冲分为硬件缓冲与软件缓冲。硬件缓冲是以专门的寄存器作为缓冲器,成本较高;所以通常使用软件缓冲,是指在操作系统的管理下划分出一定的区域作为缓冲区(由内存组成的缓冲区)。
单缓冲区和双缓冲区
单缓冲区
在单缓冲情况下,每当用户进程发出一I/O 请求时,操作系统便在主存中为之分配一缓冲区。设备与处理机对缓冲区的操作是串行的。
双缓冲区
也称缓冲对换
引入双缓冲可以提高处理机与设备之间的并行操作程度。例如:输入设备先将第一个缓冲区装满数据 ,在输入设备向第二个缓冲区装填数据时,处理机就可以从第一个缓冲区中取出数据进行处理;当第一个缓冲区的数据处理完毕,若第二个缓冲区已经装满数据,则处理机又可以从第二个缓冲区中取出数据进行处理,而输入设备又可向第一个缓冲区装填数据。
缓冲池
由若干大小相同的缓冲区组成。缓冲池中的每一个缓冲区都是由系统统一管理和动态分配,当某个进程需要使用缓冲区时便提出申请,由系统将缓冲区分配给它,当进程不再使用缓冲区时,就将缓冲区归还给缓冲池。这样,就可以用少量的缓冲区为更多的进程服务。
缓冲池通常将缓冲区排成3个队列:空白缓冲队列;输入队列;输出队列。
工作方式:
(1)收容输入。输入进程调用Getbuf(emq)过程,从空缓冲队列emq的队首摘下一空缓冲区,把它作为收容输入工作缓冲区hin。然后,把数据输入其中,装满后再调用Putbuf(inq, hin)过程,将它挂在输入队列inq队列上。
(2)提取输入。计算进程可调用Getbuf(inq)过程,从输入队列inq的队首取得一缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算继承用完该数据后,再调用Putbuf(emq, sin)过程,将它挂到空缓冲队列emq上。
(3)收容输出。计算进程可调用Getbuf(emq),从空缓冲队列emq的队首取得一空缓冲区,作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq, hout)过程,将它挂在outq末尾。
(4)提取输出。输出进程可调用Getbuf(outq)过程,从输出队列的队首取得一装满输出数据的缓冲区,作为提取输出工作缓冲区sout。在数据提取完后,再调用Putbut(emq, sout)过程,将它挂在空缓冲区队列末尾。
I/O通道的分类和工作原理
I/O通道的引入
当主机所配置的外设很多时,CPU的负担很重,为此,在CPU和设备控制器会见又增设了I/O通道。其主要目的是为了建立独立的I/O操作,不仅使数据的传递能独立于CPU,而且也希望有关对I/O操作的组织、管理及其结束处理尽量独立,以保证CPU有更多的时间去进行数据处理;或者说,其目的是使一些原来由CPU处理的I/O任务转由通道来承担,从而把CPU从繁杂的I/O任务中解脱出来。
I/O通道是一种特殊的处理机。具有执行I/O指令的能力,并通过执行通道(I/O)程序来控制I/O操作。但是I/O通道指令类型单一;没有自己的内存,通道所执行的通道程序是放在主机的内存中的,即与CPU共享内存。
分类
根据信息交换方式的不同,可将通道分成以下类型:
字节多路通道
按字节交叉方式工作。通常都含有许多非分配性子通道,每个子通道连接一台I/O设备,并控制给设备的I/O操作。这些子通道按时间片轮转方式共享主通道。适用于连接中、低速I/O设备。
数组选择通道
能连接多台高速设备,但是只含有一个分配型子通道,在一段时间内只能执行一道通道程序,控制一台设备进行数据传送,致使某台设备占用了该通道后,便一直由它独占,即使是它无数据传送,通道被闲置,也不允许其他设备使用该通道,直至该设备传送完毕释放该通道。可见,该通道的利用率很低。
数组多路通道
结合了字节多路通道能进行分时并行操作和数据选择通道传送数据速度高的优点,在通道中同时运行多个通道程序控制多台设备进行数据传输。适用于连接多台高速设备。
内存空间分配算法
连续分配——————单一连续分配
|
|————分区分配 ——————固定分区分配
|
|——————动态分区分配
|
|——————动态可重定位分区分配
单一连续分配
把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常放在内存的低址部分;而在用户区内存中,仅装有一道用户程序,即在整个内存的用户空间由该程序独占。
固定分区分配
划分分区的办法:
(1)分区大小相等
(2)分区大小不等
内存分配:
将分区按其大小进行排队,并为之建立一张分区使用表。
动态分区分配
基于顺序搜索的动态分区分配算法
为了实现动态分区分配,通常是将系统中的空闲分区链接成一个链。所谓顺序搜索,是指一次搜索空闲分区链上的空闲分区,去寻找一个其大小能满足要求的分区。适用于不太大的系统。
首次适应算法(first fit,FF)
使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
该算法倾向于使用内存中低地址部分的空闲分区,在高地址部分的空闲分区很少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内 存空间创造了条件。缺点在于低址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低址部分开始,这无疑会增加查找的开销。
循环首次适应算法(next fit, NF)
该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至 找到一个能满足要求的空闲分区,并从中划出一块来分给作业。该算法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。
最佳适应算法(best fit, BF)
为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看, 该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序, 这也带来了一定的开销。
最坏适应算法(worst fit, WF)
最差适应算法中,该算法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲分区中 分配(不能满足需要则不分配)。很显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。这种分配方法初看起来不太合理,但它也有很强的直观 吸引力:在大空闲区中放入程序后,剩下的空闲区常常也很大,于是还能装下一个较大的新程序。
最坏适应算法与最佳适应算法的排序正好相反,它的队列指针总是指向最大的空闲区,在进行分配时,总是从最大的空闲区开始查寻。
该算法克服了最佳适应算法留下的许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应算法一样复杂。
基于索引搜索的动态分区分配算法
为了提高搜索空闲分区的速度,在大、中型系统中往往会采用基于索引搜索的动态分区分配算法。
快速适应算法(quick fit)
又称分类搜索法,是将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表。同时在内存中设立一张管理索引表,其中每一个索引表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。
搜索可分配的空闲空间时分两步:根据进程的长度,从索引表中寻找到能容纳它的最小空闲区链表;从链表中取下第一块进行分配即可。
伙伴系统(buddy system)
主要思想:将内存按2的幂进行划分,组成若干空闲块链表;查找该链表找到能满足进程需求的最佳匹配块
算法:
首先将整个可用空间看作一块: 2U
假设进程申请的空间大小为 s,如果满足
2U-1 < s <= 2U,则分配整个块
否则,将块划分为两个大小相等的伙伴,大小为2U-1
一直划分下去直到产生大于或等于 s 的最小块
哈希算法
利用哈希快速查找的优点,以及空闲分区在可利用空闲区表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。