Иерархия памяти компьютера
Кратко об иерархии памяти компьютера было рассказано в пункте 1.1. Физическая память компьютера имеет иерархическую структуру. Но логическая память организована иным способом. Об этом и пойдет речь в данном пункте. Современные программы имеют очень длинный код и оперируют большими потоками данных. Все это должно хранится в ЭВМ. Размещение происходит в памяти. Однако при выполнении, данные и исполняемый код (возможно частично) должны находится в оперативной памяти. Однако там же (в оперативной памяти) должны находится компоненты операционной системы. Задачей распределения памяти между различными процессорами выполняет менеджер памяти. Память можно разделить на внутреннюю и внешнюю. Внутренняя – это упорядоченный массив однобайтовых ячеек, обладающих уникальным адресом. Как было сказано в пункте 1.1, эта память энергозависима. Внешняя – энергонезависима, обладает намного большим объемом. Между внутренней и внешней памятью можно поместить промежуточную память (см. рис. 1.2). Рис. 1.2 Иерархия памяти [2] При поиске необходимых данных процессор начинает искать на самом верхнем уровне. Если информации там нет, то он (процессор) продолжает поиск на более низком уровне. Так продолжается до тех пор, пока необходимые данные не будут найдены. Затем, найденная информация переносится на более быстрые уровни. Очевидно, что через некоторое время организуется некоторая система, в которой по мере увеличения времени доступа к уровню памяти, уменьшается частота обращений к нему. Оказывается, что реальные программы в некоторый временной промежуток работают с малым набором адресов. Это называют свойством локальности (локализация обращений). Подобный принцип справедлив не только в среде ЭВМ. Как правило, соседние во времени и пространстве объекты характеризуются схожими свойствами. Так и человек, решая задачу оперирует с ограниченным набором данных, остальное хранится во внешней памяти (например, в книгах). Программы работают по тому же принципу, какой-то фрагмент кода обрабатывает ограниченный набор данных. Поэтому, если он будет помещен в быструю память, то время доступа к нему существенно сократится. Именно это обусловливает использование иерархической схемы. Кэш процессора, как правило, реализуется аппаратно. Поэтому менеджер памяти ОС распределяет информацию в основном во внутренней и внешней памяти. Иногда потоки между внутренней и внешней памятью регулирует сам разработчик программы, но это требует высокого уровня подготовки. Потому подобные операции передают ОС. Под физическим адресным пространством понимают набор физических адресов (адреса основной памяти, указывающие на действительное расположение данных), с которыми работает программа. Надо понимать, что программа состоящая из модулей, следующих друг за другом совсем не должна хранится в памяти именно таким образом (в общем случае вся программа может хранится в разных частях жесткого диска). Для того чтобы вся программа и данные образовывали линейное пространство адресов (располагались друг за другом) применяют сегментацию. Сегмент – область памяти, в которой поддерживается линейное пространство адресов. Т.е. сейчас память компьютера представляет собой двумерную, а не линейную структуру. Адрес имеет следующие компоненты – номер сегмента, смещение внутри сегмента. Оказалось, что удобнее размещать различные компоненты программы (данные, код и т.д.) в различных сегментах. На современном этапе развития можно контролировать сегменты (задать права доступа к ним и возможные операции). Пример расположения сегментов в памяти приведен на рис. 1.3. Рис. 1.3. Расположение сегментов процессов в памяти компьютера [2] Практически все современные ОС поддерживают сегментную организацию памяти, а в ряде архитектур, это заложено на аппаратном уровне. Таким образом, процесс обращается к адресу, который отличается от реального адреса в оперативной памяти. Адреса, используемые программой, могут быть представлены различными способами. В исходных текстах адреса чаще всего символические. Связь этих символических адресов с перемещаемыми адресами осуществляет компилятор. Такой адрес (сгенерированный программой) называют логическим. Совокупность логических адресов (иногда их называют виртуальными адресами) образует логическое (виртуальное) адресное пространство. Как правило максимальный размер логического адресного пространства определяется разрядностью процессора (232, 264 и т.д.), что значительно превышает реальное физическое адресное пространство. Т.о. ОС и процессор должны отображать ссылки в коде программы в реальные физические адреса. Подобное отображение называют трансляцией (привязкой). Схема связывания адресов приведена на рис. 1.4. Рис. 1.4. Формирование логического адреса и связывание логического адреса с физическим [2] Связать физический и логический адрес можно на следующих этапах. Компиляция. Если на этапе компиляции точно известно место размещения процесса в памяти. В случае изменения стартового адреса программы, необходимо перекомпилировать код. Загрузка. Когда неизвестно размещение программы на стадии компиляции, компилятор должен генерировать перемещаемый код. Тогда связывание произойдет на этапе загрузки. При изменении начального адреса, перезагружают код с учетом этого изменения. Выполнение. В случае, когда есть возможность перемещать процессы прямо во время выполнения из одной области памяти в другую, связывать адреса необходимо на этапе выполнения. Для контроля подобной смены служат регистры перемещения. В современных ОС трансляция осуществляется на этапе выполнения.
|