Эти сегменты в значительной степени удобны для загрузчика программ и операционной системы (хотя они также обеспечивают основу для крупнозернистой защиты, разрешение на выполнение может быть ограничено текстом и запрещается запись родатами).
физической памяти адресное пространство может быть фрагментирован, но не для таких сегментов приложений. Например, в системе NUMA для аппаратного обеспечения может быть удобно использовать определенные биты, чтобы указать, какой узел принадлежит данному физическому адресу.
Для системы, использующей преобразование адресов, ОС может несколько условно разместить сегменты в физической памяти. (С сегментированным переводом может быть проблемой внешняя фрагментация, а смежный диапазон адресов физической памяти может быть недоступен, что требует дорогостоящего перемещения сегментов памяти. С помощью выгружаемого перевода внешний фрагментация невозможна. Сегментированный перевод имеет то преимущество, требуя меньше информации о переводе: каждый сегмент требует только базы и связан с другими метаданными, тогда как секция памяти обычно имеет гораздо больше двух страниц, каждая из которых имеет базовый адрес и метаданные.)
Без перевода адреса, размещение сегментов неизбежно будет менее произвольным. К счастью, большинство программ не заботятся о конкретном адресе, где размещаются сегменты. (Единая адресное пространство операционка
(Обратите внимание, что это может быть удобно для доступных секций находиться в фиксированных местах. Для кода это можно использовать, чтобы избежать косвенности через глобальную таблицу смещения без необходимости бинарной перезаписи в загрузчике программы/динамический компоновщик. Это также может уменьшить накладные расходы для перевода адресов.)
Программирование на уровне приложений, как правило, достаточно абстрагировано от такой сегментации, что ее существование не заметно. Однако чистые абстракции, естественно, недружелюбны для интенсивной оптимизации использования физических ресурсов, в том числе время выполнения.
В additi на, система программирования может выбрать более сложное размещение данных (без программиста, которому необходимо знать детали реализации). Например, использование сопрограмм может способствовать использованию стека кактусов/спагетти, где смежность не ожидается. Аналогично, среда выполнения сбора мусора может предоставлять дополнительные деления адресного пространства, а не только для яслей, но также для разделения листовых объектов, которые не имеют ссылок на коллективную память, из нелистных объектов (уменьшая накладные расходы на метку/развертку). Также не особенно необычно выделять два сегмента стека, один для данных, адрес которых не берется (или, по крайней мере, фиксирован по размеру), а другой для других данных.
Традиционным расположение этих сегментов (с вниз растущего стека) в плоском виртуального адресного пространства для Unix-подобных операционных систем помещает текст в наименьший адрес, rodata сразу же выше, что, инициализируются данные сразу же выше, нулевые инициализированные данные (bss) сразу над этим, куча растет вверх от вершины bss и стек растет вниз от вершины части приложения виртуального адресного пространства.
Наличие кучи и стека, растущих друг к другу, позволяет произвольный рост каждого (для одного потока, использующего это адресное пространство!). Это место размещения также позволяет загрузчику программ просто скопировать файл программы в память, начиная с самого низкого адреса, сгруппировав память по разрешению и иногда позволяя одному глобальному указателю обрабатывать весь глобальный/статический диапазон данных (родаты, данные и ПБС).
ad 3) из перспективы памяти программиста C (++) ** появляется ** как линейный массив, управляемый менеджером памяти, поэтому эта часть не имеет для меня смысла. Весь этот вопрос очень широк, что очень мало исследований. Изучите похожие вопросы переполнения стека, а затем попытайтесь сузить этот. http://stackoverflow.com/search?q=%5Boperating-system%5D+paging+segmentation+answers%3A1 .. – xmojmr
@xmojmr да, он выглядит как линейный массив, но он разделен на сегменты. – BsD
Почему вопрос проголосовали за закрытие? Я не думаю, что этот предмет слишком широк. Но определенно не вопрос C. Я думаю, вы должны удалить этот тег. – m0skit0