问题 问答题

为什么要引入I/O缓冲区UNIX操作系统如何管理缓冲区

答案

参考答案:引入缓冲区的主要原因如下:
(1)缓和CPU与I/O设备间速度不匹配的矛盾。
(2)减少对CPU的中断的频率,放宽对中断响应时间的限制。
(3)提高CPU与I/O设备之间的并行操作程度。
UNIX操作系统将设备按传输信息的单位分为字符设备和块设备分别进行管理。对于字符设备来说,UNIX在系统中设置了一组字符缓冲区。每个缓冲区的大小为70个字节,包括4项:第一个字符位置、最后一个字符位置、指向下一个缓冲区的指针、余下的用于存放64个字符的缓冲区。所有‘的空闲缓冲区链接成一个队列。缓冲区的分配和释放均在链首处进行。
UNIX操作系统的块设备缓冲区管理采用类似缓冲池管理的方法。每个缓冲区由两部分组成:第一部分是缓冲区首部,用于存放缓冲区的管理和控制信息;第二部分是真正的缓冲区,用于存放数据。两者一一对应,但物理上并不相连,而是独立存储。缓冲区动态地组织成空闲缓冲区队列、设备缓冲区队列和设备I/O请求队列。空闲缓冲区队列是由空闲缓冲区构成的,设备缓冲区队列是按占用缓冲区的设备块号构成的多个散列队列,设备缓冲区队列中正在进行读写的缓冲区构成设备I/O请求队列。
UNIX调用操作系统的过程调用(getblk)来分配缓冲区。当读磁盘数据时,先检查要读入的盘块内容是否已在某缓冲区中。若是,则直接从缓冲区获取。若不是,则从磁盘上将数据读入,此种情况下需要为该磁盘读操作分配一个空闲缓冲区。当把数据写入一个特定盘块时,先检查该块内容是否已在某缓冲区中,若是,则直接写入缓冲区;若不是,则分配一个空闲缓冲区,然后进行写入。操作系统的getblk过程分配缓冲区时有如下两种情况:
(1)缓冲区在散列队列上。进入geblk过程后,先根据文件系统号和盘块号去查找散列队列,若找到与文件系统号和块号相匹配的缓冲区,便进一步检查该缓冲区是否空闲。若空闲,则应先上锁,以防止其他进程对它进行访问,然后把它从链上摘下;若忙,则表明缓冲区已被其他进程上锁,此时进入睡眠状态,直到该缓冲区变为空闲时再将它唤醒。
(2)缓冲区不在散列队列上。此时只有从空闲链表上找到一个缓冲区。若空闲链表已空,则进程睡眠直到空闲链表上出现新的缓冲区为止;否则从链首摘下一个缓冲区。

单项选择题
单项选择题