Найти тему
Разумный мир

Как устроена ЭВМ? Организации памяти и управление памятью

Оглавление

Все знают, что в ЭВМ есть память. Но не многие знают, как эта память устроена и как управляется. ОЗУ, ПЗУ, логическая, физическая, виртуальная, страничная. Это лишь некоторые термины и понятия, которые слышали многие. Давайте попробуем во всем это разобраться.

Статьи серии "Как устроена ЭВМ" являются скорее концептуальными, более описательными. И ориентированны на тех, кто еще только учится, кто пытается разобраться, кому интересно. В таких статьях я стараюсь избегать излишней детализации и погружения в частности и нюансы. Они рассчитаны на более широкую аудиторию читателей. Статьи не требуют большого объема специальных знаний, но могут быть не самыми легкими для чтения.

В этом их основное отличие от статей серии "Элементы ЭВМ", в которых, наоборот, большее внимание уделяется технической, даже схемотехнической, стороне вопроса. И здесь уже читателю нужны более глубокие знания.

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

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

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

Память внутренняя и внешняя

Деление памяти машины на внутреннюю и внешнюю появилось давно, хоть и не в первых ЭВМ. Сегодня такое деление не всем кажется очевидным. Например, устанавливаемую в смартфон карту памяти некоторые считают внутренней памятью, что неверно.

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

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

Подключение внутренней и внешней памяти к процессору. Иллюстрация моя
Подключение внутренней и внешней памяти к процессору. Иллюстрация моя

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

Да, дисковые накопители сильно отличаются от того же принтера. Да, в ЕС ЭВМ было деление на мультиплексные и селекторные каналы. Но процессор взаимодействует с внешней памятью опосредованно.

Изменяя состав внешних устройств мы получаем не разные ЭВМ, а разные комплектации одной и той же машины. Мы можем подключить другой тип дисковых накопителей, можем твердотельные накопители. Это не отразится на работоспособности машины.

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

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

Память постоянная и оперативная

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

Запись в ПЗУ может выполняться или однократно, как в самой машине, так и на внешнем программаторе, или вообще аппаратно, например, проводниками пропущенными через ферритовые кольца. Или при производстве ПЗУ. В некоторых случаях допускается перезапись содержимого ПЗУ, но это уже отдельная операция, которая может быть выполнена ограниченное число раз. Такие ПЗУ часто обозначают как ППЗУ, где первая буква П обозначает перезаписываемое.

Международные термины ROM, Read Only Memory, и RAM, Random Access Memory. Однако, и русскоязычные, и международные, термины не совсем точно отображают, что и ПЗУ, и ОЗУ, являются устройствами с произвольным доступом.

Конечно, оперативное и random (случайный, произвольный) позволяют предполагать, что возможен именно произвольный доступ. В любой момент времени мы можем получить доступ к любой ячейке памяти. Но для ПЗУ это совсем не очевидно из названия.

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

Да, существуют и специальные случаи. Например, для динамических последовательных процессоров. Такие процессоры использовались, например, в программируемых калькуляторах (серия микросхем К145). Такие случаи мы сегодня не рассматриваем.

Для тех, кому интересны примеры внутреннего устройства памяти, которые мы сегодня не рассматриваем, могут почитать статью

Влияние архитектуры процессора и адресные пространства

Подавляющее большинство ПК и ноутбуков имеют процессоры основанные на архитектуре фон Неймана. Другой популярной архитектурой является Гарвардская. Но что такое архитектура процессора и ЭВМ?

Конечно, архитектура ЭВМ не имеет ничего общего с архитектурой в привычном понимании этого слова. Архитектура это совокупность правил, принципов, подходов, методов, особенностей, используемых для проектирования и построения чего-либо. И архитектура ЭВМ это совокупность принципов построения и работы машины.

Мы сегодня не будет углубляться в обсуждение архитектуры ЭВМ. Это отдельная и очень большая тема. Нас сегодня будет интересовать, и то лишь частично, только дополнительное деление внутренней памяти по функциональному признаку.

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

В машинах на Гарвардской архитектуре программа и данные располагаются отдельно. Невозможно изменить программу, как данные, или прочитать ее. Невозможно выполнить данные. Эта архитектура, возможно, менее удобна. Но более устойчива к ошибкам.

