- 论坛徽章:
- 2
|
本帖最后由 gvim 于 2014-03-20 20:40 编辑
回复 84# OwnWaterloo
来来一起撸撸。。。
说到内存管理,个人觉得postgresql的还比较有意思。
虽然设计关注点不一样,很多底层比如freelist这种通用思想也和内核有共通之初。
pgsql是数据库,它的环境相比较内核来说,杂乱的分配是必须的,因为中间各种数据要内存,子查询要内存,事务要内存,IO出来的元组需要内存,网络需要内存,然后还要回滚,要优化,等等等等,相比较而言web服务器的内存使用场景算简单的,复杂性个人评估在各种系统级应用中天字第一。OLTP环境里一个SQL语句不少时候也能在上k行的量。pg7, 02年之前,内存老泄,排查十分困难,分配路径太杂。
和内核不同的是它不需要兼顾公平和通用。我个人理解为分级递归管理。用几个数据结构来形成一颗树或一个森林来管理,每个节点做为一个context,不同的内存申请在不同的处理阶段在不同的context中进行,每个context可以有自己的init/alloc/free函数系,每一次的内存操作都在对应的context中,当然也可以用一套函数系(好处是可以很方便的自定义memory management algorithm)。这里也有freelist,block这些典型的mem管理元素的出现来管理碎片,链条。到释放的时候,就很规整,按级别,按顺序,可以递归整体,可以释放孩子。
网上扒的一个context示意图,管中窥豹,管理的复杂度可见一斑。 |
-
kk.png
(21.29 KB, 下载次数: 48)
网上抓的
|