或者重新从映射内存中再次读取数据会更快,因为操作系统可能会实现自己的缓存机制?
数据的性质事先不知道,假设文件读取是随机的。
或者重新从映射内存中再次读取数据会更快,因为操作系统可能会实现自己的缓存机制?
数据的性质事先不知道,假设文件读取是随机的。
接下来是来自Varnish和反向代理作者的一些笔记:不要在只有x%空闲时尝试分配内存
偶尔会有客户要求设计他们的程序,以便它继续消耗内存,直到只剩下x%。 思路是他们的程序应该积极使用内存,同时仍然留有足够的可用内存(x%)供其他用途。 除非您正在设计一个计算机上运行的唯一程序的系统,否则这是一个坏主意。
(阅读文章了解为什么不好,包括图片的解释)
那么squid复杂的内存管理会发生什么呢?它会与内核复杂的内存管理发生冲突,就像任何内战一样,这都不会有任何进展。
具体情况是这样的:Squid在“RAM”中创建一个HTTP对象,并在创建后快速使用数次。然后过了一段时间,它不再被使用,内核察觉到了这一点。然后有人尝试从内核获取某些内存,内核决定将这些未使用的内存页面推出到交换空间,并将(缓存-RAM)更明智地用于实际由程序使用的一些数据。然而,这是在Squid并不知道的情况下完成的。Squid仍然认为这些http对象在RAM中,直到它尝试访问它们时才会在RAM中,但在那之前,RAM被用于一些有生产力的东西。
想象一下,您确实从内存映射文件中缓存了某些内容。在未来的某个时候,保存该“缓存”的内存将被交换到磁盘上。
我经常使用一个程序,它不遵循这个规则。该程序在其生命周期内分配了大量内存,但当我退出程序时,它只会在那里静坐数分钟,有时以100%的CPU旋转,有时在磁盘上翻滚(有时两者兼备)。当我用调试器中断以查看发生了什么时,我发现该程序并没有做任何有意义的事情。它只是有条不紊地释放了它在其生命周期内分配的每一个字节的内存。
如果我的计算机没有承受太多的内存压力,那么该程序在其生命周期内分配的大部分内存尚未被分页出去,因此释放每一滴内存都是一个CPU密集型操作。另一方面,如果我启动了一个构建过程或执行了其他占用内存的操作,则该程序在其生命周期内分配的大部分内存已经被分页出去,这意味着该程序会从硬盘中重新加载所有内存,只为了能够调用free函数。实际上听起来有点恶意。“来这里,让我告诉你走开。”
所有这些过于细致的内存管理都是无意义的。进程正在退出。当地址空间被销毁时,所有这些内存都将被释放。别再浪费时间了,赶紧退出吧。