缓冲区和多进程操作文件_第1页
缓冲区和多进程操作文件_第2页
缓冲区和多进程操作文件_第3页
缓冲区和多进程操作文件_第4页
缓冲区和多进程操作文件_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、缓冲区的作用形成所有块设备数据的统一集散地,操作系统的设计更方便、更灵活对块设备的文件操作运行效率更高:使进程内存空间与块设备交换数据的速度更快缓冲区数据共享不同进程间共享缓冲区中的数据。同一进程在不同时间多次共享缓冲区中的同一个数据。两种模式的组合缓冲区设计要想通过缓冲区的设计提高操作系统读写文件的整体效率,就应该尽可能多地共享缓冲区中的数据尽可能多地共享缓冲区中的数据。最有效、最直接的方法就是让缓冲区中的数据在缓冲区让缓冲区中的数据在缓冲区中停留的时间尽可能长。中停留的时间尽可能长。可以说,缓冲区的所有的代码都是围绕着如何保证数据如何保证数据交互的正确性交互的正确性、如何让数据在缓冲区中停

2、留的时间尽如何让数据在缓冲区中停留的时间尽可能长可能长来设计的。缓冲区的总体结构缓冲区、buffer_head、request的格局图进程缓冲区块设备Buffer_headrequest缓冲区的总体结构其中Buffer_head:负责进程与缓冲区中的缓冲块的数据交互。在确保数据交互正确的前提下,让数据在缓冲区中停留的时间尽可能长。Request:负责缓冲区中的数据与块设备之间的数据交互。在保证数据交互正确的前提下,尽可能及时地将进程修改过的缓冲区中的数据同步到块设备上。Buffer_head的数据结构/include/linux/fs.hStruct buffer_head Char * b_

3、data;Unsigned long b_blocknr;Unsigned short b_dev;Unsigned char b_uptodate;Unsigned char b_dirt;Unsigned char b_count;Unsigned char b_lock;Struct task_struct * b_wait;Struct buffer_head * b_prev;Struct buffer_head * b_next;Struct buffer_head * b_prev_free;Struct buffer_head * b_next_free;Buffer_head

4、的设计进程与缓冲块数据交换的正确性内核通过buffer_head结构中的b_dev和b_blocknr两个字段,把缓冲块和硬盘数据块的关系绑定。这样就保证了硬盘块与缓冲块关系的唯一性,进程、缓冲块的数据交互与进程、硬盘数据块的数据交互等价,确保不会出现混乱。让数据在缓冲区中停留的时间尽可能长内核中没有任何机制、也没有任何代码能够将已经建立了绑定关系的缓冲块、硬盘数据块,刻意地、主动地解除绑定关系。只有在迫不得已的情况下,才被新建立的绑定关系强行替换。Buffer_head的设计B_uptodate和b_dirt是为了解决缓冲块和数据块的数据正确性问题而存在的。B_uptodate:针对进程方向

5、只要缓冲块的b_uptodate字段被设置为1,就是告诉内核,缓冲块中的数据已经是数据块中最新的,可以放心的支持进程共享缓冲块的数据。反之如果b_uptodate为0,就是提醒内核缓冲块并没有用绑定的数据块中的数据更新,不支持进程共享该数据块。Buffer_head的设计B_uptodate和b_dirt是为了解决缓冲块和数据块的数据正确性问题而存在的。B_dirt:针对硬盘方向只要缓冲块的b_dirt字段被设置为1,就是告诉内核,这个缓冲块中的数据已经被进程方向的数据改写了,最终需要同步到硬盘上。反之如果b_dirt为0,则不需要同步。Buffer_head的设计B_count:标示每个缓冲

6、块有多少进程在共享。B_lock:=1时,说明缓冲块正在与硬盘进行数据交互,此时内核应该拦截进程对该缓冲块的操作。交互结束后,再把该字段设置为0,以此解除对进程方面的拦截。* b_wait:记录因等待缓冲块的解锁而被挂起的进程。request的数据结构/kernel/blk_drv/blk.hStruct request Int dev;Int cmd;Int error;Unsigned long sector;Unsigned long nr_sector;Char * buffer;Struct task_struct * waiting;Struct buffer_head * bh;

7、Struct request * next;request的设计Request的设计思路和缓冲区正好相反,它的目的是尽可能快的让缓冲块和硬盘交换数据。缓冲块与硬盘块数据交换的正确性Request结构中也有类似b_dev和b_blocknr的字段,是设备号dev和硬盘块的首扇区号sector。让数据在缓冲块和硬盘块中尽快交互无论是读盘还是写盘的中断服务程序,在执行完一次缓冲块和数据块的交互后,都调用end_request()和do_hd_request(),形成处理请求项的循环机制。如果当前即队列中还有请求项对应的缓冲块需要交互,就继续下达交互命令,直到把请求项中所有的任务都执行完才返回。request的设计Cmd:确定缓冲块与硬盘之间是读交互还是写交互。* bh和* buffer:确定与硬盘进行交互的是哪个缓冲块。Sector和nr_sector:实现数据块与扇区的映射规则。Error:记录出错的次数。复用dev:因为缓冲块与硬盘数据块一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论