Тем не менее, реальные машины строятся не на чистых архитектурах. В машинах на архитектуре фон Неймана часто существует возможность указать, что некоторая область памяти является областью памяти программ или областью памяти данных. И запретить выполнение области данных. А в машинах Гарвардской архитектуры все таки можно изменять память программ.

Вот теперь мы можем разобраться с понятием адресного пространства. Упрощенно можно сказать, что совокупность адресов, по функциональному признаку, всех доступных ячеек памяти называется адресным пространством.

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

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

То есть, адресное пространство это дополнительный признак адреса памяти. И этот признак может быть представлен как разными машинными командами или способами адресации, так и дополнительными разрядами адреса.

Ячейка памяти, массив ячеек, адресация в массиве

Вот теперь мы можем начать рассматривать, как формируется адрес физической ячейки памяти. Именно физической ячейки, без дополнительных логических и семантических уровней.

Ячейка памяти может хранить ровно один бит информации. Такая ячейка является базовым элементом любого типа памяти, любой организации. И нам, если помните, не важно, как именно хранится информация в такой ячейке.

Ячейка памяти позволяет записывать и считывать информацию, в общем случае. Можно условно изобразить физическую ячейку памяти примерно так

Элементарная ячейка памяти. Иллюстрация моя
Элементарная ячейка памяти. Иллюстрация моя

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

Сигнал "данные" при выполнении чтения является исходящим, он соответствует состоянию хранящегося в ячейке бита информации. При выполнении записи сигнал будет входящим. И будет определять, какое состояние будет иметь хранящийся в ячейке бит информации. Другими словами, этот сигнал является двунаправленным.

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

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

Дешифратор адреса получает на входе адрес, по сути, номер, ячейки. А на выходе формирует набор сигналов выбора. Мы сегодня на занимаемся электроникой, поэтому внутренне устройство дешифратора рассматривать не будем. А вот его работу кратко рассмотрим.

Пусть у нас есть 16 ячеек памяти. Для работы с ними требуется 16 сигналов выбора. Обозначим эти сигналы от SEL0 до SEL15. Для представления двоичного числа в диапазоне от 0 до 15 достаточно 4 разрядов. Обозначим их от ADR0 до ADR3

Работа дешифратора адреса ячейки. Иллюстрация моя
Работа дешифратора адреса ячейки. Иллюстрация моя

На иллюстрации, в качестве примера, показано преобразование одного из возможных адресов в сигнал выбора. Но такое прямое преобразование адреса не является оптимальным. Можно уменьшить число необходимых сигналов выбора ячеек в два раза.

Давайте сделаем не очевидный шаг. Увеличим число входных сигналов выбора в ячейке памяти до двух. И это увеличение, позволит нам сократить число сигналов на выходе дешифратора. Достаточно собрать ячейки памяти в двумерную матрицу/массив

Объединение элементарных ячеек памяти в матрицу/массив ячеек. Иллюстрация моя
Объединение элементарных ячеек памяти в матрицу/массив ячеек. Иллюстрация моя

Для массива ячеек сигналы данных не показаны, что бы не загромождать иллюстрацию. Но эти сигналы, для всех ячеек, соединены между собой. То есть, весь массив ячеек памяти имеет единственный сигнал "данные".

Сигналы ROW (строка) и COL (столбец) позволяют адресовать ячейку памяти. Ячейка памяти считается выбранной тогда, когда оба сигнала активны. То есть, условие выбора ячейки можно записать так

ROW и COL

Изначально, такая организация ячеек в матрицу использовалась для ферритовой памяти. Но она отлично подошла и для появившейся позже динамической памяти. Такой способ объединения ячеек необязателен, но наиболее распространен. На иллюстрации показан массив 4х4 однобитных ячеек. То есть, всего 16 бит.

Теперь нам для доступа к любой ячейке требуется 4 сигнала выбора строки, ROW0-ROW3, и 4 сигнала выбора столбца, COL0-COL3. Всего 8 сигналов, вместо 16 ранее. Это не только меньше, но и гораздо удобнее для изготовления реальных устройств памяти, например, микросхем.

