Я пишу документ о сбое страницы и пытаюсь получить конкретные числа для работы, поэтому я написал простую программу, которая считывает 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);
}
Так что да, он проходит и читает весь файл.Проблема в том, что мне нужен зонд dtrace, который будет запускаться 1536 раз во время этого процесса (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 секунды.