结构推理
在什么情况下要把一个块设备缓冲区设置成“延迟写”标志?为什么要把有“延迟写”标志的缓冲区链入到空闲缓冲区队列中?为什么有“延迟写”标志的缓冲区不能立即分配出去?
【正确答案】在内存用户区里的数据已经送入了某块设备的缓冲区后,该缓冲区的状态就由“忙”变为了“延迟写”。
对于具有“延迟写”状态的缓冲区,UNIX并没有真正对它进行写(即存盘)操作,而是一方面仍然把它保持在设备缓冲区队列里,另一方面也将其链入空闲缓冲区队列(排在队尾)。这样一来,如果申请缓冲区的情形频繁发生,那么由于它排在空闲缓冲区队列里,就能将它分配给别的设备使用。又因为它仍然排在设备缓冲区队列里,于是只要它没有被分配出去,缓冲区里面的数据依然有效,依然可以利用。
排在设备缓冲区队列里具有“延迟写”状态的缓冲区,它所对应的缓冲区里的数据还没有写到磁盘块上。因此分配时遇到这种缓冲区时,不能贸然就把它分配出去,而是应该将其先从空闲缓冲区队列上摘下,进入设备输入/输出队列,完成具体的I/O操作。然后再把状态由“延迟写”改为“空闲”,重新排到空闲缓冲区队列的末尾。
【答案解析】