5

내 작업 관리자 (top, ps, taskmgr.exe 또는 Finder)가 프로세스가 XXX KB의 메모리를 사용하고 있다고 말하면 정확히 무엇을 세고, 어떻게합니까? 업데이트 되나요?운영 체제는 내 앱에서 사용중인 메모리 양을 어떻게 알 수 있습니까? (그리고 왜 쓰레기 수거를하지 않습니까?)

메모리 할당과 관련하여 C++로 작성된 응용 프로그램은 가상 컴퓨터 (.NET 또는 Java와 같은 관리되는 코드)로 실행되는 응용 프로그램과 운영 체제에 따라 다르게 나타 납니까?

마지막으로, 메모리가 투명하면 왜 가비지 수집이 운영 체제의 기능 또는 서비스 제공이 아닌지? 내가 물어 정말 관심이 무엇인지


이 밝혀 바와 같이, 운영 체제가 쓰레기 수집 및 조각 모음 메모리 공간을 할 수없는 이유이다 - 나는 "간단하게"프로세스 주소 공간을 할당 위의 단계로 볼 수있다.

이러한 답변은 많은 도움이됩니다. 감사!

+0

지금까지의 답변은 훌륭합니다. 문제는 "관리되는"환경을 제공하고 가비지 수집을 완료하는 운영 체제가 있습니까? :) –

+0

일종의, 블랙 베리와 다른 임베디드 시스템과 같은 "Java"기반의 플랫폼이 있습니다. 그러나 명확한 애플리케이션 협력없이 일반 GC를 제공하는 데스크탑 클래스 OS는 없습니다. –

+0

관리되는 OS에 대한 Microsoft 연구 프로젝트에 대해 읽은 것을 기억합니다. 가비지 수집을 제공하는 것으로 가정하고, 참조를 찾을 수 있는지 확인할 것입니다 ... – Martin

답변

4

이것은 하나의 대답으로 적절하게 답변 할 수없는 큰 주제입니다. Windows Internals 사본을 가져 오는 것이 좋습니다.이 자료는 매우 귀중한 자료입니다. Eric Lippert에는 운영 체제에서 할당 한 메모리를 볼 수있는 방법에 대한 좋은 설명 인 최근 블로그 게시물이 있습니다.

프로세스가 사용하는 메모리는 기본적으로 실제 메모리, 페이지 파일 또는 파일에 의해 백업 될 수있는 운영 체제에 의해 예약 된 address space입니다. 이는 관리되는 응용 프로그램이든 기본 응용 프로그램이든 동일합니다. 프로세스가 종료되면 운영 체제는 할당 된 메모리를 삭제합니다. 가상 주소 공간은 단순히 삭제되고 페이지 파일이나 실제 메모리 백업은 다른 프로세스에서 사용할 수 있습니다. 이것은 운영체제가 실제로 유지 관리하는 모든 것입니다. 물리적 공간에 주소 공간을 매핑합니다. 프로세스가 더 많은 메모리를 요구하거나 유휴 상태 일 때 매핑이 바뀔 수 있습니다. 요구 사항을 충족시키기 위해 물리적 메모리 내용을 디스크로 이동하거나 그 반대의 경우도 가능합니다.

이러한 도구에 따라 사용되는 프로세스는 실제로 할당 된 전체 주소 공간, 할당 된 총 메모리 (페이지 파일 + 실제 메모리) 또는 프로세스가 실제로 사용하는 메모리가 될 수 있습니다. 기억. 작업 관리자에는 이러한 각각의 가능성에 대해 별도의 열이 있습니다.

운영 체제는 가비지 수집을 할 수 없습니다. 메모리에 실제로 들어있는 내용에 대한 통찰력이 없으므로 OS는 가비지 수집을 할 수 없습니다. 메모리의 할당 된 페이지 만 보게되며, 참조되거나 참조되지 않을 수도있는 객체를 볼 수 없습니다.

OS 핸들이 가상 주소 수준에서 할당하는 반면, 프로세스 자체에는 페이지 크기의 큰 덩어리를 가져 와서 응용 프로그램에 유용한 유용한 것으로 나누는 다른 메모리 관리자가 있습니다. Windows는 64k 경계에서 할당 된 메모리를 반환하지만 힙 관리자는 new을 통해 프로그램에서 수행 한 각 개별 할당에 사용하기 위해 작은 덩어리로 분할합니다. .NET 응용 프로그램에서 CLR은 가비지 수집 힙에서 새 개체를 넘겨주고 그 힙이 한계에 도달하면 가비지 수집을 수행합니다.

+0

좋은 링크! OS와 메모리 관리자간에 작업이 어떻게 나누어 져 있는지에 대한 설명에 감사드립니다. 필자는 실제로 대학에서 OS 과정을 수강 한 적이 없지만 malloc을 기억하고 FFT 루틴을 요청하는 "올바른"크기를 찾았습니다. –

2

C++과 가상 머신 등에서 메모리가 나타나는 방식의 차이점에 대해서는 말할 수 없지만 일반적으로 응용 프로그램이 초기화시 사용할 특정 메모리 범위가 있다고 말할 수 있습니다. 그런 다음 응용 프로그램이 더 많은 것을 요구하면 운영 체제에서 요청하고 운영 체제는 (일반적으로) 권한을 부여합니다. 이것에 대한 많은 구현이 있습니다 - 일부 운영 체제에서는 다른 응용 프로그램의 메모리가 멀리 떨어져서 더 큰 연속 블록을 제공하고 다른 응용 프로그램에서는 다양한 메모리 덩어리를 가져옵니다.일부 가상 메모리 처리가 관련 될 수도 있습니다. 그것의 전부는 추상적 인 구현까지. 어쨌든 메모리는 여전히 프로그램 내에서 연속적으로 처리됩니다. 운영 체제는 그 이상을 처리 할 것입니다.

가비지 수집과 관련하여 운영 체제는 경계 인 경계를 알고 있지만 내부 내용은 알고 있지 않습니다. 또한 응용 프로그램에서 사용하는 메모리를 살펴 보았더라도 범위를 벗어난 변수와 GC가 찾고있는 블록이 무엇인지 전혀 알지 못합니다.

2

가장 큰 차이점은 응용 프로그램 관리입니다. Microsoft는이를 Managed 및 Unmanaged로 구분합니다. 개체가 메모리에 할당되면 특정 주소에 저장됩니다. 이는 관리되는 응용 프로그램과 관리되지 않는 응용 프로그램 모두에 해당됩니다. 관리되는 세계에서 "주소"는 객체 핸들이나 "참조"에 래핑됩니다.

VM이 메모리를 가비지 수집 할 때 응용 프로그램을 안전하게 일시 중단하고 메모리에서 객체를 이동하고 모든 "참조"를 업데이트하여 메모리의 새 위치를 가리 키도록 할 수 있습니다.

Win32 스타일 앱에서 포인터는 포인터입니다. OS가 객체인지, 임의의 데이터 블록인지, 평범한 32 비트 값인지 등을 알 수있는 방법이 없습니다. 따라서 객체 간의 포인터에 대한 추론을 할 수 없으므로 이동할 수 없습니다 개체를 업데이트하거나 포인터를 업데이트 할 수 있습니다.

참조가 처리되기 때문에 OS는 GC 프로세스를 대신 할 수 없으며 응용 프로그램에서 사용하는 메모리를 관리하기 위해 VM에 남겨 둡니다. 이러한 이유로 VM 응용 프로그램은 OS와 완전히 동일하게 나타납니다. 그들은 단순히 사용을위한 메모리 블록을 요구하고 OS는 그것을 제공합니다. VM이 GC를 수행하고 메모리를 압축하면 다른 응용 프로그램에서 사용할 수 있도록 OS에서 메모리를 다시 확보 할 수 있습니다.

+0

당신은 내 마음을 읽었습니다! VM이 여러 앱의 메모리를 관리하는 방법을 알 수는 없었지만 OS는 그렇지 못했습니다. –

+0

왜 아래 표를 얻었습니까? 게시물에 대해 잘못된 것이 있습니까? –

+0

사람들이 다운 투표를하고 이유를 떠나지 않을 때 나는 싫어. 그것은 요구 사항이어야합니다. –

관련 문제