Теперь нам потребуется не один дешифратор, а два. Более того, у нас теперь адрес ячейки становится структурированным

Адресация ячеек памяти в массиве ячеек и структура адреса. Иллюстрация моя
Адресация ячеек памяти в массиве ячеек и структура адреса. Иллюстрация моя

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

С точки зрения программиста такое структурирование адреса совершенно не значимо. Более того, на него просто нельзя полагаться, так как внутренняя организация разных устройств памяти может быть разной, даже в одной машине. Но оно очень важно с точки зрения организации и адресации внутри блока памяти. И именно с этой точки зрения мы сегодня и рассматриваем память. Не с точки зрения программиста, а с точки зрения машины.

Модуль памяти, адресация в модуле памяти

Однако, такой массив ячеек будет неудобен для хранения не бит, а более крупных агрегатов данных, например, байт. Например, для байта потребуется 8 раз выполнять операцию чтения/записи. Проблему можно решить собрав отдельные массивы ячеек в массив

Объединение однобитных массивов ячеек памяти в модуль памяти. Иллюстрация моя
Объединение однобитных массивов ячеек памяти в модуль памяти. Иллюстрация моя

Таким образом, мы получаем модуль памяти, который хранит многобитные данные. Теперь мы не объединяем сигналы данных разных массивов. Каждый массив представляет отдельный разряд, например, байта. Но одноименные сигналы адресов массивов мы как раз объединяем.

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

Обратите внимание, что такое наращивание разрядности хранимых данных никак не отразилось на адресации. Это естественно, ведь разрядность адреса осталась такой же, как и в массивах ячеек. Но теперь мы можем прочитать/записать сразу несколько бит, например, байт, за одно обращение к памяти.

Блок памяти, устройство памяти. Физический адрес

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

Проблема та же самая и решение такое же. Мы можем собрать несколько модулей в массив модулей - блок памяти. Структура адреса снова усложнится, но и объем памяти можно значительно увеличить.

Масштабирование можно продолжать объединив несколько блоков памяти в массив блоков - устройство памяти. А машина может иметь несколько устройств памяти.

Во времена, когда машины были большими, устройство памяти занимало целый шкаф - стойку. Внутри стойко могло размещаться несколько рам или корзин. В каждой раме/корзине могло устанавливаться несколько плат/матриц памяти.

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

Теперь структура адреса ячейки памяти, разрядность данных не важна, выглядит примерно так

Структура адреса физической ячейки памяти, физического адреса памяти. Иллюстрация моя
Структура адреса физической ячейки памяти, физического адреса памяти. Иллюстрация моя

Это адрес физической ячейки памяти с точки зрения самой памяти. Или группы ячеек образующих байт, слово, и так далее. Одновременно, если не принимать во внимание внутреннюю структуру, это физический адрес памяти. Младший значащий бит адреса (LSB) располагается справа на иллюстрации, это нулевой разряд адреса. Старший значащий бит (MSB) адреса располагается слева, это старший разряд адреса.

Такой физический адрес позволяет однозначно и непрерывно адресовать любую последовательность доступных ячеек памяти. То есть, и последовательное увеличение/уменьшение адреса памяти, и сложение/вычитание адреса памяти и константы, одинаково корректно работают. Причем обеспечивается однозначность адресации.

Работа с памятью объемом превышающим возможности разрядности адреса памяти машины

Сегодня, когда привычными и распространенными являются 64-разрядные машины, ограничения на объем адресуемой памяти кажутся несуществующими. Однако, памяти много не бывает. Когда то ведь и 640 кБ казалось всем хватит. А в 16 битных машинах доступный напрямую объем памяти был куда меньше.

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

У многих читателей может возникнуть вопрос, что мешает просто увеличить разрядность адреса в процессоре? Если разрядность адреса превышает разрядность процессора, то адрес должен располагаться в группе регистров процессора. Одного регистра уже недостаточно.

Да, это возможно. Например, в 8-разрядных процессорах адрес памяти располагался в регистровой паре. Точнее, регистр адреса был доступен для программиста как пара 8 разрядных регистров. Но это создает неудобства для программиста, требуется соблюдать специальные правила работы с адресами.

