我是C ++开发人员,我想知道什么可能导致C ++级别的页面错误。
我读过有关页面错误的一些文章,我想fork()
和malloc/new
可能导致页面错误。
还有其他可能导致页面错误的原因吗?
大型可执行文件是否更有可能导致页面错误?
具有非常复杂的逻辑结构的可执行文件是否更有可能导致页面错误?
实际上,malloc
不会引起任何页面错误。内存仅是虚拟分配的,因此在使用前,它既不会占用RAM也不会占用磁盘空间。如果您确实想快速引起页面错误,则必须实际访问有问题的缓冲区以进行读取或写入。
一切都归结为内存使用情况,如果应用程序正在访问相同的2-3 GB数据,则它几乎可以正常运行而不会发生任何页面错误(假设当前没有其他应用程序在滥用您的RAM)。因此,只有当您的应用程序需要访问大量内存或因缺乏使用而变成“冷”内存时,您才会遇到页面错误。
此外,即使您需要从该页面访问单个字节,操作系统也会从磁盘加载整个页面。这意味着,与将所有数据集中在同一附近相比,如果您的数据分散在内存的大区域中,则页面错误可能会更多。
要了解这种机制,一个好的测试应用程序将是分配巨大的缓冲区(超出RAM的容纳能力),然后开始以4K的间隔修改单个字符(在Linux和Windows中通常为单个页面的大小)。这个想法是用最少的精力去弄脏尽可能多的页面,类似于破坏完美的白色纸包装,每页上只有一个黑点的概念,直到您的RAM无法容纳那么多脏页并必须将它们交换到磁盘以加载其他页面供您清理。
while (true) {
char * data = malloc(HUGE_NUMBER)
for (size_t i=0 ; i<HUGE_NUMBER ; i+=4096)
data[i] = (char)rand(); // dirty in 4K intervals
}
因此,最大程度地减少页面错误的一个好方法是保持数据访问模式的较高的内存局部性(使用在内存中顺序排列的数组,而不要使用可能遍布各处的列表或映射),并避免编写需要更多RAM的应用程序而不是目标服务器所能提供的。
关于可执行文件的大小,还取决于实际使用了多少代码。如果您的应用程序花费其90%的时间运行10%的代码,则由于可执行文件的大小而导致页面错误的可能性很低,反之亦然。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句