日期:2014-05-16 浏览次数:20697 次
by cszhao1980
系统定义了NBUF个缓存区域,每个514个字节:
4720: char buffers[NBUF][514];
【注】:514个字节稍稍大于一个物理盘块的size,多出的2个byte的用途不明。
而“缓存头”数组buf[NBUF]的每个entry对应一个缓存区域,其b_addr被设置为对应的缓存区
的首地址,如:&buffers[1]。对于缓存的使用都是通过其缓存头数组entry来完成。
【思考题】:为什么这里可以直接使用逻辑地址,如:&buffers[1]?
Unix使用两种(带头结点的)双向循环链表(队列)来管理这些缓存,即
(1) AV队列:即空闲队列,对首为buf bfreelist;
(2) B队列:即设备的任务队列,对首为某设备(devtab类型)。
显然,可以有多个b队列。
【注】:在b队列当中,对首是devtab类型,而成员都是buf类型。该链表得以形成的原因是两种类
型都用同名的成员(b_forw和b_back)作为前后指针,而且,它们的这两种struct中的位置是相同的。
总的原则是,空闲的缓存将挂在AV队列中,当需要操作某设备时就从AV队列中取下,挂到该
设备的b队列中,而设备操作完成后,又重新将其放还到AV队列中。
系统的某些实现使这一过程显得有些晦涩:
(1) 在设备操作完成后,会将缓存放回到AV队列,但没有将该缓存从原设备的b队列中取
下来——这一步是在再次分配该缓存时完成的。即在分配缓存时,分为3步
i. 从AV队列中取下;
ii. 从原设备队列中取下;
iii. &n