7

Я пытаюсь понять модель плоской памяти и модель сегментированной памяти.

Модель плоской памяти и сегментированной памяти определяется архитектурой процессора или ОС, или и тем, и другим?

Или они не определяются ни архитектурой процессора, ни ОС, но вместо этого они доступны для программистов на любом компьютере с любой архитектурой процессора и установленной ОС?

Если это последнее, какие виды программирования должны учитывать модель плоской памяти и модель сегментированной памяти? Ассемблер, C и / или другие языки программирования высокого уровня?

Вот некоторые цитаты из Википедии, которые меня смущают.

От http://en.wikipedia.org/wiki/Address_space#Memory_models:

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

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

С http://en.wikipedia.org/wiki/Flat_memory_model#Comparison:

Плоская модель памяти

  • Не подходит для общих вычислительных или многозадачных операционных систем, если не дополнено дополнительным аппаратным / программным обеспечением для управления памятью; но это почти всегда имеет место в современных процессорах CISC, которые реализуют передовые технологии управления и защиты памяти по сравнению с плоской моделью памяти. Например, в Linux используется модель плоской памяти. X86_memory_segmentation # Practices.

Сегментированная модель памяти

  • Реализован в оригинальном Intel 8086, 8088, 80186, 80286 и поддерживается 80386 и всеми последующими машинами x86 вплоть до современных процессоров Pentium и Core 2. Эта модель памяти сохранилась с тех пор в машинах x86, которые теперь обеспечивают многорежимную работу и редко работают в совместимом сегментированном режиме.

4 ответа4

7

Используемая модель памяти определяется двумя вещами:

  1. Используемый процессор и какие режимы он поддерживает
  2. Операционная система и что она использует

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

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

Исторически так было не всегда.

В Windows 3.1x, MacOS до v9 и Novell NetWare отсутствовали некоторые средства защиты памяти, которые мы считаем само собой разумеющимися в Linux/Windows/OSX. В частности, у NetWare было одно большое пространство памяти, которое она предоставляла всему исполняемому коду, поэтому одна ошибка, которая пыталась получить доступ к памяти, которой она фактически не была назначена, могла фактически получить эту память и чаще всего приводила к сбою всей системы. По этой причине программисты, программирующие для NetWare, должны были очень осторожно относиться к управлению памятью и в той степени, в которой программистам Linux/windows/OSX не нужно беспокоиться.

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

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

5

"Модель памяти" является понятием как низкого, так и (относительно) высокого уровня.

В былые времена происходила небольшая "война" между процессорами с сегментированной моделью памяти и процессорами с "постраничной" или "отображенной" моделью памяти. Машины серии Burroughs B5000 и Plessey 250 использовали модель сегментированной памяти с "возможностями" (или "дескрипторами"). То есть физическое хранилище управлялось не как концептуальные страницы фиксированного размера, а как сегменты переменной длины, причем каждый сегмент соответствовал некоторому логическому объекту (например, процедуре или объекту). Для адресации между сегментами использовались "регистры возможностей", которые могли быть загружены только защищенным способом и которые содержали физический адрес сегмента, длину сегмента и полномочия (например, чтение / запись / выполнение), которые выполняются Программа была дана для ссылки на сегмент.

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

Оригинальный ПК был основан на процессоре 8086, который был разработан для поддержки сегментированной архитектуры бедного человека. В IIRC было четыре сегментированных регистра, которые можно было выбрать для добавления к 16-битному значению общего регистра для получения 20-битного адреса. Теория заключалась в том, что эти регистры будут управляться программно, в некоторой степени аналогично тому, как системы Берроуза и Плесси управляют ими с немного большей аппаратной поддержкой. Но прежде, чем могло быть создано хорошее программное обеспечение для использования этой функции, DOS был помещен на 8086, и поэтому эта функция никогда не использовалась эффективно.

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

"Страничная" модель

"Страничная" модель предполагает, что адресное пространство разделено на "страницы" определенного размера (хотя в некоторых случаях поддерживаются несколько разных размеров страниц). Обычно размер страницы составляет от 256 до 64 Кбайт (всегда степень 2). Также предполагается, что аппаратное обеспечение содержит некоторую поддержку преобразования адресов, так что "логические" адреса (адреса в "адресном пространстве" программы) могут быть сопоставлены с "физическими" адресами (адресами в ОЗУ).

Постраничная модель может быть реализована по двум основным причинам:

  1. Чтобы разрешить нескольким различным потокам / процессам иметь отдельные адресные пространства, каждый из которых начинается с "нуля" (или некоторого другого стандартного адреса) и не требует от ОС предварительного выделения всего возможного адресного пространства для потока / процесса как одного смежного блока ,
  2. Чтобы включить "виртуальную память", позволяя отдельным страницам в логическом адресном пространстве быть "выгруженными" на диск, чтобы впоследствии перезагрузить их, если / когда программа попытается обратиться к ним.

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

"Плоская" модель

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

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

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

Ранний Unix (среди прочего) обрабатывал задачу мультипрограммирования, "обменивая" программы на входы и выходы: программа (загруженная по нулевому адресу) будет работать до тех пор, пока не будет "заблокирована" для ввода / вывода, затем она будет "заменена" (в целиком, включая весь код и данные) на диск, и другая программа "поменялась местами".

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

3

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

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

Есть странные времена, когда это подходит. Насколько я понимаю, 32-разрядные процессоры x86 (по крайней мере, за последнее десятилетие) могут обращаться к более чем 4 ГБ памяти с использованием сегментов (режим PAE), это поддерживают любые 32-разрядные ОС, но при этом максимальный объем памяти - один. Процесс может использовать только 4 ГБ, потому что большинство программ ожидает модель с плоской памятью (и я сомневаюсь, что многие современные ОС позволят им ожидать чего-то еще).

Чтобы уточнить цитаты:

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

  2. Без дополнительных функций (например, таких, которые не позволяют одной программе использовать память другой программы), модель с плоской памятью не подходит для современных операционных систем, но все современные процессоры для настольных ПК / серверов имеют эти функции десятилетиями.

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

Надеюсь это поможет.

1

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

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