PostGreSQL--内存上下文(内存池)

背景

原文链接:http://blog.csdn.net/ordeder/article/details/31768749

看了几个内存池的设计,如python,STL,基本上对内存的管理有两种结构:

1.block,即内存块,一般和内存页(pagesize)大小相关。

2.chunk,即内存分片,即在该内存块上分配要使用的内存空间。

例如python的pyIntObject中使用到的缓冲池的实现: http://blog.csdn.net/ordeder/article/details/25343633

对于内存池的管理,就涉及到了两种链表,

1.内存池的内存块链表

2.对于被使用后回收的内存分片,将被回放与内存分片的链表中。

内存池对于一个内存请求(k大小),将提供以2为倍数的略大于k的内存空间给用户。对于内存的分片,一般提供2^(i+2) (0<= i <=11)字节大小的不同内存分片。大于2^13B字节的内存的申请请求,内存池是不提供服务,而是直接通过系统的alloc进行分配的,当然这个内存的释放也不会被回收到内存分片链表(freelist)中。

PostGreSQL的内存上下文

每个内存池被他组织成一个内存上下文,而系统中多个内存池是通过一个树结构对这些内存上下文进行统一的组织和维护。下面是他的内存上下文的一些数据结构关系图(草图):

memoryContentData: 作为内存上下文的节点,多个节点构成系统的内存上下文树。

AllocSetContext: 作为内存池的基本数据结构,主要包括内存块链表:*block,和内存分片链表的数组Freelist[]

AllocBlockData:内存块结构,作为内存块的头部信息,其中的两个char*指针指向了该内存块的起始和终止的内存地址。aset作为该内存块从属于哪个AllocSetContext的标记。

AllocChunkData:内存分片结构(header),作为分片的头部信息,他的具体分片的内存空间紧接其后。头部信息中有有意思的要属于void * aset指针了,如果该分片为空闲(未被分派),那么aset指针将作为freelist所用,作为next指针指向下一个空闲的分片。否则,该内存分片被分配了(不为空闲)那么该分片必不在freelist[]的链表中,从而aset记录该分片属于哪个内存块(AllocBlockData)

PostGreSQL--内存上下文(内存池),布布扣,bubuko.com

时间: 2024-12-22 17:53:41

PostGreSQL--内存上下文(内存池)的相关文章

C#之CLR内存字符串常量池(string)

C#之CLR内存字符串常量池(string) 投稿:shichen2014 字体:[增加 减小] 类型:转载 时间:2014-08-04我要评论 这篇文章主要介绍了C#之CLR内存字符串常量池(string),对于学习和理解C#内存原理很有帮助,需要的朋友可以参考下 C#中的string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorld")这样的重装也说没有的. 我们先来看一个方法: ? 1 2 3 4 5 6 7 8 cl

ORACLE将执行过的SQL语句存放在内存的共享池

Oracle SQL性能优化深入浅出 ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享.当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用. 为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglob

20150222 IMX257 Linux内存空间内存分配

2015-02-22     李海沿 不知道为什么,最近做梦总是梦见以前的事,以前的场景,可能是28号回学校的缘故吧!好了,不扯废话了,前面我针对gpio按键这个实验学习了中断,信号量,定时器等内核实现,下面我们,使用以前的字符设备模板来写一个Linux内存空间内存分配的实验. 一.KMALLOC kmalloc 是一个功能强大且高速(除非被阻塞)的工具,所分配到的内存在物理内存中连续且保持原有的数据(不清零).原型: #include <linux/slab.h> void *kmalloc

计算机操作系统学习笔记_7_内存管理 --内存管理基础

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

0x7c95caa2指令引用的0x00000000内存 该内存不能read

出现这样的错误,往往和动态库有关系! 解决方法: 0x7c95caa2指令引用的0x00000000内存 该内存不能read,布布扣,bubuko.com

转: 【Java并发编程】之十七:深入Java内存模型—内存操作规则总结

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量主要是指共享变量,存在竞争问题的变量.Java内存模型规定所有的变量都存储在主内存中,而每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取.赋值等)都必须在工作内存中

常见动态内存错误---内存泄漏

常见动态内存错误 编译器不能自动发现动态内存错误,动态内存错误通常只能在程序运行时才能被捕捉到,而且错误原因不容易查找,错误本身也不容易捕捉,改错难度较大. 1.动态内存分配失败却继续操作 内存不足等有可能导致动态内存分配失败,所以使用new请求分配动态内存后一定要检查返回地址是否为NULL. 如用if(p==NULL) 或 if(p!=NULL)进行检查,未检查前不要操作动态内存空间. 2.动态内存空间未初始化就进行读操作 C++标准并未规定动态内存空间的默认值,程序无法预知该默认值的具体指.

双倍数据速率内存的内存控制器及其控制方法

本发明公开了一种双倍数据速率内存的内存控制器及其控制方法.内存控制器中包括仲裁器.主状态机.刷新管理单元.寄存器和功耗管理单元:主状态机向功耗管理单元反馈双倍数据速率内存的状态:根据功耗管理模块的通知,控制双倍数据速率内存进入或退出预充电掉电状态:功耗管理单元在双倍数据速率内存进入激活待机状态后,通知主状态机控制双倍数据速率内存进入预充电掉电状态,并在仲裁器指示当前接收到读写命令或刷新管理单元指示刷新周期到来时,通知主状态机控制双倍数据速率内存退出预充电掉电状态.应用本发明,能够降低软件资源在双

“非易失性内存”嫁接“内存计算”——高速安全的大数据时代来临

“非易失性内存”嫁接“内存计算” ——高速安全的大数据时代来临 题记 数据库奠基人Jim Gray:“磁带已经死了,磁盘已经落伍,闪存成为存储,内存才是王道”.“不管磁盘是否消融,闪存都是将来的一个趋势.” 石油一直直接影响着世累经济的发展速度和发展水平,现在,信息将发挥同样的作用.<经济学人>表示:“数据和信息日益成为商业的新能源,是一种与资本.劳动力并列的新经济元素”. 数据保护 大数据时代的机遇和挑战 大数据“风华正茂” 大数据时代,每两天的数据量就达到2ZB,相当于20世纪前人类文明所

为什么X86汇编中的mov指令不支持内存到内存的寻址?

在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.