답변:
내가이 재료를 배운 지 오랜 시간이 지났지 만 여기에 간다.
운영 체제가 프로세스를 시작하면 가상 메모리 테이블에서 페이지를 할당합니다. 운영 체제는 가상 메모리 테이블에서 실제 메모리 또는 디스크의 스왑 공간으로의 맵을 유지 관리합니다. 프로세스가 종료되면 OS는 CPU주기를 중단하지 않습니다. 몇 가지 정리 항목을 수행하며 그 중 하나는 모든 메모리 페이지를 사용 가능한 것으로 표시합니다. 이를 통해 다른 응용 프로그램에서 재사용 할 수 있습니다. 또한 OS는 프로세스가 가진 모든 리소스 핸들을 정리하여 파일, 네트워크 연결, 프로세스 간 파이프 등을 자동으로 닫습니다. 이 프로세스는 전적으로 OS의 제어하에 있으며 프로세스가 어떻게 종료 되든 관계없이이 단계를 수행합니다.
이 모든 것이 운영 체제 프로세스에 적용됩니다. 가상 머신 방식이 있고 여러 가상 프로세스를 한 번에 실행중인 경우 VM은 가상 머신에 할당 및 할당 해제 방법을 결정해야합니다. 그러나 OS에서는 여전히 하나의 프로세스처럼 보입니다. 따라서이 경우 여러 프로세스를 실행하는 VM이 있고 VM 내에서 그 중 하나를 종료하면 호스트 OS에서 즉시 메모리를 다시 얻지 못할 수 있습니다. 그러나 VM으로 다시 가져옵니다. 그러나 운영 체제 내에서 VM을 종료하면 OS가 VM을 종료하고 (이는 간접적으로 VM의 프로세스를 종료 함) 모든 메모리를 회수합니다 (가비지 수집기를 통과 할 필요가 없음, free ()). , 삭제 또는 기타 사항).
높은 추론 :
.NET이 동일한 VM에서 둘 이상의 .NET 앱이있는 가상 머신으로 실행되는 경우 .NET은 GC를 실행할 때까지 GCd가 아닌 메모리를 보유 할 수 있으며 Windows는 .NET이 실제보다 더 많이 사용합니다. (그리고 MS가 정말 매끄럽다면 Windows는 메모리가 부족한 상황에서 .NET을 GC에 알릴 수는 있지만 디스크 스왑 공간이 무엇인지는 거의 알 수 없습니다.)
.NET이 그런 식으로 작동했다면 OS는 여전히 OS 목적을위한 하나의 프로세스로 생각할 것입니다.이 프로세스는 유지할 것과 버릴 것을 결정하는 책임이 있으며, 프로세스에 필요한 것을 알리는 것은 일반적으로 Windows의 문제가 아닙니다. 메모리 할당 해제를 시작합니다. 이 시점에서 MS는 .NET 프로세스가 그렇지 않은 것을 제외하고는 .NET 프로세스가 Windows 프로세스처럼 보이도록 .NET 전용의 특수 API를 빌드 할 수 있습니다. 따라서 프로세스 메모리가 할당 해제되지 않았다고 생각할 수 있습니다. 정말입니다; 잘못된 프로세스를보고 있다는 것입니다.
.NET이 실제로 그렇게 작동한다고 말할 정도로 충분하지 않습니다. Java VM은 그렇지 않습니다.
추측의 끝.
편집 : 메모리 관리에 나쁜 프로세스를 죽이는 한 여러 프로세스가 동일한 풀에서 할당해야합니다 (즉, 실제 프로세스보다 스레드와 유사합니다). 프로세스가 끝난 후 메모리가 해제되지 않아야합니다. 죽었다. 가상 메모리와 선점 형 멀티 태스킹은 일반적으로 함께 구현 되었기 때문에 협력적인 멀티 태스킹 시스템이 거의 필요합니다. 가상 메모리가 있으면 OS 수준에서 프로세스 후에 정리하기가 쉽지 않습니다. 모든 페이지를 프로세스 풀에서 사용 가능한 풀로 이동하기 만하면됩니다.
내 경험에 아무런 문제가 없습니다.
예를 들어, 4GB의 RAM이 있고 그 중 3GB가 게임에서 사용 중이고 게임 프로세스를 종료 한 경우 문제없이 게임을 다시 시작할 수 있으며 프로세스에 다시 3GB의 RAM이 있습니다.
질문 태그 (Windows 및 OS X)에 나열된 운영 체제는 가상 메모리를 구현 합니다 . 여기서 각 프로세스에는 고유 한 주소 공간이 제공되며 OS에 의해 실제 메모리에 매핑됩니다. 이 맵핑 테이블은 프로세스가 종료 될 때 메모리 할당 정리에 사용되므로 메모리가 완전히 해제됩니다. 실제 페이지는 여러 프로세스간에 공유 될 수 있으며,이 경우 더 이상 사용자가 없을 때 해제됩니다.
일반적으로 파일 핸들과 같은 다른 리소스는 기능 의 형태로 프로세스에 제공됩니다 . 여기서 프로세스는 리소스에 대한 핸들을 받고 잘 정의 된 액세스 기능을 통해이를 처리합니다. OS는 함수를 제공하는 핸들 값에서 커널 내부 오브젝트로 테이블 맵핑을 유지합니다. 또한이 테이블은 프로세스가 종료 될 때 정리에 사용될 수 있습니다.
예를 들어 프로세스 간 통신에 사용할 수있는 영구 명명 된 공유 메모리 할당을 만드는 것이 가능합니다. OS가 여전히 필요한지 여부를 판단 할 수 없기 때문에 거의 사용되지 않습니다.
다른 운영 체제에서는 때때로 명확한 프로세스 분리가 없습니다. 따라서 개별 응용 프로그램을 정리해야합니다.
프로세스를 강제로 닫으면 프로세스를 정리할 기회를주지 않고 프로세스를 종료합니다. OS에 모든 리소스의 전체 목록이있는 경우 부작용이 없습니다.