1
如何使内核压缩碎片内存
我在跑步Fedora 26。 这是我的算法教授给我的一个非常奇怪的任务。作业说: C中的内存碎片: 设计,实现和执行一个C程序,该程序执行以下操作:它为3m每个大小为800,000个元素的数组序列分配内存;然后它显式地取消分配所有偶数数组,并分配m每个大小为900,000个元素的数组序列。测量程序分配第一个序列和第二个序列所需的时间。选择m耗尽几乎所有程序可用的主内存。” 这样做的总体目标是对内存进行分段,然后请求的内存量要大于连续块的可用内存量,从而迫使操作系统压缩或整理内存碎片。 在课堂上,我问我们应该怎么做,因为内存是可视的,而不是实际上是连续的,他回答:“好吧,您必须关闭[虚拟内存]。” 其他一些学生在课堂上问我们如何知道何时达到“垃圾收集”状态,他说:“第二次分配的时间应该比第一次分配的时间长,因为垃圾收集需要花费时间” 经过一番搜索后,我发现禁用虚拟内存的最接近方法是使用禁用交换内存swapoff -a。我禁用了桌面环境,并从本机终端编译并运行了程序(以避免受到其他进程的干扰,尤其是诸如桌面环境之类的繁重进程)。我这样做并以递增的方式运行程序,m直到达到第二个分配的时间大于第一个分配的时间。 我以递增的方式运行该程序,m并最终找到了第二个分配的时间比第一个分配的时间长的点。但是,在此过程中,我遇到了一个问题,即在第二次分配之前该进程已被终止。我检查了一下dmesg,发现它被oom-killer 杀死。我发现并阅读了有关oom-killer的几篇文章,发现可以禁用内核对内存的过度分配。 我这样做并再次运行程序,只是这次我找不到m第二个的时间比第一个大的时间。最终,随着m越来越大(尽管比启用了过度分配时要小得多),malloc将失败并且我的程序将终止。 我有三个问题,第一个并不是那么重要: 垃圾回收是否是正确的术语?我的教授非常坚定地说这是垃圾收集,但是我假设垃圾收集是通过编程语言完成的,因此将其视为更碎片整理。 在Linux系统上是否可以像他想的那样进行压缩? 为什么在禁用交换但仍启用了内存过度分配的情况下,第二次分配的时间比第一次分配的时间长?压实实际上发生了吗?如果是这样,为什么在禁用内存过度分配后无法达到压缩的程度?