В моем классе операционных систем нам показали картинку, изображающую иерархию памяти, начиная с самой дорогой и самой быстрой сверху и наименее дорогой и медленной снизу. На самом верху были регистры, а под ним - кеш. Профессор сказал, что лучшее место для запуска программ - это кеш. Мне было интересно, почему программы не могут быть запущены в регистрах? Кроме того, как программа может загрузить себя в кеш? Разве кэш не управляется процессором и работает автоматически без программного контроля?

4 ответа4

3

Это очень сложный вопрос, ожидайте несколько ответов, поскольку люди лучше, чем ответы других :)

Профессор сказал, что лучшее место для запуска программ - это кеш.

Помните, что кеш во много раз дороже обычной оперативной памяти. В те времена, когда «большой» компьютер занимал 8 МБ (не гигабайты, мегабайты), вы могли обнаружить, что все компьютеры были «кэш-памяти» (технически это особый тип ОЗУ, называемый SRAM), но они были более дорогими. Теперь у вас есть домашние машины с 4 ГБ памяти, 4 ГБ SRAM, подключенного к чипу, будут ОЧЕНЬ дорогими. Кроме того, у вас есть много умных людей, играющих с программами и компиляторами, чтобы наилучшим образом использовать кеш. При правильном алгоритме кеширования вы получаете 95% кеша с небольшим процентом от стоимости. Конечно, догадки не всегда верны. Google 'прогноз ветви' для получения дополнительной информации.

Мне было интересно, почему программы не могут быть запущены в регистрах?

Регистры - это то, что на самом деле загружать и хранить данные и адреса. Думайте о них как о такси. Они могут доставлять вещи туда и обратно, то, что они доставляют, это данные и адреса вашей программы. Каждая часть вашей программы, которая «запускается», проходит через регистр.

Я предполагаю, что вы спрашиваете, почему вы не можете просто запустить полностью из регистров. Одна из причин - их так мало. Классические Intel x86 регистры считаются в байтах, но программы в мегабайтах, гигабайтах. Вы были бы достаточно богатым человеком, чтобы иметь чип, который мог бы запускать MS-Word из регистров.

Кроме того, как программа может загрузить себя в кеш?

Программа не. ОС запускает программу и использует чип модуля управления памятью для загрузки областей программы из обычного ОЗУ. Несмотря на то, что он делает это, MMU умный и помещает часть памяти также в кеш, с той идеей, что я только что использовал его, мне может понадобиться снова использовать его в ближайшее время.

Разве кэш не управляется процессором и работает автоматически без программного контроля?

Да, технически чип управления памятью, а не процессор. Раньше это был отдельный чип, но теперь он является частью блока ЦП, чтобы ускорить обмен данными.

2

Ваши программы сейчас по очереди используют регистры и кэши, вероятно, под руководством ядра вашей ОС.

Если все, что вы хотите, чтобы ваша программа, - это взять число и добавлять его к нему снова и снова, вы, вероятно, могли бы делать все это в регистрах. Регистры очень малы, в них хранится по одному числу, и у обычного процессора x86 их 16 (8 целых и 8 с плавающей запятой).

Точно так же, если у вас есть небольшая программа, которая помещается в кэш (и ОС не нужно периодически менять ее для выполнения других задач), она будет запускаться из кэша.

Большинство программ в наши дни намного больше, чем кеш. И вы просите, чтобы ваш компьютер работал одновременно над многими вещами, такими как обновление часов и индексирование диска, или рисование этой веб-страницы. Это означает, что много раз в секунду нужно переставлять следующую вещь для работы в кеш, чтобы она могла немного поработать над ней (это называется контекстом переключения).

Вы можете прочитать больше о кешах и регистрах.

1

Мне было интересно, почему программы не могут быть запущены в регистрах?

Большинство архитектур наборов команд (ISA) не поддерживают косвенное обращение в регистрах. Т.е. адреса регистров закодированы как константы в инструкции. (Это ограничение значительно упрощает конвейеризацию.)

Кэши также имеют то преимущество, что являются микроархитектурными функциями, то есть размер и другие характеристики видны только программному обеспечению с точки зрения производительности. Это позволяет различным реализациям ISA использовать разные размеры и др. без потери бинарной совместимости, например, для различных показателей производительности или целей применения или для корректировки изменений баланса между изменениями в технологии производства.

Кроме того, по мере роста количества видимых программных регистров преимущество управления компилятором имеет тенденцию к снижению по сравнению с затратами на сложность компилятора и время компиляции, особенно для программ со сложным потоком управления. Если используются несколько уровней регистров (как в Cray-1), чтобы разрешить быструю небольшую группу регистров, сложность выделения регистров компилятора увеличивается.

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

Кроме того, как программа может загрузить себя в кеш? Разве кэш не управляется процессором и работает автоматически без программного контроля?

Кэш-память контролируется ЦП, но программное обеспечение может явно предварительно выбирать элементы в кэш-памяти (и Itanium ISA поддерживает подсказки non-temporal-at-cache-level_N, чтобы помочь оборудованию лучше управлять размещением и заменой кэша). Обычные обращения к памяти будут загружать в кэш L1 запрошенный элемент и элементы в естественно выровненной строке кэша, и эта строка кэша будет обычно - за исключением недействительности когерентности, например, - присутствовать, пока ЦП не решит заменить ее другой другой строкой кэша данные, запрашиваемые другим - возможно, спекулятивным - доступом к памяти или аппаратной предварительной выборкой; поэтому программное обеспечение имеет некоторую возможность управлять содержимым кэша.

Программное обеспечение также может использовать знание конкретных характеристик системы кеша (алгоритмы с учетом кеша и структуры данных) или общих характеристик, общих для большинства систем кеша (алгоритмы без учета кеша), чтобы уменьшить частоту пропаданий кеша (когда необходимо извлечь элементы) из памяти или уровень кеша ближе к памяти).

1

Ваши программы запускаются из регистров! Они также работают из кеша. Все это помогает вашему компьютеру работать быстрее. Самый большой ограничивающий фактор - размер. Есть очень ограниченные регистры процессора. Типичная машина x86 имеет только 8 32-битных регистров, которые ЦПУ использует для хранения данных, с которыми работает. Как вы знаете, доступ к реестру очень быстрый, однако из-за ограниченного размера в регистрах может храниться небольшое количество данных.

Кеш похож на то, что он ограничен в размерах. Меньшие кеши (например, L1) сначала проверяются ЦП на наличие данных, если данные не обнаруживаются в этом кеше, затем они проверяют последующие кеши (L2, L3 и т.д.). Каждый уровень кеша становится все больше и медленнее. Если к концу проверки все кэши все еще не найдены, процессор должен извлечь данные из ОЗУ.

Программные приложения обычно не имеют явного контроля над тем, что помещается в регистры или в кэш, если только приложение не является драйвером низкого уровня или подобным приложением.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .