网站大量收购独家精品文档,联系QQ:2885784924

操作系统教程第5章.ppt

  1. 1、本文档共239页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统教程第5章

* 4个队列所属缓冲区之间关系总结 — 任何一个缓冲区在稳定的状态下,同时属于两个队列。 — 在自由buf队列中缓冲区可能同时属于NODEV队列(未分配给指定设备),也可能属于设备buf队列(已经分配给某设备用过,因I/O结束而释放)。 — 在设备buf队列中的缓冲区,可能挂在自由buf队列(已用过被释放),也可能挂在设备I/O请求队列(正在使用)。 — 在 NODEV 队列中的缓冲区若已被释放肯定在自由 buf 队列中,而在设备 I/O 请求队列中的缓冲区则肯定属于设备buf队列 * 2.缓冲区管理算法 (1)当分配一个缓冲区用于某个设备的读写操作时,要求被分配的缓冲区是最久未使用的。 具体实现情况是:当要求分配一个缓冲区时,系统从自由buf队列的队首取出一个空闲的buf,并把buf的标志位b_flags置为“忙”,因为buf同时存在于某个设备buf队列中,这时要从原设备的buf队列中取出这个buf,将其插入申请该缓冲区的设备buf队列中。 所以,当一个缓冲区刚被分配用于读、写某块设备上某字符块时,它的b_flags标志位被置为“忙”,它一定位于相应的设备buf队列中,而不在自由buf队列中。 * (2)当一个读/写操作完成后,就要求立即释放所占用的缓冲区,把这个缓冲区buf的b_flags标志位置为“空闲”,并加入自由buf队列的队尾,表示它可以被考虑移作它用。 这个buf仍留在原设备 buf 队列中,也就是说一个缓冲区的 buf 处于空闲状态时,总是同时存在于两个队列中,一是自由buf队列,二是相应的设备buf队列。 * 所谓读操作结束,就是将所需的字符块从指定的设备上读入缓冲区,并传送到用户指定的内存区。 若该字符块已被读到某个缓冲区中,则不需对物理设备进行读操作,只是将这个缓冲区的信息传到指定的内存区。 写操作结束是指把某个内存区的信息传到缓冲区,然后把缓冲区的信息写到指定的物理设备上去。 但当一次写操作未写满缓冲区时,就采用“延迟写”,即不急于写到设备上去,而是把这个缓冲区的标志位置上延迟写的标志,表示具体写操作延迟到以后的某个时机进行,并把这个buf挂到自由buf队尾,同时留在这个设备的buf队列中。 * (3) 好处: 其一,在自由buf队列中的缓冲区中,只要未重新分配使用,其内容不会改变。因此若再次需使用这个缓冲区的信息,只是简单地从自由buf队列中抽出相应的buf,仍按原状使用缓冲区的信息,从而减少了对设备的I/O操作,提高了文件系统工作的效率。 其二,若将一个缓冲区移作他用,则只需从自由buf队列和原设备buf队列中同时抽出,插入新的设备buf队列。这就实现了进程对有限缓冲区的共享。 * (4)为了使释放的缓冲区尽可能长地保留原来的使用信息,每次释放缓冲区时总是将其 buf插入到自由buf队列的队尾。分配缓冲区时,总是从自由buf队列队首抽出一个空闲的buf(FIFO)。 (5)并且当一个 buf 在自由队列内移动时,只要有按原状使用的需要时,就立即从自由 buf 队列中抽出,使用完毕后释放该缓冲区,又将其 buf 插入到自由 buf 队列队尾。这就保证了在所有自由缓冲区中被重新分配的是最久未使用的,且精确地实现了LRU算法。 * (6)已经设置“延迟写”标志的缓存,虽然已经在自由buf队列中,实际上其内容尚未写到相应设备上。当它已经移到自由buf 队列队首准备移作他用时,不应将其按一般自由buf 处理,即不能立即对它进行重新分配,而是要提出 I/O 请求,以便将其内容写到相应设备的指定字符块上。 为此将它从自由buf队列中抽,而只留在原设备buf队列中。写操作结束后,这种缓存又被释放进入自由buf队列的末尾(也有插到队列首),同时仍保留在原设备buf队列中。 * 3.缓冲区的分配和释放 当进程想从特定盘块上读取数据或打算把数据写到特定盘块上时,核心要查看该块是否已在缓冲池中。如果未在,则为该块分配一个空闲的缓冲区。 输入:文件系统号(即逻辑设备号)dev,盘块号blkno 输出:bp——可供该盘块使用的buf(被封锁) getblk(dev,blkno) { while(未找到相应 buf){ if(盘块在设备 buf 队列中){ if(buf 忙){ * sleep(buf 成为空闲); continue; /* 回到 while 循环 */ } 标记buf忙; 从自由buf队列中移走该buf; return(buf); } else { /* 盘块不在设备 buf 队列中 */ if(自由队列中已无 buf){ sleep(任一 buf 成为空闲); continue; /* 回到 while 循环 */ } 从自由队列中移走该buf; if(buf

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档