Решено: Использование виртуальной памяти. (gcc)

Модератор: Модераторы разделов

Ответить
apprentice
Сообщения: 595
ОС: Debian 6

Решено: Использование виртуальной памяти. (gcc)

Сообщение apprentice »

Не могу найти функций для работы с виртуальной памятью в Linux, нашел mmap но это не то.
Нужно нечто аналогичное VirtualAlloc (win32), т.е. так что бы резервировать блоки виртуальной памяти, а затем по мере необходимости выделять реальную память в нужных местах.

Существут ли такие функции?
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Решено: Использование виртуальной памяти. (gcc)

Сообщение Alxn1 »

Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks
Контактная информация:

Re: Решено: Использование виртуальной памяти. (gcc)

Сообщение Alxn1 »

Тогда не знаю :(
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Решено: Использование виртуальной памяти. (gcc)

Сообщение NickLion »

Насколько могу судить, Linux автоматически не выделяет память. Например прога:

Код: Выделить всё

#include <sys/mman.h>

int main() {
    void* ptr = mmap( NULL, 1024 * 1024 * 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE/*|MAP_NORESERVE*/|MAP_ANONYMOUS, -1, 0 );
    for( int i = 0; i < 1024; i++ ) {
        *(((unsigned char*)ptr)+ 1024 * 1024 * i) = 5;
    }
    munmap( ptr, 1024*1024*1024 );
}

до вызова unmap съест 4 метра (а не гиг) - только те, страницы, к которым осуществлялась запись. А:

Код: Выделить всё

#include <sys/mman.h>

int main() {
    void* ptr = mmap( NULL, 1024 * 1024 * 1024, PROT_READ|PROT_WRITE, MAP_PRIVATE/*|MAP_NORESERVE*/|MAP_ANONYMOUS, -1, 0 );
    for( int i = 0; i < 1024 * 1024; i++ ) {
        *(((unsigned char*)ptr)+ 1024 * i) = 5;
    }
    munmap( ptr, 1024*1024*1024 );
}

Съедает весь гиг.
Если не считаете надежным такое поведение (оно, вроде не описано стандартами), то используйте mmap с параметром MAP_NORESERVE. Но разницы в поведении не увидел.
Спасибо сказали:
apprentice
Сообщения: 595
ОС: Debian 6

Re: Решено: Использование виртуальной памяти. (gcc)

Сообщение apprentice »

NickLion

и правда MAP_ANONYMOUS и mprotect() позволяют сделать полные аналоги VirtualAlloc.

спасибо за подсказку.
Спасибо сказали:
Ответить