进程在混合内存中的分配策略

          前面文章中已经提到使用PCM和DRAM混合内存的方式,降低内存的能耗,同时又不会严重影响内存性能的策略,具体可见http://blog.csdn.net/gaoxiang__/article/details/38944269

为了实现上述功能,对于一个进程而言,内存具体应该如何分配呢?我们从三个方面解决这个问题。

第一点,根据PCM读取速度快,写操作慢的特点,应该将进程中只读的或者读操作远远大约写操作的块放到PCM内存中。众所周知,在一个进程中一般分为5个段text、bss、heap、stack和内核堆栈,显然stack段是进程频繁操作的段,所以将其放在DRAM中;而text和bss段是只读的段,应该放置在PCM中。至于heap和内核堆栈,有些资料上说应该放在DRAM上,不过个人认为应该视情况而定。由于接下来会有动态调整策略,就先将它们放置在DRAM中。

第二点,基于上述的静态分配的方式,可以将只读或者很少写操作的页放在PCM中,下面继续说明一种动态的分配方式。这种方式就是将DRAM中很少写的数据迁移到PCM中,同时将PCM中写频繁的数据迁移到DRAM中。在这里使用了最近最少使用算法(LRU),即认为最近很少写的也在将来一段时间内也会很少的写操作,最近写频繁的页在将来一段时间也会频繁的进行写操作。需要说明的是,如果有大量的数据进行迁移可能会消耗大量的时间,在这里可以考虑使用DMA帮助数据进行迁移。另外,数据的迁移之后必须保证进程可以继续访问到它,在这里其实只需要修改页表即可。

第三点,鉴于PCM断电不易失的特性,可以考虑将常用的text信息长期保存在PCM中,这样当重新打开某个可执行程序的时候首先搜索PCM,查看text段和数据段是否存在,加入存在就无需从硬盘上重新加载。在减少了PCM写的同时,也加快了软件的加载速度。当PCM中不在存在空闲数据块的时候,通过一定的策略选择覆盖的数据块,从而保证PCM中数据的最优化利用。

最后一个问题是PCM有使用寿命的限制,即PCM可进行写操作的次数是有限的。所以这里涉及一个负载均衡问题,为解决这个问题,创建三个链表free、used和Threshold。free指向的是空闲的块,used表示的是已经用过的块,threshold表示的是已经超过阈值的块。当进程申请PCM内存的时候首先在free中寻找空闲的块,如果可以找到就将该块分配给申请进程;加入free中不再存在空闲块,就修改阈值,并将used和符合条件的Threshold合并后加入到free中,表示完成一次负载均衡操作。当进程释放掉内存块的时候,并不将释放的内存块添加到free中,而是添加到used链表中,如果超过了阈值,就将其移动到threshold链表里。这样就不会出现进程不断访问同一个内存块的情况,会在一定程度上延长PCM的寿命。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值