Иерархия памяти: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
продолжаем
Строка 26:
# Регистры микропроцессора, организованные в [[регистровый файл]] — наиболее быстрый доступ (порядка 1 такта), но размером лишь в несколько сотен или, редко, тысяч байт.
# [[Кэш процессора]] 1го уровня (L1) — время доступа порядка нескольких тактов, размером в десятки килобайт
# Кэш процессора 2го уровня (L2) — большее время доступа (от 2 до 10 раз медленнее L1), около полумегабайта или более
# Кэш процессора 3го уровня (L3) — время доступа около сотни тактов, размером в несколько мегабайт (в массовых процессорах используется с недавнего времени)
# ОЗУ системы — время доступа от сотен до, возможно, тысячи тактов, но огромные размеры в несколько гигабайт, вплоть до десятков. Время доступа к ОЗУ может варьироваться для разных его частей в случае комплексов класса [[NUMA]] (с неоднородным доступом в память).
# Дисковое хранилище — многие миллионы тактов, если данные не были закэшированны или забуферизованны заранее, размеры до нескольких терабайт
# Третичная память — задержки до нескольких секунд или минут, но практически неограниченные объемы (ленточные библиотеки).
 
Современные языки программирования обычно предполагают, что память делится на два уровня, оперативную память и дисковые накопители, хотя в ассемблерных языках и ассемблерно-совместимых (типа Си или Си--), существует возможность непосредственной работы с регистрами. Получение преимуществ от иерархии памяти требует совместных действий от программиста, аппаратуры и компиляторов (а также нижележащая поддержка в операционной системе):
* Программисты отвечают за программирование пересылок данных между дисками и ОЗУ при помощи файлового ввода-вывода.
* Аппаратное обеспечение отвечает за прозрачное использование кэшей для работой с памятью.
* Оптимизирующие компиляторы отвечают за генерацию такого кода, который при исполнении приводит к эффективному использованию регистров и кэшей.
 
Многие программисты предполагают, что оперативная память является одним уровнем иерархии. Этот подход работает до тех пор, какпока приложение не столкнется с падением производительности из-за насыщения подсистемы памяти ([[memory wall]]). При перепроектировании кода нужно будет учесть верхние уровни иерархии памяти.
 
== Примечания ==