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

Я использовал 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

Карта:

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]

person Daniel    schedule 08.05.2009    source источник


Ответы (3)


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

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

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

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

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

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

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

person paxdiablo    schedule 08.05.2009
comment
Поскольку адрес в выводе pmap является виртуальным адресом процесса, а не ядра, поэтому никакой другой процесс не может освободить блок. - person Daniel; 08.05.2009

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

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

person Charlie Martin    schedule 08.05.2009
comment
плиты. Вот и все. Прошло всего четыре года. - person Charlie Martin; 27.01.2013

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

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

person Robert    schedule 17.01.2014