Для второй программы; ЦП обращается к первым int
в строке, вызывая сбой страницы, затем обращается к другим int
в строке, когда страница уже присутствует. Это означает, что (если строки начинаются на границах страницы) вы получите ошибку страницы для каждой строки, плюс, вероятно, один при первом запуске кода программы, плюс, возможно, еще один, когда стек программы используется впервые (и еще один, если массив не выравнивается по границе страницы); что, вероятно, срабатывает до 1026 или 1027 ошибок страниц.
Для первой программы; CPU обращается к первому int
в строке, вызывая отказ страницы; но к тому времени, когда он обращается ко второму int
в той же строке, страница была исключена (стала «наименее использованной» и заменена другой страницей). Это означает, что при доступе к массиву вы получите 1024 * 1024 страниц с ошибками (плюс одна для кода программы, стека и т. Д. c). Это, вероятно, сработает до 1048578 ошибок страниц (если начало массива выровнено по «sizeof(int)
»).
Однако; все это предполагает, что компилятор ничего не смог оптимизировать. На самом деле весьма вероятно, что любой компилятор, который стоит использовать, преобразовал бы обе программы во что-то более похожее на "memset(array, 0, sizeof(int)*1024*1024);
", которое выполняет последовательные записи (возможно, записывает несколько int
за одну большую запись, если базовый процессор поддерживает большие записи Это означает, что обе программы, вероятно, вызовут 1026 или 1027 страниц с ошибками.