4

Карта памяти процесса, как представляются, раздроблены на сегменты (стек, куча, ПБС, данные и текстовых),сегментов памяти и физическая память

  • мне было интересно, эти сегменты всего лишь абстракция для Удобство процесса и физическое ОЗУ - это просто линейный массив адресов или физическое ОЗУ, также фрагментированное в эти сегменты ?
  • Также, если ОЗУ не фрагментирована и является просто линейным массивом, то как ОС обеспечивает процесс абстракции этих сегментов?
  • Также как изменилось бы программирование, если бы карта памяти для процесса появилась как просто линейный массив и не была разделена на сегменты (с MMU, переводящим виртуальные адреса в физические)?
+0

ad 3) из перспективы памяти программиста C (++) ** появляется ** как линейный массив, управляемый менеджером памяти, поэтому эта часть не имеет для меня смысла. Весь этот вопрос очень широк, что очень мало исследований. Изучите похожие вопросы переполнения стека, а затем попытайтесь сузить этот. http://stackoverflow.com/search?q=%5Boperating-system%5D+paging+segmentation+answers%3A1 .. – xmojmr

+0

@xmojmr да, он выглядит как линейный массив, но он разделен на сегменты. – BsD

+0

Почему вопрос проголосовали за закрытие? Я не думаю, что этот предмет слишком широк. Но определенно не вопрос C. Я думаю, вы должны удалить этот тег. – m0skit0

ответ

5

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

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

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

+0

Можете ли вы предоставить ссылку на доказательства? – xmojmr

+0

Доказательства? Что это, уголовное расследование или что-то еще? :) – dtech

+0

@xmojmr Доказательства? Вы имеете в виду ссылку? – m0skit0

1

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

Это на самом деле сильно зависит от архитектуры. Некоторые из них будут иметь аппаратные средства (например, дескрипторные регистры для x86), чтобы разделить ОЗУ на сегменты. Другие просто хранят эту информацию в программном обеспечении (информация ядра ОС для этого процесса). Кроме того, некоторые данные сегментов совершенно неактуальны при исполнении, они используются просто для загрузки кода/данных (например, сегментов перемещения).

Кроме того, если RAM не fragmanted и просто линейный массив, то как ОС обеспечивает процесс абстракции этих сегментов?

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

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

Программирование не повлияет. Когда вы программируете на C, вы не определяете ни один из этих сегментов, а код также не ссылается на эти сегменты. Эти сегменты предназначены для хранения упорядоченного макета и даже не должны быть одинаковыми в ОС.

2

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

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

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

Без перевода адреса, размещение сегментов неизбежно будет менее произвольным. К счастью, большинство программ не заботятся о конкретном адресе, где размещаются сегменты. (Единая адресное пространство операционка

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

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

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


Традиционным расположение этих сегментов (с вниз растущего стека) в плоском виртуального адресного пространства для Unix-подобных операционных систем помещает текст в наименьший адрес, rodata сразу же выше, что, инициализируются данные сразу же выше, нулевые инициализированные данные (bss) сразу над этим, куча растет вверх от вершины bss и стек растет вниз от вершины части приложения виртуального адресного пространства.

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

2

Карта памяти для процесса появляется раздроблена на сегменты (стек, куча, ПБС, данные и текст)

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

Мне было интересно, являются ли эти сегменты просто абстракцией для процессов для удобства, а физическое ОЗУ - это просто линейный массив адресов или физическая RAM также фрагментирована в эти сегменты?

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

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

Также, если ОЗУ не является фрагментированным и является только линейным массивом, то как ОС обеспечивает процесс абстракции этих сегментов?

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

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

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

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

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

Смежные вопросы