블록에서 free()를 사용하면 항상 가상 메모리와 실제 메모리 간의 매핑이 삭제되나요?

블록에서 free()를 사용하면 항상 가상 메모리와 실제 메모리 간의 매핑이 삭제되나요?

를 사용하여 힙에서 블록을 할당한다고 가정해 보겠습니다 malloc. 큰 크기의 메모리를 할당할 경우에는 내부적으로 malloc호출하고 mmap, 작은 크기의 메모리를 할당할 경우에는 내부적으로 malloc호출합니다 brk.

사용 시 힙은 계속 유지됩니다 sbrk().brk()

내 할당이 상대적으로 중간 크기이고 내부적으로 malloc호출한다고 가정해 보겠습니다 brk.

내가 전화한다고 하자malloc(small); malloc(medium); free(medium)

이 기사에 따르면유닉스의 메모리 할당을 위한 혼란스러운 저수준 방식의 역사

중단 상단에 사용되지 않은 공간 블록을 생성하기 위해 올바른 항목을 free()한 경우, malloc() 및 회사는 결국 프로그램의 중단을 호출하거나 brk()축소 sbrk()하고 메모리를 OS에 다시 제공할 수 있습니다.

사용 가능한 중간 블록이 마지막 블록이므로(할당된 작은 블록이 마지막 두 번째 블록임) 메모리가 OS에 다시 반환됩니다.

내 질문은 다음과 같습니다.

  1. "메모리는 OS에 다시 반환됩니다"라는 설명에 대해 제가 이해한 바는 가상 메모리와 실제 메모리 간의 사용 가능한 블록 매핑이 삭제되고 다른 프로세스가 이 사용 가능한 블록이 원래 차지했던 물리적 메모리를 사용할 수 있다는 것입니다. 내 이해가 맞나요?

  2. 이번에 제가 호출한 것은 malloc(medium); malloc(small); free(medium) 결국 할당된 블록이 아직 남아 있기 때문에 가상 메모리와 물리적 메모리 사이의 여유 블록 매핑이 여전히 존재하는 것일까요? 다른 프로세스가 이 여유 블록의 물리적 메모리를 사용할 수 있습니까?

답변1

  1. 물리적 메모리를 다른 목적으로 재사용할 수 있는 다른 메커니즘이 있습니다. 특히 이 경우 스왑이 있습니다. 메모리 압력이 충분히 높으면 프로세스의 물리적 메모리를 스왑하여 다른 것을 위한 공간을 확보할 수 있습니다.

    요즘에는 운영 체제에 메모리를 다시 제공하는 것의 주요 이점은 운영 체제가알고 있다메모리는 다시 사용되지 않으므로 추가 절차 없이 해당 물리적 ​​메모리를 삭제할 수 있습니다. (보다관련 SO 질문에 대한 내 대답자세한 내용은.)

  2. 가상 메모리와 실제 메모리 간의 매핑은 다소 유동적입니다. 스왑에 대해서는 위의 내용을 참조하세요. 귀하의 시나리오에서는 프로그램 중단을 줄일 수 없기 때문에 프로세스에 할당된 가상 주소 공간을 변경할 수 없으며 커널은 매핑된 모든 물리적 메모리가 "귀중"하고 중요한 데이터를 포함한다고 가정해야 합니다. 그러나 이것이 커널이 물리적 메모리의 용도를 변경할 수 없다는 의미는 아닙니다. 이는 저장된 데이터가 손실되지 않도록 보장해야 함을 의미할 뿐입니다.

관련 정보