Ваш исполняемый файл на диске логически сопоставлен с памятью в виртуальном адресном пространстве нового процесса.
Как обычно с виртуальной памятью, касание 4k страниц исполняемого файла может вызвать сбой страницы, если данные не на самом деле не в DRAM (ошибка жесткой страницы) или, если это так, но таблицы HW-страниц не «связали» эту страницу. Сбои программных страниц могут по-прежнему происходить при каждом повторном запуске, потому что операционные системы обычно "ленивы" в отношении подключения таблиц страниц, даже когда данные файлов находятся в кэше страниц ядра.
(x86 использует страницы виртуальной памяти 4 КБ. Это обычное явление размер страницы, но некоторые другие ISA делают или могут использовать другие размеры страниц, например, 8 КБ или 16 КБ.)
Ядро может оптимизировать, убедившись, что по крайней мере страница, содержащая точку входа в процесс, загружена с диска и подключена перед вводом пользовательское пространство. В противном случае он просто вернется к ядру. например, очень рано Linux, как и 0.11, работало таким образом, как готовый рабочий этап в разработке, прежде чем делать его хорошим.
Когда данные находятся в DRAM, выполнение выполняется по ЦП выполняет выборку кода через кэш L1i / L2 / L3 . Это похоже на загрузку данных, но проходит через I-кэш L1 вместо D-кеша L1, предполагая, что машина с разделенными кешами L1. Внешние уровни кэша (при условии, что они существуют) почти всегда унифицированы. Современные процессоры x86 и другие высокопроизводительные чипы, такие как POWER, обычно имеют 3 уровня кэш-памяти, обычно L1i / d и L2 являются частными для каждого ядра с большим общим L3. В противном случае у вас может быть только частный L1i / L1d и общий L2, или в одноядерной системе может быть только один или два уровня кэша.
Эти кэши имеют размер строки 64 байта на большинстве процессоров (включая все Процессоры x86 начиная с P4 / Core 2 или около того). Отсутствие кэша не ошибка , ядру просто нужно дождаться прибытия линии. Если есть какое-либо неупорядоченное выполнение, которое все еще не выполнено, оно все еще может происходить, пока пропадает кеш кода. Но в противном случае процессор застрял, и ему вообще нечего делать.
(пропуски TLB - тоже вещь. У большинства ISA есть аппаратный просмотр страниц, который делает его прозрачным для программного обеспечения, но пропадание iTLB может аналогичным образом остановить выбор команды оставляя процессор без какой-либо работы в очереди. Таким образом, промахи i-cache / i-TLB даже хуже, чем промахов data-cache / d-TLB, где промах-промах / попадание-промах и выполнение заказа может позволить продолжить некоторую полезную работу.)
В современных процессорах x86 декодированные инструкции кэшируются в небольшом, очень быстром «кэше uop», а также кэшируются байты машинного кода в кеше L1i.
В Pentium 4 не было кеша L1i, только кеш трассировки, но это не сработало очень хорошо. И у него не было транзистора или бюджета мощности для достаточного количества декодеров, чтобы быстро создавать трассировки при промахах кэша трассировки. Это был один из основных недостатков микроархитектуры NetBurst.