- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                第四章 UNIX设备管理
                    第四章  UNIX的设备管理        设备管理的主要任务是管理系统中的所有外部设备。UNIX系统把设备分为两类:        (1) 块设备。用于存储信息,其对信息的存取是以信息块为单位的,如通常的磁盘、磁带等;         (2) 字符设备。用于输入/输出程序和数据,其对信息的存取是以字符为单位的,如通常的终端设备、打印机等。         4.1  设备缓冲管理       在现代操作系统中,无论是字符设备还是块设备,在进行I/O操作时,都须借助于缓冲,以缓和 CPU与 I/O设备速度不匹配的矛盾。在UNIX系统中也不例外,该系统分别为字符设备和块设备设置了缓冲池。         一   块设备缓冲队列的结构         UNlX系统在文件子系统和块设备驱动程序之间设置了大量的数据缓冲区,供磁盘和磁带机使用,以减少对磁盘的I/O操作次数。每个缓冲区的大小与盘块的大小相当,以便在一个缓冲区中存放一个或多个磁盘块内容。盘块的大小一般在512~4096字节之间。由于盘块缓冲区的容量较大,使用上也较复杂,因此UNIX系统中的盘块缓冲区的组成方式不同于字符缓冲区。       1  数据缓冲区及其首部        每一个数据缓冲区均由两部分组成:一部分是用于存放数据本身的数据缓冲区,另一部分是缓冲控制块,也称缓冲首部,用于存放缓冲区的管理信息。两者一一对应,但缓冲首部与缓冲区在物理上并不相连,只是在缓冲首部中用一个指向对应缓冲区的指针,把两者联系起来(如下图所示)。            1  数据缓冲区及其首部        每一个数据缓冲区均由两部分组成:一部分是用于存放数据本身的数据缓冲区,另一部分是缓冲控制块,也称缓冲首部,用于存放缓冲区的管理信息。两者一一对应,但缓冲首部与缓冲区在物理上并不相连,只是在缓冲首部中用一个指向对应缓冲区的指针,把两者联系起来(如下图所示)。       缓冲区头部结构 struct  buf{       Int  b_flags;//是个标志位,含状态信息,包括有B_READ,B_WRITE,等       struct  buf  *b_forw;  /*   后面   */       struct buf *b_back;       struct  buf *av_forw;       struct  buf *av_back;       int  b_dev;         /*  主设备号   */       int  b_wcount;   /*  传输数据    */       char *b_xmem;  /*  核心地址高字节   */       char *b_blkno;   /*  块号  */       char b_error;      /*  返回字符  */       char *b_resid;     /*  错误后,没有被传输的字  */ }buf[NBUF]        缓冲首部还包括设备号和块号,以分别指出对应的文件系统和磁盘上的数据块号。必须说明,在UNIX System V中,设备号并非物理设备号,而是逻辑设备号,核心把每一个文件系统看作一个逻辑设备。缓冲首部中的状态字段用于指出对应缓冲区的当前状态,用于表示缓冲区是否空闲、缓冲区是否为延迟写、是否有进程正在等待该缓冲区变为空闲、核心是否正在读或写该缓冲区等。缓冲首部还包括两个空闲链表指针及两个散列队列指针。前者分别指向空闲链表中的上一个和下一个缓冲区首部;后者分别指向散列队列中的上一个和下一个缓冲区首部。  struct devtab{      char d_active ;   /*忙的标志设备状态信息 */      char d_errcnt;   /*  错误返回的数目  */      struct buf *b_forw;  /* 相应设备相关联的各缓存列表第一个缓冲区  */      struct buf *b_back;  /*  相应设备相关联的各缓存列表最后一个缓冲区  */      struct buf *actf;  /*  空闲链表的头指针  */      struct buf *actl;  /*  空闲链表的尾指针   */ }     2、缓冲池结构         (1) 空闲链表。为了对缓冲区进行管理,在核心中设置一个双向链接的空闲链表。系统初启时,将所有的、缓冲首部都链入空闲链表中。当需要一空缓冲区时,从空闲链表的首部摘下一缓冲区;释放一缓冲区时,将它挂在空闲链的末尾。                 (2)  散列队列。为了加速对缓冲区的查找,系统把所有的缓冲区分设备地、按其块号所计算的散列值的不同,组织
                
原创力文档
                        

文档评论(0)