berkeley db 内存池 LRU算法
priority based lru
in src/mp/mp_fget.c, __memp_fget()
, 初始化 一个page buffer时, 设置其 priority:
bhp->priority = MPOOL_LRU_REDZONE;
in src/mp/mp_fget.c, __memp_fput()
, 对一个page buffer做put, 使其reference减一. bhp->ref--
, 若reference减为0, 则调整其 priority. 下面的 bhp->priority = c_mp->lru_priority;
和 ++c_mp->lru_priority
保证LRU; 而且根据传入的 priority参数做相应的调整.
prioriry最大为UINT32_MAX, 所以有可能需要 wraparound. __memp_reset_lru() 降低 所有page buffer的priority.
/* Update priority values. */
if (priority == DB_PRIORITY_VERY_LOW ||
mfp->priority == MPOOL_PRI_VERY_LOW)
bhp->priority = 0;
else {
/*
* We don't lock the LRU priority or the pages field, if
* we get garbage (which won't happen on a 32-bit machine), it
* only means a buffer has the wrong priority.
*/
bhp->priority = c_mp->lru_priority;
switch (priority) {
default:
case DB_PRIORITY_UNCHANGED:
pfactor = mfp->priority;
break;
case DB_PRIORITY_VERY_LOW:
pfactor = MPOOL_PRI_VERY_LOW;
break;
case DB_PRIORITY_LOW:
pfactor = MPOOL_PRI_LOW;
break;
case DB_PRIORITY_DEFAULT:
pfactor = MPOOL_PRI_DEFAULT;
break;
case DB_PRIORITY_HIGH:
pfactor = MPOOL_PRI_HIGH;
break;
case DB_PRIORITY_VERY_HIGH:
pfactor = MPOOL_PRI_VERY_HIGH;
break;
}
adjust = 0;
if (pfactor != 0)
adjust = (int)c_mp->pages / pfactor;
if (F_ISSET(bhp, BH_DIRTY))
adjust += (int)c_mp->pages / MPOOL_PRI_DIRTY;
if (adjust > 0) {
if (MPOOL_LRU_REDZONE - bhp->priority >=
(u_int32_t)adjust)
bhp->priority += adjust;
} else if (adjust < 0)
if (bhp->priority > (u_int32_t)-adjust)
bhp->priority += adjust;
}
...
/*
* On every buffer put we update the cache lru priority and check
* for wraparound. The increment doesn't need to be atomic: occasional
* lost increments are okay; __memp_reset_lru handles race conditions.
*/
if (++c_mp->lru_priority >= MPOOL_LRU_REDZONE &&
(t_ret = __memp_reset_lru(env, infop)) != 0 && ret == 0)
ret = t_ret;
return (ret);
src/mp/mp_alloc.c, __memp_alloc()
, 无法分配新的 buffer的内存时, 则重用已有的 buffer内存. 算法很复杂, 单独写一个吧.
berkeley db 内存池 LRU算法的更多相关文章
- berkeley db 内存池分配机制
__memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 ...
- Redis内存回收:LRU算法
Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...
- 高效内存池的设计方案[c语言]
一.前言概述 本人在转发的博文<内存池的设计和实现>中,详细阐述了系统默认内存分配函数malloc/free的缺点,以及进行内存池设计的原因,在此不再赘述.通过对Nginx内存池以及< ...
- Redis内存管理中的LRU算法
在讨论Redis内存管理中的LRU算法之前,先简单说一下LRU算法: LRU算法:即Least Recently Used,表示最近最少使用页面置换算法.是为虚拟页式存储管理服务的,是根据页面调入内存 ...
- 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
一,LRU算法介绍 LRU是内存分配中“离散分配方式”之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中,发现某页面不在物理内 ...
- Linux内核-内存回收逻辑和算法(LRU)
Linux内核内存回收逻辑和算法(LRU) LRU 链表 在 Linux 中,操作系统对 LRU 的实现主要是基于一对双向链表:active 链表和 inactive 链表,这两个链表是 Linux ...
- 新浪研发中心: Berkeley DB 使用经验总结
http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.html NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Be ...
- InnoDB的后台线程(IO线程,master线程,锁监控线程,错误监控线程)和内存(缓冲池,重做日志缓冲池,额外内存池)
InnoDB有多个内存块,你可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构. 缓存磁盘上的数据,方便快速地读取,并且在对磁盘文件的数据进行修改之前 ...
- Berkeley DB 使用经验总结
作者:陈磊 NoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据.Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列.最近使用BDB来发 ...
随机推荐
- [知识整理]Java集合(二) - Set
一.实现Set的几个类 HashSet.LinkedHashSet.TreeSet.ConcurrentSkipListSet.CopyOnWriterArraySet 二.对应底层的数据结构 Has ...
- 干货|宏巍软件之Java线程监控之旅
宏巍软件 许向 大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于2005年,是一家以电商ERP软件开发为主的高新技术科技型软件公司,致力于为大型网商和电子商务企业提供专业. ...
- AQL 对象关系图
- Java中public,private,protected,和默认的区别
Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...
- mysql远程连接命令(转)
一.MySQL 连接本地数据库,用户名为"root",密码"123"(注意:"-p"和"123" 之间不能有空格) C: ...
- javascript全局变量和局部变量
局部变量和全局变量可以同名.不过在函数体内部,局部变量的优先级高于全局变量.需要格外注意:专用于函数体内部的变量一定要用var关键字声明,否则该变量会变成全局变量.因为js是弱类型语言,所以它可以存放 ...
- ng-repeat产生的对象会带有$$hashkey属性处理方法
angularJS在ng-repeat的时候会产生一个$$hashkey的属性向后台发送请求的时候需要转成JSON的string格式(如果是使用ng自带的$http服务的话可以无视,$http服务会自 ...
- 序列化--dict与(file)文件读写
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: d = dict(name='Bob', age=20, score=88) 可以随时修改变量,比如把name改成'Bill',但 ...
- jdk8 Lambda表达式与匿名内部类比较
Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...
- WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示
转载自:http://www.dotblogs.com.tw/rainmaker/archive/2012/02/22/69811.aspx 解决方案: 在调用用户控件的窗体里面添加一下代码: pro ...