我现在正在解决 Ubuntu 上的以下问题:是否可以指定一个进程是否应仅在 RAM 中运行(即不允许交换)或相反,仅在交换部分运行?我的意思是该进程应该被系统终止,而不是使用其他类型的内存。
这对我很重要,因为我应该比较更多算法的运行时间,并且必须确保所有进程都在 RAM 或交换部分运行。
答案1
不,除非一个进程获得内存并绑定该内存,否则mlock
没有保证的方法来确保它不会进入交换。
交换用于存放匿名脏页。它没有固定的文件系统支持或来源,因此没有程序曾经可以从交换开始。
除非应用程序在调用获取内存时使用 mlock() 绑定内存,否则它可以进入交换区。您可以尝试通过不使用交换文件或交换分区来消除整个“进入交换区”理论,但这实际上并不是推荐的方法。
答案2
如果此时进程进行交换,可能没有一种方便的方式来终止它。但是,编写一个小型守护进程的脚本应该相当容易。您的脚本需要执行的操作:
- 确定所有相关进程 ID
- 对于每个 ID,请参阅 /proc/${PROCESS_ID}/smaps 中的“Swap:”字段
- 如果这些字段的总和 > 0,则终止该进程
这可能不是一个好的解决方案,但总比没有好。相关讨论可以在linuxquestions.org对于手动监控进程,您可以告诉“top”显示使用了多少交换空间(在 top 中,按“f”并显示 SWAP 字段)。hth