我可以将当​​前内存内容标记为不可交换吗?

mhe*_*dez 5 memory swap

背景:在我的 Linux (ubuntu) 工作站中,我想运行一些实验,分配比物理 RAM 更多的内存,同时在 GUI 中执行其他“正常”操作。

问题:我有足够的交换空间。当实验开始交换时,GUI 变得非常慢。我怀疑问题在于“正常”的东西不断地移入和移出交换空间。我希望操作系统仅交换实验内存,而不是“正常”内存。

问题:我可以将在某个点(例如,开始实验之前)分配的所有内存标记为“不可交换”吗?我不介意这是在页面级别还是在进程级别完成的。

感谢您的帮助!

Jak*_*uje 1

不可交换内存称为“固定”内存,这是常用于 DMA(直接内存访问)的内存类型。mlock(2)您可以使用或函数来标记虚拟地址的某些部分mlockall(2)

您可以使用 GDB脚本标记某些应用程序内存固定mlock.gdb

call mlockall(3)
detach
Run Code Online (Sandbox Code Playgroud)

并使用这样的命令锁定您的应用程序内存:

gdb --pid ${PID} --batch -x mlock.gdb
Run Code Online (Sandbox Code Playgroud)

  • 至少在 Linux 上,您可以 mlock 的内存量是有限的(请参阅“ulimit -l”和“bash”),在我的例子中为“64KiB”,因此您需要首先提高该限制,否则只能起作用对于以 root 身份运行的进程。这也意味着从磁盘加载所有页面,包括映射文件的完整内容(例如可执行文件的死代码) (3认同)