Для меня это не выглядит настолько независимым от языка, поскольку многие языки не имеют ничего, соответствующего фазе предварительной обработки. Тем не менее, это достаточно точно для начала.
Вы, похоже, путаете виртуальное адресное пространство с дисковым хранилищем файлов. На самом деле, это дополнение к физической памяти, и работает так же (за исключением производительности). Он использует диск, но не так, как файл.
Вы знаете, как работает физическая память. Виртуальная память - это способ подделать больший объем памяти обычно прозрачным способом. Файл разделен на «страницы», и страницы считываются с диска по мере необходимости. Физическая память делится на «рамки страницы», а адрес физической памяти не имеет ничего общего с виртуальным адресом, который он в данный момент представляет. Очевидно, что если программа использует больше памяти, чем физически доступно, фреймы страниц придется использовать повторно, поэтому содержимое фрейма страницы необходимо будет записать обратно (если оно изменилось с момента его прочтения) и загрузить новую страницу.
Если программа использует только часть своего адресного пространства за раз («рабочий набор»), и этой части достаточно мало страниц, чтобы все они могли одновременно находиться в физической памяти, это работает хорошо. Если он постоянно ссылается на большее количество страниц, чем может поместиться в физической памяти, страницы должны постоянно считываться с диска («трепаться»), производительность резко падает, а диск постоянно загружается.
Поэтому, когда я скомпилировал и соединил программу, на диске, в файловой системе, есть исполняемый файл. Когда я его выполняю, ему присваивается адресное пространство, а затем все усложняется. Фактически, он загружается в память, и сколько физической и виртуальной памяти не имеет значения для пользователя (за исключением того, что если у него недостаточно физической памяти, он будет работать очень медленно).
Следовательно, можно запустить программу 512M с физической памятью 256M.
Когда из кучи запрашивается память, она присваивается ячейкам памяти. По крайней мере, стандарт C и C ++ требует, чтобы он был пригоден для использования, если только запрос не был выполнен, поэтому «commit» выглядит для меня странным выбором слов. Он не должен находиться в физической памяти, пока не будет использован.