%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%20%ED%95%AD%EC%83%81%20%EA%B0%80%EC%83%81%20%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%99%80%20%EC%8B%A4%EC%A0%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EA%B0%84%EC%9D%98%20%EB%A7%A4%ED%95%91%EC%9D%B4%20%EC%82%AD%EC%A0%9C%EB%90%98%EB%82%98%EC%9A%94%3F.png)
를 사용하여 힙에서 블록을 할당한다고 가정해 보겠습니다 malloc
. 큰 크기의 메모리를 할당할 경우에는 내부적으로 malloc
호출하고 mmap
, 작은 크기의 메모리를 할당할 경우에는 내부적으로 malloc
호출합니다 brk
.
사용 시 힙은 계속 유지됩니다 sbrk()
.brk()
내 할당이 상대적으로 중간 크기이고 내부적으로 malloc
호출한다고 가정해 보겠습니다 brk
.
내가 전화한다고 하자malloc(small); malloc(medium); free(medium)
이 기사에 따르면유닉스의 메모리 할당을 위한 혼란스러운 저수준 방식의 역사
중단 상단에 사용되지 않은 공간 블록을 생성하기 위해 올바른 항목을 free()한 경우, malloc() 및 회사는 결국 프로그램의 중단을 호출하거나
brk()
축소sbrk()
하고 메모리를 OS에 다시 제공할 수 있습니다.
사용 가능한 중간 블록이 마지막 블록이므로(할당된 작은 블록이 마지막 두 번째 블록임) 메모리가 OS에 다시 반환됩니다.
내 질문은 다음과 같습니다.
"메모리는 OS에 다시 반환됩니다"라는 설명에 대해 제가 이해한 바는 가상 메모리와 실제 메모리 간의 사용 가능한 블록 매핑이 삭제되고 다른 프로세스가 이 사용 가능한 블록이 원래 차지했던 물리적 메모리를 사용할 수 있다는 것입니다. 내 이해가 맞나요?
이번에 제가 호출한 것은
malloc(medium); malloc(small); free(medium)
결국 할당된 블록이 아직 남아 있기 때문에 가상 메모리와 물리적 메모리 사이의 여유 블록 매핑이 여전히 존재하는 것일까요? 다른 프로세스가 이 여유 블록의 물리적 메모리를 사용할 수 있습니까?
답변1
물리적 메모리를 다른 목적으로 재사용할 수 있는 다른 메커니즘이 있습니다. 특히 이 경우 스왑이 있습니다. 메모리 압력이 충분히 높으면 프로세스의 물리적 메모리를 스왑하여 다른 것을 위한 공간을 확보할 수 있습니다.
요즘에는 운영 체제에 메모리를 다시 제공하는 것의 주요 이점은 운영 체제가알고 있다메모리는 다시 사용되지 않으므로 추가 절차 없이 해당 물리적 메모리를 삭제할 수 있습니다. (보다관련 SO 질문에 대한 내 대답자세한 내용은.)
가상 메모리와 실제 메모리 간의 매핑은 다소 유동적입니다. 스왑에 대해서는 위의 내용을 참조하세요. 귀하의 시나리오에서는 프로그램 중단을 줄일 수 없기 때문에 프로세스에 할당된 가상 주소 공간을 변경할 수 없으며 커널은 매핑된 모든 물리적 메모리가 "귀중"하고 중요한 데이터를 포함한다고 가정해야 합니다. 그러나 이것이 커널이 물리적 메모리의 용도를 변경할 수 없다는 의미는 아닙니다. 이는 저장된 데이터가 손실되지 않도록 보장해야 함을 의미할 뿐입니다.