我在接受采访时被问到这个问题.Plz告诉我答案: -
您没有内核的文档。您只知道内核支持分页。 您如何找到该页面大小?您没有可以告诉您页面大小的标记或宏。
我得到了提示,因为你可以使用Time来得到答案。我仍然不知道它。
答案 0 :(得分:1)
运行如下代码:
for (int stride = 1; stride < maxpossiblepagesize; stride += searchgranularity) {
char* somemem = (char*)malloc(veryverybigsize*stride);
starttime = getcurrentveryaccuratetime();
for (pos = somemem; pos < somemem+veryverybigsize*stride; pos += stride) {
// iterate over "veryverybigsize" chunks of size "stride"
*pos = 'Q'; // Just write something to force the page back into physical memory
}
endtime = getcurrentveryaccuratetime();
printf("stride %u, runtime %u", stride, endtime-starttime);
}
使用X轴上的步幅和Y轴上的运行时间来绘制结果图。 stride = pagesize应该有一个点,性能不再下降。
这会导致许多页面错误。一旦步幅超过页面大小,故障数量就会不断增加,因此程序的性能不会明显降低。
如果你想更聪明,你可以利用mprotect
系统调用必须在整个页面上工作的事实。尝试使用更小的东西,你会得到一个错误。我确信还有其他类似的“漏洞” - 但上面的代码将适用于任何支持分页的系统以及磁盘访问比RAM访问昂贵得多的系统。这将是每个常规现代系统。
答案 1 :(得分:0)
在我看来,这是一个关于“分页如何实际工作”的问题 他们希望您解释更改页面大小对系统执行的影响。
我对这些东西有点生疏,但是当页面已满时,系统会启动页面交换,这会减慢所有内容。因此,您希望运行能够将内存填充到不同大小的内容,并测量执行任务所需的时间。在某些时候会有一个跳跃,执行任务所花费的时间会突然跳跃。
就像我说的那样,我执行此操作时有点生疏。但我很确定这就是他们追求的答案的形状。
答案 2 :(得分:0)
无论他们期待什么答案,这几乎肯定是一个脆弱的解决方案。一方面,您可以拥有多个页面大小,因此您可能为一个小分配获得的任何答案可能与下一个多兆字节分配无关(请参阅Linux的Large Page支持)。
我怀疑这个问题更多的是针对您如何处理问题,而不是您提出的最终解决方案。
顺便说一下,这个问题不是关于linux的问题,因为你确实有关于它的文档以及POSIX合规性,你只需要调用sysconf(_SC_PAGE_SIZE)。