LINUX.ORG.RU

Как выделить много памяти?

 ,


0

3

В Windows есть разница между памятью, выделенной в хипе (HeapAlloc) , в плане нельзя там выделить скажем 100 мегабайт (хип процесса имеет меньше, можно конечно свой создать, но это такое). И виртуальной памятью (virtualloc) где можно выделить сколько угодно (в пределах ограничений ОС, ес-но). А как в линукс? Можно ли выделить много памяти (скажем, блок на 100мб ) через malloc? Или надо иначе, через brk / mmap?

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

@X512 фига там у вас в вантузе костыли, оправдывайся

anonymous
()

malloc выделит любой запрошенный объём, лишь бы хватило адресного пространства процесса. mmap то сисколл, его malloc иногда использует внутри себя для разных целей.

firkax ★★★★★
()

Можно ли выделить много памяти (скажем, блок на 100мб ) через malloc?

100мб – это немного. Если ты никаких странных манипуляций не планируешь, то дёргай malloc() и не парься. Если планируешь, например, делать ползучее выделение/освобождение с сохранением выделенного блока, как это делают некоторые GC, придётся с mmap() запариться.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Планирую делать mem pool , т.е. выделить огромный объем и выделять в нем самостоятельно куски свободной / занятой памяти.

zer0cat
() автор топика

Если оно надо все время существования процесса, то сделай большой неинициализированный массив и пользуйся

cobold ★★★★★
()
Ответ на: комментарий от zer0cat

Если твой mem pool гарантированно влезает в оперативку и ты не планируешь проблем с этим, malloc() – твой выбор.

hateyoufeel ★★★★★
()

нельзя там выделить скажем 100 мегабайт

С чего бы это? Вот я спокойно выделил 50GB через HeapAlloc() из дефолтного хипа:

    HANDLE hHeap = GetProcessHeap();
    LPVOID buf = HeapAlloc(hHeap, 0, (SIZE_T) 50 * 1024 * 1024 * 1024);

    if (buf == NULL) {
        std::cout << "Error allocating from heap\n";
    }
bigbit ★★★★★
()
Последнее исправление: bigbit (всего исправлений: 2)

Аналог VirtualAlloc в linux будет mmap. Ограничение те-же: размер выделяемого блока кратен размеру страницы. Выделение памяти через эти функции выгодно тем, что при освобождении память сразу доступна для других программ. Недостаток - это всегда системный вызов, может быть медленнее malloc\new для небольших блоков.

m0xf
()

malloc сам по себе является аллокатором для набора пулов разных размеров.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от cobold

А почему минусуют?

char a[100500]{}

Места в бинарнике не займёт, при инициализации выделится и обнулится.

Если размер заранее не известен, то mmap. Когда вызывается при старте программы и выделяет большой кусок, выделятся новые страницы, они будут заполнены нулями, но я бы на всякий случай всё равно прописал нули снова (если за скорость инициализации не борешься), чтобы быть уверенным, что память реально выделилась.

blex ★★★★
()
Ответ на: комментарий от blex

А где это выделиться-то? Если на стеке, то стека не хватит, если глобальная переменная, то бинарь будет огромный… в .BSS разве что?

zer0cat
() автор топика
Ответ на: комментарий от m0xf

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

Ещё преимущества: 1) страницы, которые возвращает mmap, гарантированно заполнены нулями; 2) при надобности эти страницы можно легко расшарить с другими процессами

annulen ★★★★★
()
Ответ на: комментарий от zer0cat

Да, я предполагаю, что будет помещено в .BSS Если нет, то сразу будет видно по размеру бинаря.

blex ★★★★
()

в плане нельзя там выделить скажем 100 мегабайт (хип процесса имеет меньше

Внезапно, не знал.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Это хрень. У меня этот код спокойно выделяет 50GB их хипа.

bigbit ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.