Будет ли mmap использовать непрерывную память?(на солярисе)

StackOverflow https://stackoverflow.com/questions/837863

  •  10-07-2019
  •  | 
  •  

Вопрос

Я использовал mmap (просто пытаюсь понять, как работает mmap) для выделения 96 кб анонимной памяти, но, похоже, он разделил 96 кб на 64 кб и 32 кб.Но когда выделяется 960 кб, он выделяет только один фрагмент, размер которого равен 960 кб.Когда solaris разделит выделенную память на несколько частей?Код:

#define PROT PROT_READ | PROT_WRITE
#define MAP  MAP_ANON  | MAP_PRIVATE
if ((src = mmap(0, 88304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 983040, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 98304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

Ферменная конструкция:

mmap(0x00000000, 88304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E900000
mmap(0x00000000, 983040, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E800000
mmap(0x00000000, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E700000

Pmap ( Рмап ):

FFFFFFFF7E700000         64     -          -          - rw---    [anon]
    ==> strange is that for 96k, it was broken into 2 part.
FFFFFFFF7E710000         32     -          -          - rw---    [anon]
FFFFFFFF7E800000        960     -          -          - rw---    [anon]
FFFFFFFF7E900000         64     -          -          - rw---    [anon]
FFFFFFFF7E910000         24     -          -          - rw---    [anon]
FFFFFFFF7EA00000         64     -          -          - rw---    [anon]
FFFFFFFF7EA10000         32     -          -          - rw---    [anon]
Это было полезно?

Решение

Это является непрерывная память, вы можете определить по адресам (F...700000 + 64K = F...710000) так что я не думаю, что вам нужно беспокоиться об этом.Я почти уверен, что mmap необходим для предоставления вам непрерывной памяти в вашем адресном пространстве.В противном случае это было бы довольно бесполезно, поскольку оно дает вам только один базовый адрес.С двумя несмежными блоками не было бы никакого способа найти этот второй блок.

Итак, я предполагаю, что ваш вопрос заключается в следующем:почему это отображается в виде двух блоков в pmap?

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

Я бы предположил, что эти блоки были ранее выделены другому процессу (или двум) и были возвращены обратно в диспетчер памяти mmap.Я вижу две возможности того, как этот диспетчер памяти объединяет блоки для создания больших свободных блоков, либо:

  • он делает это, как только освобождается память (не тот случай, как показывает ваш вывод, который не происходящее).
  • он делает это периодически, и у него не было времени на это до того, как вы запросили свой 96-тысячный блок;или
  • это совсем не беспокоит, потому что он достаточно умен, чтобы сделать это во время выделения вам блока.

Я подозреваю, что это последнее просто потому, что у диспетчера памяти не было проблем с предоставлением вам двух блоков для вашего запроса, так что он, очевидно, создан для его обработки.Блок 960K, вероятно, не сегментирован, потому что он взят из гораздо большего блока.

Имейте в виду, что это предположение (обоснованное, но все же предположение).Я видел довольно много внутренностей UNIX (настоящих UNIX, а не этого новичка в блоке :-), но у меня никогда не было необходимости вникать в mmap.

Другие советы

Я не могу вспомнить термин для этого (полосы?Кусочки?клинья?argh) но Solaris выделяет страницы разных размеров из пулов разных размеров.Это оказывается несколько более эффективным, чем единообразные размеры страниц, поскольку лучше использует отображение памяти.Один из этих размеров - 32K, другой 64K, третий, по-моему, 1024K.Чтобы получить 96 тысяч, вы получаете 64 и 32, чтобы получить 960, вы получаете большую часть 1024 тысяч.

Основным ресурсом для этого волшебства является Внутренние устройства Solaris книга.Мой, к сожалению, находится в коробке в гараже в momrnt.

Ответ зависит от того, что вы подразумеваете под непрерывным.Solaris и все современные Unix и unix-подобные системы (вероятно, все современные операционные системы) будут разделять физическую память на страницы, и память внутри "страницы" будет непрерывной на физическом уровне.Большинство современных систем имеют аппаратный MMU (Модуль управления памятью), который преобразует виртуальный адрес в физический.Таким образом, системный вызов mmap вернет непрерывное виртуальное адресное пространство, но этот виртуальный адрес будет управляться MMU, который может использовать несколько страниц в зависимости от размера страницы (ов) и размера сопоставления памяти.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top