Для 8-разрядных процессоров один 8-разрядный регистр адреса позволяет работать непосредственно только с памятью объемом 256 байт. Поэтому регистровая пара была вполне естественным решением. Но 16-разрядные процессоры могут работать уже с 64 кБ памяти. А значит, можно выделить часть разрядов адреса для управления переключаемыми блоками памяти. И это совсем не те блоки, которые мы рассматривали ранее.

Да, для 8-разрядных машин существовали, и существуют, различные схемы адресации памяти. Например, прямое задание полного адреса памяти в командах передачи управление. Но мы сегодня рассматриваем обобщенную абстрактную машину.

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

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

Давайте добавим в машину дополнительное устройство - диспетчер памяти

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

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

При этом, что очень важно, прикладная программа никак не зависит от наличия диспетчера памяти и особенностей его работы. Адресное пространство прикладной программы (помните, мы кратко рассматривали понятие адресного пространства?) по прежнему ограничено разрядностью адреса процессора. Как и адресное пространство операционной системы.

Но операционная система (ОС) имеет возможность влиять на работу диспетчера памяти, а прикладная программа нет. Теперь адрес, в адресном пространстве программы, уже будет не физическим, а логическим. И этот логический адрес будет состоять из номера блока и физического адреса внутри блока памяти

Преобразование логического адреса выполняемое диспетчером памяти. Иллюстрация моя
Преобразование логического адреса выполняемое диспетчером памяти. Иллюстрация моя

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

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

Давайте, для примера, рассмотрим 16-разрядную машину. Выделим два старших разряда логического адреса под номер блока. Оставшиеся 14 разрядов позволяют адресовать 16 кБ памяти. То есть, объем одного физического блока памяти будет равняться 16 кБ. Общий объем адресуемой задачей памяти будет, как и без диспетчера памяти, равняться 64 кБ. Но он будет состоять из 4 блоков по 16 кБ.

Но мы можем установить в машину, например, 16 блоков памяти по 16 кБ. Физически доступный объем памяти будет равняться 256 кБ. Однако, ни одна задача не может его напрямую полностью использовать. Но ОС может размещать в памяти несколько задач. И мы получаем многозадачную ОС

Кроме того, прикладная программа может выделить один из своих логических блоков в качестве "окна" для доступа к переключаемым блокам физической памяти. Переключение и выделение дополнительных физических блоков памяти осуществляется через запросы к ОС.

Пример отображения логического адресного пространства задачи на физическую память и использования переключаемого окна доступа к дополнительной памяти. Иллюстрация моя
Пример отображения логического адресного пространства задачи на физическую память и использования переключаемого окна доступа к дополнительной памяти. Иллюстрация моя

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

  • Логическое адресное пространство задачи оказалось независимым от физических адресов памяти. То есть, задачу стало возможным загружать в разные места физической памяти без необходимости изменять саму задачу. И это очень полезно для многозадачных систем.
  • Теперь ОС может остановить задачу и переместить ее в памяти. Сама прикладная задача этого даже не заметит.
  • Разные логические блоки задачи могут адресовать один и тот же блок физической памяти. Это позволяет прозрачно работать с содержимым физического блока, например, и как с данными, и как с программным кодом.
  • Один и тот же физический блок может отображаться на различные задачи. Это позволяет задачам в многозадачной ОС обмениваться информацией.

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

Страничная организация памяти

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

Однако, привязка к размеру физического блока памяти снижает гибкость и возможности такого преобразования. Между тем, введя небольшие изменения можно получить очень удобное и функциональное управление памятью. Даже если ее физический объем меньше максимально возможного.

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

Что бы повысить функциональность можно сделать размер логического блока изменяемым. Однако, как мы увидим чуть позже имеет смысл делать размер всех логических блоков одинаковым, но изменяемым в целом для задачи.

Такие логические блоки и называются страницами. Размер страницы не связан ни с физическими блоками памяти, ни с их размерами. И, в идеальном случае, все страницы имеют одинаковый размер. Но это сразу приводит к проблеме. Ведь теперь диспетчер памяти не может просто управлять сигналами выбора блоков памяти.

