第四章 UNIX设备管理.ppt
文本预览下载声明
第四章 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) 散列队列。为了加速对缓冲区的查找,系统把所有的缓冲区分设备地、按其块号所计算的散列值的不同,组织
显示全部