当前位置: 技术问答>linux和unix
unix V的缓冲池。如果把所有缓冲区,都按LRU连接到空闲链表中。
来源: 互联网 发布时间:2015-06-07
本文导语: unix V的缓冲池。如果把所有缓冲区,都按LRU连接到空闲链表中,请问,和原来的方法比较,各有什么优点缺点。以及getblk(申请一个缓冲块的算法)该怎么改动。参 机械工业出版,翻译的书。 | ...
unix V的缓冲池。如果把所有缓冲区,都按LRU连接到空闲链表中,请问,和原来的方法比较,各有什么优点缺点。以及getblk(申请一个缓冲块的算法)该怎么改动。参 机械工业出版,翻译的书。
|
LRU:优点:1、减少了等待“缓冲区变为空闲”时间而睡眠的进程,2、使缓冲区中数据保留时间更长,从而减少进程读磁盘的次数,3、不会出现“空闲表上无缓冲区”而睡眠的事件4、任何缓冲区都有两种方法可以访问到
缺点:1、空闲链表过长,对空闲表的操作更加频繁,2、对空闲表的一次操作时间长
对getblk算法的改进
{
While(没有找到缓冲区)
{
if(块忙)
{
sleep(等待“缓冲区变为空闲”的事件);
continue;
}
为缓冲区标记上“忙”;
把缓冲区移到空闲链表的尾部;
return(缓冲区);
}
else
{
从空闲链表头部摘下一个缓冲区;
if(缓冲区标记“延迟写”)
{
把缓冲区异步写到磁盘上;
continue;
}
从旧散列队列中摘下缓冲区;
把缓冲区投入新的散列队列;
把缓冲区连接到空闲链表表尾;
return(缓冲区);
}
}
}
缺点:1、空闲链表过长,对空闲表的操作更加频繁,2、对空闲表的一次操作时间长
对getblk算法的改进
{
While(没有找到缓冲区)
{
if(块忙)
{
sleep(等待“缓冲区变为空闲”的事件);
continue;
}
为缓冲区标记上“忙”;
把缓冲区移到空闲链表的尾部;
return(缓冲区);
}
else
{
从空闲链表头部摘下一个缓冲区;
if(缓冲区标记“延迟写”)
{
把缓冲区异步写到磁盘上;
continue;
}
从旧散列队列中摘下缓冲区;
把缓冲区投入新的散列队列;
把缓冲区连接到空闲链表表尾;
return(缓冲区);
}
}
}