вы должны понимать, как работает виртуальная память и как отображение MMU связано с реальной оперативной памятью.
реальная оперативная память разделена на страницы, традиционно по 4 КБ каждая. каждый процесс имеет свое собственное отображение MMU, которое предоставляет этому процессу линейное пространство памяти (4 ГБ в 32-разрядной версии Linux). конечно, не все из них фактически выделены. сначала он почти пустой, то есть с большинством адресов не связана никакая реальная страница.
когда процесс сталкивается с незанятым адресом (пытаясь прочитать, записать или выполнить его), MMU генерирует ошибку (аналогично прерыванию) и вызывается система VM. Если он решает, что там должен быть какой-то объем оперативной памяти, он выбирает неиспользуемую страницу оперативной памяти и связывается с этим диапазоном адресов.
Таким образом, ядру все равно, как процесс использует память, а процессу на самом деле все равно, сколько оперативной памяти, у него всегда будет одно и то же линейное 4 ГБ адресного пространства.
теперь brk/sbrk
работает на несколько более высоком уровне: в принципе любой адрес памяти «за» этой меткой недействителен и не получит страницу RAM при доступе, вместо этого процесс будет убит. библиотека пользовательского пространства управляет выделением памяти в пределах этого ограничения и только при необходимости просит ядро увеличить его.
Но даже если процесс запускается с установки brk
на максимально допустимое значение, он не будет выделять реальные страницы ОЗУ, пока не начнет обращаться ко всем этим адресам памяти.
person
Javier
schedule
15.06.2009