Как физические страницы распределяются и освобождаются во время malloc и free call? - PullRequest
4 голосов
/ 01 ноября 2010

Malloc выделяет память из одной из областей виртуальной памяти процесса, называемого Heap. Каков начальный размер кучи (сразу после начала выполнения и до любого вызова malloc)? Скажем, если Heap начинается с виртуального адреса X и заканчивается виртуальным адресом Y, я хочу знать разницу между X и Y.

Я прочитал ответы на дубликат вопроса, который был задан ранее.

Как работают malloc () и free ()?

Все ответы написаны в контексте виртуального адреса, но я хочу знать, как распределяются физические страницы. Я не уверен, но я думаю, что этот начальный размер (X-Y) не будет иметь соответствующие записи таблицы страниц в операционной системе. Пожалуйста, поправьте меня, если я ошибаюсь.

Теперь, скажем, есть запрос на выделение (и использование) 10 байтов памяти, будет выделена новая страница. Тогда все дальнейшие запросы на память будут удовлетворены с этой страницы или каждый раз, когда будет выделена новая страница? Кто решит это?

Когда память будет освобождена (используя free ()), в какое время эта выделенная физическая страница будет освобождена и помечена как доступная? Я понимаю, что виртуальный адрес и физическая страница не будут освобождены сразу, так как объем свободной памяти может быть очень меньше. Тогда в какое время соответствующая связь между физическим и виртуальным адресом будет прервана?

Извините, если мои вопросы могут показаться странными. Я просто новичок и пытаюсь понять внутренности.

Ответы [ 3 ]

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

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

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

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

Все это происходит в ядре, это невидимо с точки зрения C, так же как кэширование памяти ЦП невидимо от C. Ну, невидимо, пока вашпрограмма сильно замедляется из-за подкачки.Очевидно, что если вы отключите файл подкачки, все немного изменится: вместо замедления вашей программы из-за подкачки, какая-то программа не сможет выделить память или что-то будет убито OOM killer.

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

Распределение страниц различно в каждой ОС, Linux, Mac, Windows и т. Д. В большинстве / всех реализациях существует механизм ядра, который определяет, как он распределяется.

http://www.linuxjournal.com/article/1133

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

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

Теперь для возврата освобожденной памяти в ОС, это зависит от распределителя. Он не может вернуть ничего, кроме страницы, поэтому, хотя страница содержит выделенную память, она не будет возвращена. И в зависимости от того, как он был распределен, могут быть и другие ограничения; например, при использовании sbreak(), как это традиционно делается в Unix, вы можете возвращать только последние выделенные страницы (т.е. если вы возвращаете страницу, все, выделенные после, также возвращаются). Более современный подход в Unix использует mmapped memory для больших блоков при обосновании того, что mmapped memory может быть возвращена по желанию. Для небольших блоков размещения часто считается нецелесообразным проверять, могут ли быть возвращены страницы в середине, и поэтому не используется mmapped memory.

...