c的LRU算法
⑴ lru算法是什么
LRU是Least Recently Used的缩写,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最少使用的页面予以淘汰。
特点:
LRU 算法弊端是存在偶发性、周期性的批量操会降低缓存的命中率,对缓存造成污染,下面几个就是改进算法。
LRU-K会记录每条数据的访问历史,当达到 k 时,才将数据存放到缓存,在缓存内存回收时,缓存中越接近 k 的数据被优先删除。
Two queues(2Q)相当于 LRU-2,区别是访问历史(首次访问)数据缓存于 FIFO 队列,二次及以上的数据存放LRU缓存,FIFO 队列数据遵循该缓存的内存回收机制,LRU缓存数据遵循该缓存的内存回收机制。
⑵ lru算法是什么呢
LRU算法是最少使用页面置换算法(Least Recently Used),首先置换近期最长时间以来没被访问的页面,是为虚拟页式存储管理服务的。
LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。
LRU原理
该思想最初用于计算机操作系统中,内存中的容量较有限,为了能更加合理的利用内存中的性能,对用户的使用作出假设,最近最少使用的越不重要,最近使用的越有可能使用到,使得该元素更容易获取到。
如果元素当前容量超过了内存最大容量,则需要删除掉最近最少使用的元素。在其之后,许多缓存及许多分布式系统都采用才思想。
⑶ C语言用以下函数构造LRU算法,求大侠帮助
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAINMEM 3 //主存可存储的页面个数
#define QUEUEMAXLEN 30 //队列最大长度
struct LRUQueue //定义一个特殊的队列
{
int number;
int data[MAINMEM];
}lru;
void Init(); //初始化操作
void Add(int pageID); //加入队列
int Find(int pageID); //查找页面是否在主存中
void Update(int pos); //更新页所在的地址
void PrintQueue(); //输出主存内容
int main()
{
int i;
int queuelength;
int queue[QUEUEMAXLEN];
Init(); //初始雹握化操作
printf("请输入队列的长度:");
scanf("%d",&queuelength);
printf("请以此输入队列的页号:");
for(i=0;i<queuelength;i++)
{
scanf("誉肆首%d",&queue[i]);
Add(queue[i]);
PrintQueue();
}
system("pause");
return 0;
}
void Init()
{
lru.number = 0;
int i;
for(i = 0;i<MAINMEM;i++)
{
lru.data[i] = -1;
}
}
int Find(int pageID)
{
int i;
for (i=0;i<MAINMEM;i++)
{
if(lru.data[i] == pageID)
{
return i;
}
}
return 0;
}
void Update(int pos)
{
int tmp = lru.data[pos];
int i;
for(i = pos;i<lru.number;++i)
{
lru.data[i] = lru.data[i+1];
}
lru.data[lru.number-1] = tmp; //将被访问的页放在最后一位,其他的页前移,因为置换时删掉的是主存中第一块放置的页面
}
void PrintQueue()
{
printf("当前内存中的页号:\n");
int i;
putch('|');
for(i = 0;i<MAINMEM;i++)
{
if(lru.data[i] == -1)
printf(" |");
else
printf("%d |",lru.data[i]);
}
putch('\n');
}
void Add(int pageID)
{
printf("当前访问的页面:%d\n",pageID);
if(lru.number<MAINMEM) //如庆数果主存没有填满
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
lru.data[lru.number++]=pageID;
}
}
else
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
int i;
for(i=0;i<MAINMEM-1;i++)
{
lru.data[i]=lru.data[i+1]; //数据左移一个单位
}
lru.data[i]=pageID; //加入新数据
}
}
}
⑷ lru算法是什么
最近最少使用页面置换算法,是为虚拟页式存储管理服务的。
LRU算法的建议基于以下事实:在前几条指令中经常使用的页面很可能在后几条指令中经常使用。
相反,长时间未使用的页面将来可能会长时间不使用。 这是众所周知的局部性原则-缓存比内存快,它也以相同的原理运行。 因此,每次交换时,我们只需要找到使用最少的页面来调出内存即可。
(4)c的LRU算法扩展阅读:
LRU算法是大多数操作系统广泛使用以最大化页面命中率的页面替换算法。该算法的思想是,当发生页面错误时,将选择并替换未使用时间最长的页面。
从程序操作原理的观点来看,最近最少使用的算法是相对接近理想的页面替换算法。该算法不仅充分利用了内存中页面调用的历史信息,而且可以正确反映程序的局部问题。
⑸ lru算法是什么
lru算法是一种页面置换算法,在对于内存中但是又不用的数据块,叫做LRU,操作系统会根据那些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
LRU算法:最近最少使用,简单来说就是将数据块中,每次使用过的数据放在数据块的最前端,然后将存在的时间最长的,也就是数据块的末端的数据剔除掉这就是LRU算法。
如果进程被调度,该进程需要使用的外存页(数据)不存在于数据块中,这个现象就叫做缺页。如果这个数据此时不在,就会将这个数据从加入到数据块首部。
数据块插入与剔除:每次有新数据到来时,会将其放入数据块首部,当数据每次被访问时,岩键肢将这个数据插入数据块的首部如果数据块满了,每次新进的数据都会将数据块尾部的数据挤出数据块。
差距
为了尽量减少与理想算法的差距,产生了各种精妙的算法,最少使用页面置换算法便是其中一个。LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经亮铅很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是着名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。因此,我们只需要在每次调换时,找到最少使用的那个页面调出内存。这就是LRU算法的全部内容。
LRU在电子系统中的解释:
Line Replaceable Unit—LRU,电子系统中常采用模块化设计,这种可更换的模块单元则被叫做LRU,中文名称是“线性可粗世更换单元”。
⑹ lru的算法是什么
lru的算法是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
对于虚拟页式存储,内外存信息的替换是以页面为单位进行的——当需要一个放在外存的页面时,把它调入内存,同时为了保持原有空间的大小,还要把一个内种调动越少,进程执行的效率也就越高。
硬件支持
LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。
寄存器
为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为:
R = Rn-1 Rn-2 Rn-3…R2 R1 R0。
⑺ LRU算法具体怎么算的,有没有例子
有例子 LRU(least recently used)最近最久未使用。
假设 序列为 4 3 4 2 3 1 4 2
物理块有3个 则
首轮 4调入内存 4
次轮 3调入内存 3 4
之后 4调入内存 4 3
之后 2调入内存 2 4 3
之后 3调入内存 3 2 4
之后 1调入内存 1 3 2(因为最近最久未使用的是4,从这里向前找最近最久未使用的)
之后 4调入内存 4 1 3(原理同上)
最后 2调入内存 2 4 1
过程就是这样的,楼主只要明白最近最久未使用这个道理,再回去参考书上的例子就明白是怎么算的啦!呵呵!