Это решается размещением в таблице преобразования адресов не номеров физических блоков, а адресов начала страниц. И преобразование адресов диспетчером памяти становится примерно таким

Пример страничного преобразования адресов. Иллюстрация моя
Пример страничного преобразования адресов. Иллюстрация моя

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

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

Работает страничная адресация так же, как и ранее рассмотренный начальный ее вариант. И обеспечивает те же самые преимущества. Но, поскольку размер страниц меньше, ОС может более гибко размещать в памяти страницы прикладных задач, что повышает эффективность использования памяти.

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

Реальная система страничного преобразования адресов может быть весьма сложной. Но в ее основе лежит вот такой, довольно простой и давно разработанный, способ преобразования.

И страничная адресация по прежнему является прозрачной для прикладной программы, обеспечивает однозначное и непрерывное логическое адресное пространство.

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

Виртуальная память

Большая разрядность адреса в современных процессорах не означает, что в машине действительно установлена память максимального объема. И, рано или поздно, памяти может не хватить. Конечно, ОС может просто выдать сообщение об ошибке и завершить задачу. Но почему бы не попытаться что то сделать для решения проблемы?

"Что то сделать" и пытается виртуальная память. И реализуется виртуальная память на базе страничной адресации. Мы сегодня коснемся виртуальной памяти очень кратко, так как это отдельная большая тема. Но участие страничной адресации в работе виртуальной памяти кратко рассмотрим.

Давайте представим, что в таблице преобразования адресов может находиться дополнительный признак, который отображает доступность страницы в физической памяти. Назовем это "признак присутствия". Для каждой страницы, которая отображается на физическую память, этот признак установлен. Если страница в физической памяти отсутствует, отображения нет, то признак сброшен.

Пример страничного преобразования адресов с двумя отсутствующими в памяти страницами. Иллюстрация моя
Пример страничного преобразования адресов с двумя отсутствующими в памяти страницами. Иллюстрация моя

Виртуальная память реализуется при аппаратной поддержке со стороны страничной адресации и программной поддержке со стороны ОС.

ОС отслеживает все страницы в физической памяти. Если памяти не хватает, то ОС может освободить несколько страниц в физической памяти. Но то нельзя сделать просто так. Если содержимое страницы не изменяемое, например, код программы, то страница может быть без проблем использована для другой задачи. Если же страница изменялась, например, страница с данными, то ее содержимое сохраняется в специальном файле (или разделе диска) подкачки.

Англоязычное название файла подкачки swap (своп), не сомневаюсь, слышали почти все. Одинаковый размер страниц облегчает управление файлом подкачки. После сохранения страницы ОС может использовать ее для другой задачи. В любом случае, страница помечается в памяти сбросом признакам присутствия.

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

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

Для прикладных задач работа виртуальной памяти полностью прозрачна. Она влияет на время выполнения задачи, но не требует учета при разработке прикладной задачи.

Виртуальная память не является панацеей. Она позволяет несколько снизить проблему нехватки памяти, но ценой катастрофического падения производительности машины. Даже самый быстрый дисковый накопитель работает медленнее ОЗУ. Виртуальная память не плохо справляется при наличии в системе загруженных в память задач, которые часто находятся в состоянии ожидания, а не работы.

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

Заключение

На сегодня рассказ закончен. Мы очень кратко и очень упрощенно рассмотрели, как устроена и как управляется память ЭВМ с точки зрения адресации. Мы не погружались ни в схемотехнические аспекты, ни в программные. Лишь слегка коснулись, скорее, концептуальной части.

Лежащие в основе управления адресацией памяти принципы достаточно просты. Но их практическая реализация может быть очень сложной. Все очень сильно зависит от конкретного процессора, конкретной машины, конкретной ОС.

Если вы проявите интерес к теме, можно рассмотреть некоторые вопросы более подробно. Но я знаю, что сложные технические статьи вряд ли будут интересны многим. В качестве примера того, как управление памятью реализовано в Intel x86, могу дать ссылку не мою очень старую статью

Адресация физической памяти в процессорах Intel 80х86 и совместимых

До новых встреч!