Linux allocate virtual memory

How can I reserve virtual memory in Linux?

I have an application that reserves a contiguous memory block using VirtualAllocEx on Windows with the MEM_RESERVE flag. This reserves a virtual memory block, but does not back it with a physical page or page file chunk. Hence, accessing the allocated memory will result in a segmentation fault — but other allocations will not intersect with this virtual memory block. How can I do the same for Linux with mmap? I did notice the answer in this question, but does that really guarantee that say, 1 GB of physical memory won’t be allocated to my process if I don’t touch the allocated pages? I don’t want any thrashing problems.

1 Answer 1

I believe you should be able to achieve the same by mapping anonymous memory with PROT_NONE . Accessing PROT_NONE memory will result in a segfault, but the memory region will be reserved and not used for any other purpose. If you want to allocate a very big chunk of memory, add MAP_NORESERVE to ensure that the default overcommit mechanism won’t check your allocation.

PROT_NONE is commonly employed for «guard» pages at the end of stacks.

This is a very interesting technique. By using mmap(2) + PROT_NONE you basically have the same effects of VirtualAlloc() + MEM_RESERVE on Windows. I am a little bit more concerned about the MAP_NORESERVE flag: while you can set PROT_READ|PROT_WRITE with mprotect(2) once you need pages (that will be like a call to VirtualAlloc() + MEM_COMMIT ), it seems you cannot reset the flag MAP_NORESERVE once you’ve specified it to a call to mmap(2) , so your memory will be set as «no reserve» forever, even when «committed». How would you solve this quirk?

I think the cleanest solution would be to call mmap again with MAP_FIXED and the address/size of the region to allocate/commit. It’s entirely possible to mmap on top of existing regions (replacing any existing mapping in the area) if you use MAP_FIXED , and this is a common way of changing mmap flags that can’t be changed via some combination of mlock/mprotect.

Источник

Is it possible to allocate large amount of virtual memory in linux?

It would be efficient for some purposes to allocate a huge amount of virtual space, and page in only pages that are accessed. Allocating a large amount of memory is instantaneous and does not actually grab pages:

char* p = new char[1024*1024*1024*256]; 

Ok, the above was wrong as pointed out because it’s a 32 bit number. I expect that new is calling malloc which calls sbrk, and that when I access a location 4Gb beyond the start, it tries to extend the task memory by that much? Here is the full program:

Читайте также:  Uefi iso образ linux

Now, I get bad_alloc when attempting to allocate the huge amount, so obviously malloc won’t work. I was under the impression that mmap would map to files, but since this is suggested I am looking into it. Ok, so mmap seems to support allocation of big areas of virtual memory, but it requires a file descriptor. Creating huge in-memory data structures could be a win but not if they have to be backed by a file: The following code uses mmap even though I don’t like the idea of attaching to a file. I did not know what number to put in to request in virtual memory, and picked 0x800000000. mmap returns -1, so obviously I’m doing something wrong:

#include #include #include #include int main()

Is there any way to allocate a big chunk of virtual memory and access pages sparsely, or is this not doable?

I’m not very familiar or certain about this stuff, but I think the mmap system call could be used for this.

Please stick to the internationally agreed SI units system — en.wikipedia.org/wiki/International_System_of_Units Please use B for bytes and b for bits, so one megabyte is 1MB, one gigabyte is 1GB (en.wikipedia.org/wiki/Gigabyte), one gigabit is 1Gb (en.wikipedia.org/wiki/Gigabit). Thank you.

@MarkSetchell According to SI unit system, G stands for 10^9. If you need to be precise, use GiB here.

2 Answers 2

Is it possible to allocate large amount of virtual memory in linux?

Possibly. But you may need to configure it to be allowed:

The Linux kernel supports the following overcommit handling modes

0 — Heuristic overcommit handling. Obvious overcommits of address space are refused. Used for a typical system. It ensures a seriously wild allocation fails while allowing overcommit to reduce swap usage. root is allowed to allocate slightly more memory in this mode. This is the default.

1 — Always overcommit. Appropriate for some scientific applications. Classic example is code using sparse arrays and just relying on the virtual memory consisting almost entirely of zero pages.

2 — Don’t overcommit. The total address space commit for the system is not permitted to exceed swap + a configurable amount (default is 50%) of physical RAM. Depending on the amount you use, in most situations this means a process will not be killed while accessing pages but will receive errors on memory allocation as appropriate.

Useful for applications that want to guarantee their memory allocations will be available in the future without having to initialize every page.

