면책 조항: 저는 컴퓨터 공학 학위를 가지고 있지만 이 주제에 대해 명확하게 설명한 적이 없습니다. 나는 내가 알고 있는 것의 조각들을 하나로 모아서 전체를 만들었습니다. 제가 틀린 부분이 있다면 바로잡아주세요.
C 프로그램이 있다고 가정합니다 malloc(1MB)
. 이 함수는 운영 체제에서 메모리 페이지를 할당하지 않습니다. 그것이 하는 일은 힙을 사용하여 가상 메모리 주소 공간에서 일련의 주소를 할당하는 것뿐입니다. 이 주소는 아직 실제 메모리 페이지에 매핑되지 않았습니다. 해당 주소에 처음 쓸 때 CPU는 예외(또는 인터럽트 등)를 포착하고 해당 주소에 새 메모리 페이지를 할당하면 쓰기가 성공합니다.
그런 다음 함수를 호출합니다 free()
. 이 함수는 또한 메모리 페이지를 운영 체제로 다시 해제하지 않습니다. 그것이 하는 일은 나중에 재사용할 수 있도록 주소 범위를 힙에 다시 넣는 것뿐입니다.
내 요점은 메모리 페이지가 절대로 해제되지 않는다는 것입니다(프로세스가 종료될 때까지). 맞아? 메모리 페이지를 해제하기 위한 시스템 호출은 없습니다. 그렇죠? 그리고 운영 체제 자체는 어떤 페이지가 더 이상 사용되지 않는지 추측할 수 없습니다. 할 수 있는 일은 가장 최근에 사용되지 않은 페이지를 확인하고 해당 페이지를 스왑 위치로 이동하는 것뿐입니다.
관련 (다소) 질문:애플리케이션이 할당된 메모리 일부를 해제하도록 강제할 수 있나요? 또한 관련:https://stackoverflow.com/questions/1421491/does-calling-free-or-delete-ever-release-memory-back-to-the-system
답변1
원칙적으로나 실제로는 페이지를 무료로 제공하는 것이 가능합니다.
malloc
free
예약된 주소 공간이 반드시 발생하지는 않습니다. 및 를 사용하여 구현할 수 있으며 , mmap
이 munmap
경우 해당 주소 공간과 채워진 페이지는 나중에 커널로 반환될 수 있습니다 munmap
. 할당된 주소 공간을 줄이기 위해 프로세스를 사용할 수도 있습니다 sbrk
.
이것madvise
이 함수는 주소 공간을 해제하지 않고 페이지를 삭제하는 데에도 사용할 수 있습니다.
답변2
마지막으로, OS 커널은 (가상 메모리) 페이지의 단편적인 "반환"을 허용합니까(이렇게 하면 지저분해질 수 있으며 실제로는 관련이 없으며 사용되지 않는 페이지는 어쨌든 RAM에서 빠르게 제거됩니다). 거의 같은 이유로 언어의 런타임은 무언가를 유지할 수 있습니다(예: C에서 이동하고 해제한 공간이 주소 공간의 연속 페이지라는 것을 보장할 수 있는 것이 malloc()
없는 free()
경우 - 더 많은 것을 요청하기 위해 다시 제공) 공간은 나중에 비용이 발생합니다).
Unix에서는 sbrk(2)
프로세스의 데이터 세그먼트를 확장/축소할 수 있지만 다음이 있다고 가정합니다.하나데이터 세그먼트(결국 여러 개가 있을 수 있음)와 런타임 스택은 원칙적으로 확장 및 축소됩니다. 다시 말하지만, 언어의 런타임이나 커널이 이에 대한 역할을 하는지 여부는 구현에 따라 다릅니다.
예를 들어 C에 대한 표준을 확인하세요. C 표준은 그러한 세부 사항을 추상화하고 리소스 제약 조건을 처리하여 프로그램이 해석 가능한 방식으로 실행되어야 한다는 "as if" 규칙을 주의 깊게 공식화합니다.