Fork() и распределение памяти

Я работаю над системой, в которой своп отключен, а overcommit памяти отключен.

Допустим, что мой процесс в настоящее время потребляет 100 МБ памяти, а свободная от системы память меньше 100 МБ.

Если я делаю fork(), это не сработает, потому что ядро ​​пытается также выделить 100 МБ для дочернего процесса?

Я читал, что Linux использует copy-on-write при форсировании, поэтому дочерние и родительские файлы разделяют все страницы. Итак, я думаю, что fork должен преуспеть?

Предполагая, что fork преуспевает, скажем, что у меня есть несколько строк кода в дочернем процессе до вызова exec(). Таким образом, родительский и дочерний будут продолжать делиться текстовым сегментом и не должно быть никаких изменений в использовании памяти, если дочерний процесс не касается какой-либо из кучной памяти. Правильно ли это?

Edit: One follow-up question: With swapping/overcommit disabled, can the cumulative VSS 
(Virtual Set Size) of all the processes be more than the available physical memory ?

I tried this out.  VSS of all the processes can be much more than that of the physical 
memory available.

pmap -x output from a process. 

total kB          132588   10744    7192

First number - Virtual Set Size
Second number - Resident Set Size
third number - dirty pages

RSS is < 10% of VSS. This is with swapping and overcommit disabled.

For every shared library loaded I see something like the following..

00007fae83f07000      32      24       0 r-x--  librt-2.12.so
00007fae83f0f000    2044       0       0 -----  librt-2.12.so
00007fae8410e000       8       8       8 rw---  librt-2.12.so

00007fae84312000     252     120       0 r-x--  libevent-2.0.so.5.0.1
00007fae84351000    2048       0       0 -----  libevent-2.0.so.5.0.1
00007fae84551000       8       8       8 rw---  libevent-2.0.so.5.0.1

I guess r-x segment is code and rw- is data. But there is a 2 MB segment 
that is not loaded. I see this 2 MB segment for every single shared library. 
My process loads a lot of shared libraries. That explains the huge difference 
between VSS & RSS.

Any idea what is that 2 MB segment per shared library ? 

When overcommit is disabled, if this process calls fork() will it fail when 
the free memory is less than VSS (132588 Kb) or RSS (10744) ?

Ответ 1

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

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