%20%D0%B4%D0%BB%D1%8F%20%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0%20%D1%83%D0%B4%D0%B0%D0%BB%D1%8F%D0%B5%D1%82%20%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D0%B5%D0%B3%D0%BE%20%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C%D1%8E%20%D0%B8%20%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C%D1%8E%3F.png)
Допустим, мы хотим выделить блок из кучи, используя malloc
. При выделении большого размера памяти malloc
вызывается mmap
внутри , а при выделении небольшого размера malloc
вызывается brk
внутри .
Обратите внимание, что куча является непрерывной при использовании sbrk()
илиbrk()
Допустим, у меня распределение относительно среднего размера и внутренние malloc
вызовы .brk
скажем, я звонюmalloc(small); malloc(medium); free(medium)
согласно этой статьеИстория запутанного набора низкоуровневых способов выделения памяти в Unix
Если вы освободите нужные элементы, чтобы создать блок неиспользуемого пространства в верхней части прерывания, malloc() и компания в конечном итоге могут вызвать
brk()
илиsbrk()
уменьшить прерывание программы и вернуть память ОС.
поскольку свободный средний блок является последним (маленький выделенный блок является предпоследним), то память будет возвращена ОС.
Ниже приведены мои вопросы:
Я понимаю утверждение "память будет возвращена ОС": сопоставления свободного блока между виртуальной памятью и физической памятью сбрасываются, другие процессы могут использовать физическую память, которая изначально была занята этим свободным блоком. Я правильно понимаю?
на этот раз я вызываю
malloc(medium); malloc(small); free(medium)
Поскольку в конце все еще есть выделенный блок, существует ли еще отображение свободного блока между виртуальной памятью и физической памятью? могут ли другие процессы использовать физическую память этого свободного блока?
решение1
Существуют и другие механизмы, с помощью которых физическая память может быть повторно использована для других целей, в частности, в данном случае — подкачка: если нагрузка на память достаточно высока, физическая память процесса может быть подкачана, чтобы освободить место для чего-то другого.
В настоящее время основным преимуществом возврата памяти операционной системе является то, что операционная система затемзнаетчто память больше не будет использоваться, и поэтому он может стереть соответствующую физическую память без дальнейших церемоний. (См.мой ответ на связанный с этим вопросдля получения подробной информации.)
Сопоставления между виртуальной и физической памятью несколько текучи; см. вышеприведенный пункт о свопе. В вашем сценарии виртуальное адресное пространство, выделенное процессу, не может измениться, поскольку прерывание программы не может быть сокращено, и ядро должно предполагать, что любая физическая память, сопоставленная с ним, «драгоценна» и содержит важные данные. Но это не значит, что ядро не может переназначить физическую память; это означает лишь, что оно должно гарантировать, что при этом данные, хранящиеся там, не будут потеряны.