0

Изучая языки, такие как java или C, мы узнаем о распределении статической и динамической памяти. Определения, приведенные для них несколько, как показано нижеРаспределение памяти. Как я могу связать уровень программы и физический уровень?

Static memory allocation - memory is allocated in stack during compile time. 
Dynamic memory allocation - memory is allocated in heap during run time. 

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

Просьба дать представление о том, как я могу сопоставить память, выделенную на физическом уровне и на уровне программы?

ответ

0

Я думаю, что здесь важно разделить две концепции ... Это распределение памяти и доступ к памяти.

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

Доступ к памяти, однако, заключается в том, где физический аспект архитектуры и кеши вступает в игру. Предположим, согласно вашему сценарию, программа имеет массив размером 10 миллионов. Физическая компьютерная архитектура не знает, что существует массив размером 10 миллионов. Все, что он знает, это то, что для текущего текущего потока имеется sizeof (массив из 10 миллионов) байтов. Кэш L1 и L2 не работают на уровне языка программирования, и поэтому они не знают о массиве, типе данных или какой-либо подобной вещи. То, что он знает, это то, что часть памяти, к которой обращается программа. Архитектура будет кэшировать эти обращения к памяти и вставлять данные в и из кэша в соответствии с доступом к памяти, а не в соответствии с тем, как она распределена. Поэтому для архитектуры нет разницы между массивом из 10 миллионов элементов и сборкой объектов и примитивов любого типа, занимающих одно и то же пространство. Он просто видит все как байты и обращается.