为已分配的内存设置swappiness

时间:2015-11-19 16:15:31

标签: c++ c malloc

在C或C ++程序中分配内存时,有一种方法(即使是异国情调的)设置swappiness,或者向操作系统提供有关它的提示吗?

请注意,我不想为整个过程设置swappiness,而是在object / variable-level。

2 个答案:

答案 0 :(得分:3)

一般情况下,如果没有自定义分配器,您就无法做到细粒度的事情。像mlockposix_madvise这样的内容适用于页面级别,它们基本上是开/关切换。所以对于普通的堆,你要调整" swappiness" (但是你定义它)你分配的对象和碰巧共享同一页面的任何其他东西,如果你随后分配了一个具有不同的" swappiness"并且它最终出现在同一页面中,您将覆盖旧设置。

为了完成这项工作,你基本上需要为" swappiness"维护一堆具有不同堆全局设置的独立堆,并根据需要将对象分配给每个堆。并且由于重载operator new是基于每个类型的,如果您想要更改相同类型的不同对象的行为,那么您将无法手动执行每个堆的原始分配并执行放置{{1 } / new动态更改所需的" swappiness"。

无论你做什么,分配的任何堆栈都不能使用这种方法,因为堆栈不能像这样拆分,所以调整" swappiness"对于一个堆栈对象,它也会调整大量的东西(变量和返回地址存储和寄存器溢出等内容)。

注意:如果您将Linux内核swappiness称为@nicolacdnil suggests in the comments,则无法做到这一点。它是适用于整个系统的内核级别设置,它甚至在每个进程级别上都不可调,更不用说每个对象级别了。

答案 1 :(得分:0)

您可以使用mlock

struct MyStruct { // ... };

void * memory_pool = malloc(sizeof(MyStruct));
mlock(memory_pool, sizeof(MyStruct));

MyStruct * my_struct = new(memory_pool) MyStruct();

// (You must check all values returned by `malloc`, `mlock` and `new`!)

my_struct将在物理内存中,在调用munlock()或进程退出之前不会交换到磁盘。