gpt4 book ai didi

virtual-memory - 当磁盘中的页面出现故障时,哪个 (OS X) dtrace 探测器会触发?

转载 作者:行者123 更新时间:2023-12-02 02:32:07 27 4
gpt4 key购买 nike

我正在编写一份关于页面错误的文档,并试图获得一些具体的数字来处理,所以我编写了一个简单的程序来读取 12*1024*1024 字节的数据。简单:

int main()
{
FILE*in = fopen("data.bin", "rb");
int i;
int total=0;
for(i=0; i<1024*1024*12; i++)
total += fgetc(in);
printf("%d\n", total);
}

所以是的,它遍历并读取整个文件。问题是我需要在此过程中触发 1536 次的 dtrace 探测器 (12M/8k)。即使我计算了所有 fbt:mach_kernel:vm_fault*: 探测器和所有 vminfo:::探测器,我也没有达到 500,所以我知道我没有找到正确的探测器。

有人知道我在哪里可以找到当页面从磁盘出现故障时触发的 dtrace 探测器吗?

更新:

如果问题是在 stdio 函数中进行了一些智能预取,我尝试了以下操作:

int main()
{
int in = open("data.bin", O_RDONLY | O_NONBLOCK);
int i;
int total=0;
char buf[128];
for(i=0; i<1024*1024*12; i++)
{
read(in, buf, 1);
total += buf[0];
}
printf("%d\n", total);
}

这个版本需要更长的时间来运行(42 秒实时,其中 10 秒是用户时间,其余是系统时间 - 页面错误,我猜)但仍然产生我预期的五分之一的错误。

好奇的是,时间增加不是由于循环开销和强制转换(char 到 int)。执行这些操作的代码版本需要 0.07 秒。

最佳答案

不是直接的答案,但您似乎将磁盘读取和页面错误等同起来。它们不一定相同。在您的代码中,您正在将文件中的数据读取到一个小的用户内存块中,因此 I/O 系统可以以任何它认为合适的方式和大小将文件读取到缓冲区/VM 缓存中。我在这里可能是错的,我不知道 Darwin 是怎么做到的。

我认为更可靠的测试是mmap(2)将整个文件放入进程内存,然后去触摸每一页就是那个空间。

关于virtual-memory - 当磁盘中的页面出现故障时,哪个 (OS X) dtrace 探测器会触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3349185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com