2010-03-03 4 views
3

Windows 운영 체제에서 스택 메모리는 스레드 관련 저장소이며 호출 스택은 일련의 메서드의 논리 흐름입니다. 그래서 각 스레드는 자신의 스택 영역을가집니다. 나는 힙 memroy 영역이 어떻게 사용되는지 알고 싶다. 스레드별로 있습니까? 프로세스 별? 또는 .NET에서 AppDomian에 특정한가요? 또는 모든 사용자 응용 프로그램과 운영 체제간에 공유됩니까? 많은 감사합니다.힙 및 스택 메모리 사용에 대한 질문

답변

3

힙은 메모리 다이내믹 할당을 구현하는 가장 일반적인 방법입니다. 힙을 사용하는 일반적인 사용 시나리오에는 런타임까지 할당 할 메모리 양을 모르는 경우 또는 원하는 메모리가 너무 커서 스택에 할당 할 수없는 경우가 포함됩니다.

프로세스는 하나 이상의 힙을 보유 할 수 있습니다. 대부분의 프로세스는 힙을 넘어서 있습니다. 예를 들어 Windows에서 프로세스는 기본 프로세스 힙, CRT 힙을 가질 수 있으며 응용 프로그램은 API 힙 (API HeapCreate 사용)을 작성하기 위해 Windows API를 호출 할 수 있습니다.

프로세스가 생성되면 OS는 Default Process Heap이라는 새로운 힙을 생성합니다.이 힙은 실제로 대부분의 경우 거의 사용되지 않습니다. new/delete와 malloc/free를 호출 할 때 우리는 실제로 CRT 힙을 사용하고 있습니다.

Windows는 메모리 할당/할당 해제 및 힙의 관리가 효율적인지 확인하기 위해 일부 정교한 데이터 구조 및 알고리즘을 사용합니다. 그러나 일반적인 사실은 힙에 메모리를 할당하는 것이 스택에 비해 훨씬 느릴 수 있다는 것입니다.

자세한 내용은 C/C++을 통해 Jeffrey Richter의 훌륭한 책 Windows를 읽어보십시오. Windows에서 내부적으로 힙을 관리하는 방법에 대한 빠른 이해를 위해 Here을 읽을 수 있습니다.

1

일부 배경 : 일반적으로 heap은 프로그램 실행 중에 동적으로 할당되는 메모리를 저장하는 데 사용됩니다. 반대로 stack의 메모리는 일반적으로 단일 함수 호출의 수명 동안 만 사용됩니다. 즉 함수가 반환되면 메모리는 더 이상 사용되지 않습니다.

각 프로세스에는 고유 한 가상 메모리 세트가 있으므로 서로 다른 프로세스에는 고유 한 힙이 있습니다.

해당 프로세스 내의 스레드는 동일한 메모리 풀 (힙)을 공유하므로 한 스레드가 다른 스레드의 메모리를 "손상"시키지 않도록주의해야합니다.

여러 AppDomains는 단일 프로세스 내에서 실행할 수 있지만 각 프로세스에는 고유 한 데이터 세트가 있으므로 자체 힙이 있습니다.

+0

에서 내 응용 프로그램을 보온하는 방법을 알고 싶어요 있다면 ... –

1

"여러 AppDomains는 단일 프로세스 내에서 실행할 수 있지만 각 프로세스에는 고유 한 데이터 세트가 있으므로 자체 힙이 있습니다."

당신은 확실히 저스틴입니다. 다른 DLL을 별도의 응용 프로그램 도메인에로드하고 실행 한 다음 주기적으로 메모리 사용량을보고하는 간단한 명령 줄 응용 프로그램을 사용해 보았습니다.

별도의 DLL에있는 코드는 점차 메모리를 소비하도록 설계되었습니다.

결과적으로 개별 응용 프로그램 도메인에서 별도의 DLL로 실행되는 스레드의 메모리 부족 예외로 전체 로트가 중단 될 때까지 콘솔 응용 프로그램은 자체 응용 프로그램 도메인에 할당 된 양을보고합니다.

이 동작은 .NET 2를 실행하는 32 비트 XP SP3 컴퓨터에서 관찰되었으며 동일한 AppDomains가 동일한 프로세스 힙을 공유하고 있음을 나타냅니다.

다른 사람이 아니라 경험, 나는 그들이 질문에 중요하지 않기 때문에 내 대답의 실제 메모리 제한을 제거 유독 DLL을