The overcommit policy is set via the sysctl `vm.overcommit_memory’.

So, if you want to allocate more virtual memory than you have physical memory, then you’d want:

# in shell sysctl -w vm.overcommit_memory=1 

RLIMIT_AS The maximum size of the process’s virtual memory (address space) in bytes. This limit affects calls to brk(2), mmap(2) and mremap(2), which fail with the error ENOMEM upon exceeding this limit. Also automatic stack expansion will fail (and generate a SIGSEGV that kills the process if no alternate stack has been made available via sigaltstack(2)). Since the value is a long, on machines with a 32-bit long either this limit is at most 2 GiB, or this resource is unlimited.

Or, if you cannot give the process permission to do this, then you can configure this persistently in /etc/security/limits.conf which will affect all processes (of a user/group).

Ok, so mmap seems to support . but it requires a file descriptor. . could be a win but not if they have to be backed by a file . I don’t like the idea of attaching to a file

You don’t need to use a file backed mmap. There’s MAP_ANONYMOUS for that.

I did not know what number to put in to request

mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) 

That said, if you’ve configured the system as described, then new should work just as well as mmap . It’ll probably use malloc which will probably use mmap for large allocations like this.

Читайте также:  Linux mint раздел подкачки

Bonus hint: You may benefit from taking advantage of using HugeTLB Pages.

Источник

Что такое виртуальная память в Linux? Как этим управлять

Виртуальная память помогает операционной системе выполнять свои процессы без прерываний. Вот как вы можете управлять виртуальной памятью в Linux.

Виртуальная память — это одна из тех вещей, которые лежат в основе современных операционных систем, но обычно вы не задумываетесь об этом, если у вас нет проблем. Дистрибутивы Linux просят вас настроить пространство виртуальной памяти (разделы подкачки) во время установки, но большинство новичков не знают, насколько это полезно.

Вот все, что вам нужно знать о виртуальной памяти в Linux.

Что такое виртуальная память?

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

В Linux это делается на уровне ядра и аппаратного обеспечения. В процессоре есть аппаратное обеспечение, называемое модулем управления памятью (MMU), которое преобразует адреса физической памяти в виртуальные. Эти адреса не зависят от того, где они физически находятся на компьютере. Эти адресные пространства известны как «страницы», и они могут находиться в оперативной памяти или на вашем жестком диске или SSD. ОС рассматривает эти адреса как один большой пул памяти, известный как «адресное пространство».

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

Читайте также:  Add new hardware in linux

Пространство, используемое для виртуальной памяти на диске, известно как «резервное хранилище» или «пространство подкачки». В мире Windows она обычно реализуется в виде файла, известного как «файл подкачки». Это также возможно сделать в Linux, но гораздо чаще используется выделенный раздел диска.

Файлы подкачки в Linux обычно зарезервированы для минимальных или встроенных систем, и последние обычно работают без виртуальной памяти полностью, потому что встроенные ОС должны быть небольшими.

Преимущество виртуальной памяти заключается в том, что можно запускать большие программы, используя больше памяти, чем физическая оперативная память вашего компьютера, подобно тому, как кредитная карта позволяет совершать крупные покупки на сумму, превышающую сумму, имеющуюся на вашем банковском счете. Как и кредитная карта, виртуальная память полезна, когда она вам нужна, но вы не хотите чрезмерно ее использовать.

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

Исторически основным недостатком виртуальной памяти было то, что жесткие диски работали медленнее, чем оперативная память. Если на компьютере недостаточно оперативной памяти, система может бесконечно загружать и удалять страницы, процесс, известный как «загрузка». Это не такая проблема на современных ПК с большим объемом оперативной памяти и более быстрыми твердотельными накопителями, вытесняющими механические жесткие диски, но об этом все равно нужно знать.

Разделы подкачки Linux

Как упоминалось ранее, обычным методом настройки виртуальной памяти в Linux является использование выделенного раздела диска. Утилита установки изучит ваше оборудование и предложит схему разделения, которая включает раздел подкачки.

Вы также можете добавить разделы подкачки после установки. Если вы хотите добавить новый раздел на существующий диск, вам придется использовать инструмент неразрушающего разбиения на разделы, такой как GParted. Убедитесь, что вы выбрали «Linux swap» в качестве файловой системы для вашего раздела.

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

Теперь вам нужно отредактировать /etc/fstab как root, чтобы добавить раздел подкачки. Эта строка, добавленная в файл, настроит раздел подкачки, который будет смонтирован во время загрузки:

Теперь используйте команду swapon , чтобы активировать новое пространство подкачки, где sdX — это имя вашего раздела подкачки:

Использование файлов подкачки в Linux

Легко настроить файл подкачки в Linux с помощью командной строки. Возможно, вы захотите сделать это, если не хотите переделывать свой диск или редактировать /etc/fstab . Один из методов — использовать fallocate :

Например, для создания файла подкачки объемом 2 ГБ:

В качестве альтернативы вы можете использовать команду dd для создания файла подкачки.

Источник

Оцените статью
Adblock
detector