Не могу найти функций для работы с виртуальной памятью в Linux, нашел mmap но это не то.
Нужно нечто аналогичное VirtualAlloc (win32), т.е. так что бы резервировать блоки виртуальной памяти, а затем по мере необходимости выделять реальную память в нужных местах.
Существут ли такие функции?
Решено: Использование виртуальной памяти. (gcc)
Модератор: Модераторы разделов
-
- Сообщения: 595
- ОС: Debian 6
-
- Сообщения: 595
- ОС: Debian 6
Re: Решено: Использование виртуальной памяти. (gcc)
Тогда не знаю
Re: Решено: Использование виртуальной памяти. (gcc)
Насколько могу судить, Linux автоматически не выделяет память. Например прога:
до вызова unmap съест 4 метра (а не гиг) - только те, страницы, к которым осуществлялась запись. А:
Съедает весь гиг.
Если не считаете надежным такое поведение (оно, вроде не описано стандартами), то используйте mmap с параметром MAP_NORESERVE. Но разницы в поведении не увидел.
Код: Выделить всё
#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. Но разницы в поведении не увидел.
-
- Сообщения: 595
- ОС: Debian 6
Re: Решено: Использование виртуальной памяти. (gcc)
NickLion
и правда MAP_ANONYMOUS и mprotect() позволяют сделать полные аналоги VirtualAlloc.
спасибо за подсказку.
и правда MAP_ANONYMOUS и mprotect() позволяют сделать полные аналоги VirtualAlloc.
спасибо за подсказку.