Как и где кешируются инструкции? - PullRequest
0 голосов
/ 16 января 2020

Если бы я запускал двоичную исполняемую программу, все ли инструкции должны храниться в кеше команд? Является ли кэш команд местоположением в одном из кэшей ЦП L1, L2 или L3 или это другой объект? Я не очень понимаю, что физически происходит, когда я запускаю исполняемый файл, и любая ясность будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Ваш исполняемый файл на диске логически сопоставлен с памятью в виртуальном адресном пространстве нового процесса.

Как обычно с виртуальной памятью, касание 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.

2 голосов
/ 16 января 2020

Инструкции постоянно хранятся в двоичном исполняемом файле на вашем устройстве хранения данных. Когда программа выполняется, содержимое исполняемого файла загружается в первичную память (RAM). Вообще говоря, весь трафик c между процессором и оперативной памятью проходит через кеш; как и инструкции, содержащиеся в исполняемом файле.

Кэш может содержать инструкции, данные или и то, и другое. В случае процессоров Intel существует два кэша L1: L1d для данных и L1i для инструкций; L2 и L3 являются общими. Следующее изображение иллюстрирует это довольно четко:

Cache hierarchy

Источник изображения

Это короткий ответ. Если вы захотите узнать больше, у вас будет много хорошего материала. Ульриха Дреппера * То, что каждый программист должен знать о памяти , отлично подходит для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...