unix操作系统设计笔记(1).
内核把一个缓冲区分配给磁盘块时可能出现的五种典型情况:
1.内核发现该块在它的hash队列中,并且它的缓冲区是空闲的
2.内核在hash队列中找不到该块,因此,它从空闲表中分配一个缓冲区
3.内核在hash队列中找不到该块,并且,在试图从空闲表中分配一个缓冲区(第二种情况)的时候,
在空闲表中找到一个已标上了“延迟写”标记的缓冲区,内核必须把“延迟写”缓冲区的内容写到磁盘上,并分配另一个缓冲区.
4.内核在hash队列上找不到该块,并且空闲表缓冲区表已空.
5.内核在hash队列上找到该块,但它的缓冲区当前为忙。
搜索算法: getblk
输入: 文件系统号,块号
输出: 现在能被磁盘块使用的上了锁的缓冲区
{
while(没找到缓冲区){
if(块在hash队列中){
if(块忙){ /* 第五种情况 */
sleep(等候“缓冲区变为空闲”事件);
continue;
}
为缓冲区标记上“忙; /* 第一种情况 */
从空闲表上摘下缓冲区;
return(缓冲区);
}else{
if(空闲表上无缓冲区){ /* 第四种情况 */
sleep(等候“缓冲区变为空闲”事件);
continue;
}
从空闲表上摘下缓冲区;
if(缓冲区标记着延迟写){ /* 第三种情况 */
把缓冲区异步写到磁盘上;
continue;
}
从旧hash队列中摘下缓冲区; /* 第二种情况 */
把缓冲区放到新的hash队列;
return(缓冲区);
}
} /* while end. */
}
五种情况处理分为两条线:一条 5->1, 另一条 4 -> 3 -> 2
阅读(1185) | 评论(0) | 转发(0) |