我正在写一个关于页面错误的文档并试图获得一些具体的数字来使用,所以我编写了一个简单的程序来读取 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 秒。