为分配的内存设置 swappiness
Set swappiness for allocated memory
在 C 或 C++ 程序中分配内存时,是否有一种方法(即使是奇特的)来设置交换性,或者给 OS 一些提示?
请注意,我不想为整个过程设置 swappiness,而是在 object/variable-level。
一般来说,如果没有自定义分配器,您将无法完成如此细粒度的操作。 mlock
和 posix_madvise
之类的东西在页面级别上工作,它们基本上是 on/off 开关。所以对于普通堆,你会为你分配的对象和任何其他恰好共享相同页面的对象调整 "swappiness" (但是你定义它),如果你随后分配了一个新对象一个不同的 "swappiness" 并且它最终出现在同一页面中,您将覆盖旧设置。
要完成这项工作,您基本上需要为 "swappiness" 维护一堆具有不同堆全局设置的单独堆,并根据需要为每个堆分配对象。由于重载 operator new
是基于每个类型的,如果您想更改同一类型的不同对象的行为,您将无法从每个堆手动执行原始分配并执行放置 new
/delete
动态更改所需的 "swappiness".
无论你做什么,分配的任何堆栈都不能使用这种方法,因为堆栈不能像这样拆分,所以为一个堆栈对象调整 "swappiness" 也会为大量的堆栈对象调整它东西(变量和诸如 return 地址存储和寄存器溢出之类的东西)。
注意:如果您谈论的是 Linux 内核 swappiness as ,那是不可能的。它是适用于整个系统的内核级别设置,甚至不能在每个进程级别上进行调整,更不用说每个对象级别了。
您可以使用 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()
或进程退出之前不会交换到磁盘。
在 C 或 C++ 程序中分配内存时,是否有一种方法(即使是奇特的)来设置交换性,或者给 OS 一些提示?
请注意,我不想为整个过程设置 swappiness,而是在 object/variable-level。
一般来说,如果没有自定义分配器,您将无法完成如此细粒度的操作。 mlock
和 posix_madvise
之类的东西在页面级别上工作,它们基本上是 on/off 开关。所以对于普通堆,你会为你分配的对象和任何其他恰好共享相同页面的对象调整 "swappiness" (但是你定义它),如果你随后分配了一个新对象一个不同的 "swappiness" 并且它最终出现在同一页面中,您将覆盖旧设置。
要完成这项工作,您基本上需要为 "swappiness" 维护一堆具有不同堆全局设置的单独堆,并根据需要为每个堆分配对象。由于重载 operator new
是基于每个类型的,如果您想更改同一类型的不同对象的行为,您将无法从每个堆手动执行原始分配并执行放置 new
/delete
动态更改所需的 "swappiness".
无论你做什么,分配的任何堆栈都不能使用这种方法,因为堆栈不能像这样拆分,所以为一个堆栈对象调整 "swappiness" 也会为大量的堆栈对象调整它东西(变量和诸如 return 地址存储和寄存器溢出之类的东西)。
注意:如果您谈论的是 Linux 内核 swappiness as
您可以使用 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()
或进程退出之前不会交换到磁盘。