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