управление памятью операционной системы - вызов malloc () - PullRequest
1 голос
/ 01 ноября 2010

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

Скажем, процесс вызывает malloc (), что происходит за кулисами? мой ответ: библиотека времени выполнения находит блок памяти соответствующего размера в своем виртуальном адресном пространстве памяти. (Именно здесь вступают в игру алгоритмы распределения, такие как first-fit , best-fit , которые имеют дело с фрагментацией)

Теперь, скажем, процесс обращается к этой памяти, как это делается? мой ответ: адрес памяти, как видно из процесса, на самом деле является виртуальным. ОС проверяет, сопоставлен ли этот адрес с физическим адресом памяти и, если это так, осуществляет доступ. Если он не отображается - возникает ошибка страницы.

Я правильно понял? то есть библиотека компилятора \ среды выполнения отвечает за выделение блоков виртуальной памяти, а ОС отвечает за сопоставление виртуального адреса процессов и физических адресов (и соответствующего алгоритма подкачки)?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2010

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

В UnixyВ системах пользовательские процессы имеют область, называемую сегмент данных , что звучит так: именно туда идут данные.Когда процессу требуется память для данных, он вызывает brk(), который просит систему расширить сегмент данных до указанного значения указателя.(Например, если ваш существующий сегмент данных был пуст и вы хотели бы расширить его до 2M, вы бы позвонили brk(0x200000).)

Обратите внимание, что, хотя и очень часто, brk() не является стандартом;на самом деле он был вырван из POSIX.1 десять лет назад, потому что C указывает malloc(), и нет никаких оснований назначать интерфейс для выделения сегмента данных.

0 голосов
/ 01 ноября 2010

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

Это гораздо больше, чем это.Читайте на mmap (), анонимный и нет, общий и частный.И brk () тоже.malloc () основывается на brk () и mmap ().

...