C-библиотечная-функция free()
но не имеет к, может возвратить память ядру.
Некоторые реализации malloc()
переместите границу между "кучей" и в других отношениях неиспользованным адресным пространством ("системное повреждение") через sbrk()
системный вызов, затем скупо выдайте мелкие кусочки тех больших выделений. Не получая каждую меньшую освобожденную часть, free()
не может действительно возвратить память ОС.
Та же самая причина относится malloc()
реализации, которые не используют sbrk(2)
, но, возможно, используйте mmap("/dev/zero")
или что-то.. Я не могу найти ссылку, но я, кажется, помню что один или другой из используемого BSD's mmap()
тот способ получить страницы памяти. Тем не менее, free()
не может возвратить страницу операционной системе, если каждое подвыделение не освобождено программой.
Некоторые malloc()
реализации действительно возвращают память системе: ChorusOS(?), по-видимому, сделал. Не ясно, переместило ли это системное повреждение, или munmap()'ed
страницы.
Вот статья о средстве выделения памяти, которое улучшает производительность "агрессивным отказом от свободных страниц к диспетчеру виртуальной памяти". Показ слайдов для разговора о средстве выделения.
Как правило, на x86 ни без какого PAE, будет разделение пользователя/ядра 3Gb/1Gb. Это означает, что главный 1 ГБ памяти резервируется для ядра, в то время как память доступов пространства пользователя на уровне более низких 3 ГБ. Это сделано этот способ избежать необходимости обновлять регистр, который указывает на таблицы страниц (CR3), и сбросьте TLB каждый раз, когда существует контекстное переключение. С этой оптимизацией обновляется CR3, и TLB сбрасывается только при планировании другого процесса.
Информация о том, как виртуальные адреса должны быть интерпретированы, хранится в трех местах: