всегда ли использование free() для блока удаляет сопоставления между его виртуальной памятью и физической памятью?

всегда ли использование free() для блока удаляет сопоставления между его виртуальной памятью и физической памятью?

Допустим, мы хотим выделить блок из кучи, используя malloc. При выделении большого размера памяти mallocвызывается mmapвнутри , а при выделении небольшого размера mallocвызывается brkвнутри .

Обратите внимание, что куча является непрерывной при использовании sbrk()илиbrk()

Допустим, у меня распределение относительно среднего размера и внутренние mallocвызовы .brk

скажем, я звонюmalloc(small); malloc(medium); free(medium)

согласно этой статьеИстория запутанного набора низкоуровневых способов выделения памяти в Unix

Если вы освободите нужные элементы, чтобы создать блок неиспользуемого пространства в верхней части прерывания, malloc() и компания в конечном итоге могут вызвать brk()или sbrk()уменьшить прерывание программы и вернуть память ОС.

поскольку свободный средний блок является последним (маленький выделенный блок является предпоследним), то память будет возвращена ОС.

Ниже приведены мои вопросы:

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

  2. на этот раз я вызываю malloc(medium); malloc(small); free(medium) Поскольку в конце все еще есть выделенный блок, существует ли еще отображение свободного блока между виртуальной памятью и физической памятью? могут ли другие процессы использовать физическую память этого свободного блока?

решение1

  1. Существуют и другие механизмы, с помощью которых физическая память может быть повторно использована для других целей, в частности, в данном случае — подкачка: если нагрузка на память достаточно высока, физическая память процесса может быть подкачана, чтобы освободить место для чего-то другого.

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

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

Связанный контент