를 사용하여 힙에서 블록을 할당한다고 가정합니다 malloc
. 큰 크기의 메모리를 할당하면 내부적으로 malloc
호출되고 , mmap
작은 크기의 메모리를 할당하면 내부적으로 malloc
호출됩니다 brk
.
sbrk()
또는 를 사용할 때 힙은 연속적입니다.brk()
malloc
내 할당이 상대적으로 중간 크기이고 내부적으로 호출된다고 가정해 보겠습니다 brk
.
내가 전화한다고 가정 해 봅시다malloc(small); malloc(medium); free(medium)
이 기사에 따르면유닉스에서 혼란스러운 저수준 메모리 할당 방법의 역사
인터럽트 위에 사용되지 않은 공간 덩어리를 만들기 위해 올바르게 free()를 수행한 경우 malloc() 및 회사는 결국 프로그램의 인터럽트를 호출
brk()
하거나sbrk()
축소하고 메모리를 운영 체제에 반환할 수 있습니다.
여유 중간 블록이 마지막 블록이므로(작은 할당 블록은 마지막에서 두 번째 블록임) 메모리가 운영 체제로 반환됩니다.
내 질문은 다음과 같습니다.
"메모리가 운영 체제에 반환됩니다"라는 문장에 대한 나의 이해는: 사용 가능한 블록의 가상 메모리와 물리적 메모리 간의 매핑이 삭제되고, 사용 가능한 블록이 원래 차지했던 물리적 메모리를 다른 프로세스가 사용할 수 있다는 것입니다. 내 이해가 맞나요?
이번에 제가 호출한 것은
malloc(medium); malloc(small); free(medium)
마지막에 할당 블록이 있기 때문에 가상 메모리와 물리적 메모리 사이의 여유 블록 매핑이 여전히 존재합니까? 다른 프로세스가 이 여유 물리적 메모리 블록을 사용할 수 있습니까?
답변1
물리적 메모리를 다른 목적으로 재활용하는 다른 메커니즘이 있습니다. 특히 이 경우 스왑을 사용합니다. 메모리 압력이 충분히 높으면 프로세스의 물리적 메모리를 스왑하여 다른 메모리를 확보할 수 있습니다.
오늘날 운영 체제에 메모리를 반환하는 것의 주요 이점은 운영 체제가 다음을 수행할 수 있다는 것입니다.알다이 메모리는 다시 사용되지 않으므로 별도의 의식 없이 해당 물리적 메모리를 폐기할 수 있습니다. (바라보다관련 SO 질문에 대한 내 대답더 알아보기. )
가상 메모리와 실제 메모리 간의 매핑은 다소 불안정합니다. 위의 스와핑에 대한 요점을 참조하세요. 귀하의 시나리오에서는 프로그램 인터럽트를 줄일 수 없기 때문에 프로세스에 할당된 가상 주소 공간을 변경할 수 없으며 커널은 매핑된 모든 물리적 메모리가 "귀중"하고 중요한 데이터를 포함한다고 가정해야 합니다. 그러나 이것이 커널이 물리적 메모리의 용도를 변경할 수 없다는 의미는 아닙니다. 커널이 물리적 메모리의 용도를 변경할 수 없다는 의미입니다. 이는 단순히 프로세스 중에 저장된 데이터가 손실되지 않도록 해야 함을 의미합니다.