2010-03-13 2 views
44

커밋되기 전에 메모리를 예약해야한다는 것을 알고 있습니다. 예약되어 있으면 다른 프로세스에서 사용할 수 없습니다. 그러나 예약 된 메모리는 사용 가능한 RAM에 포함되지 않습니다. 하지만 그렇지 않아야합니까? 왜냐하면 아무도 그것을 사용할 수 없으면 "사용 가능"하다는 것이 무슨 소용입니까?예약 된 메모리와 커밋 된 메모리의 차이점은 무엇입니까?

또는 더 큰 차이가 있습니까?

+0

"예약 됨"의 정의를 어디에서 찾을 수 있습니까? –

+0

http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx – glutz78

+3

PDC 10에서 Mark Russinovich의 프레젠테이션을 확인하십시오. 'PDC10 : Windows 메모리 관리의 신비 : 하나.' 그는 이것에 대해 광범위하게 이야기합니다. http://player.microsoftpdc.com – NigelTufnel

답변

44

Win32의 컨텍스트에서 "예약 됨"은 주소 공간이을 요청한 프로세스 내에서 으로 할당됨을 의미합니다. 예를 들어, 즉시 필요한 것은 아닌 커다란 버퍼를위한 공간을 예약하는 데 사용할 수 있습니다. 그러나 필요한 경우에는 연속적이어야합니다.

예약 메모리는 각 프로세스가 고유 한 개인 주소 공간을 가지고 있기 때문에 다른 프로세스와 전혀 상호 작용하지 않습니다. 따라서 프로세스가 다른 프로세스의 주소 공간에 정상적으로 메모리를 할당 할 수 없기 때문에 "예약 된 경우 다른 프로세스에서 사용할 수 없습니다"라는 문장은 의미가 없습니다.

예약 된 페이지가 커밋되도록 요청 된 경우 (해당 배킹 저장소가 할당 된 경우) 물리적 메모리가 부족하거나 페이지 파일로 인해 작업이 실패 할 수 있습니다.

+1

"그들에게 할당 된 백업 저장소": 캐시에만 저장되는 데이터를 예약이라고하고 RAM 또는 페이지 파일에 기록 할 때 커밋이라고 할 때를 의미합니까? – idbrii

+7

@pydave : 아니요, "cache"및 "reserved"는 서로 관련이없는 개념입니다. 메모리를 예약하는 것은 나중에 주택을 포함 할 땅을 요구하는 부동산 개발업자와 비슷합니다. 아직 아무 것도 없지만 아무도 집을 짓지 못합니다. 실제로 집을 짓고 전기 및 하수도와 같은 기반 시설을 설치하는 것입니다. 반면에 캐시는 CPU를 빠르게 실행하고 모든 데이터가 RAM의 어딘가에 저장되도록 최적화되었습니다. –

+1

메모리 페이지에 데이터를 쓰면 해당 페이지가 커밋됩니까? (예약 된 것과 커밋 된 것의 차이점은 예약 된 것이 할당되었지만 커밋 된 것이 사용되었음을 의미합니다.) – idbrii

4

프로세스 가상 메모리 (주소 공간)와 실제 RAM은 모두 다릅니다. 512MB의 물리적 RAM을 가질 수는 있지만 여전히 프로세스가 4GB의 가상 주소 공간 (2GB 사용자 공간)을 처리 할 수 ​​있습니다. 프로세스의 모든 주소는 주어진 시간에 free, reserved 또는 committed로 간주 될 수 있습니다.

프로세스는 또는 최선을 다하고 예약으로는 처음 할당해야합니다, 그들은 메모리에 를 범하거나 사용할 수있는 무료 주소 use.Before 미래를 위해 예약 자유롭게 의미 모든 주소를 무료로 시작합니다. 그러나 그것이 커밋되기 위해 예약 될 필요는 없습니다.

예약 메모리는 장래의 목적을 위해 virtaul 주소 공간을 예약하는 것을 의미합니다. 실제 RAM (RAM 주소에 매핑 됨)과 관련이 없습니다. 커밋 된 메모리는 실제 RAM과 연결되므로 데이터를 저장할 수 있음을 의미합니다.

http://msdn.microsoft.com/en-us/library/ms810627.aspx

+2

퀴블 : 가상 메모리는 커밋되기 전에 별도의 단계로 예약 할 필요가 없습니다. VirtualAlloc은 하나의 호출로 예약하고 커밋 할 수 있습니다. 그러나 "준비금"은 완료되어야합니다. 또한 커밋은 실제로 RAM을 "할당"하지 않습니다. 후속 페이지 오류 만 수행합니다. 나는 (그것은)? "관련 될 수있다"라고 편집하여 "관련 될 수있다". 또한 다음 문장을 추가합니다. "실제 RAM은 커미트 된 영역에 액세스 할 때까지 할당되지 않으며 페이지 단위로 완료됩니다." 그리고 다른 한 가지 : 빈 페이지를 사용하는 또 다른 방법은 매핑 된 메모리를 사용하는 것입니다. –

7

은 내가 주소 공간을 예약으로 다른 사람이 그것을 할당 할 수 있습니다 (하지만 아직 사용할 수 없기 때문에 나는 그 주소의 메모리를 사용할 수 없습니다) 그래서 Reserved을 볼 것을 좋아합니다. 그리고 Committed으로 매핑하여 주소 공간이 실제 메모리이되도록 사용할 수 있도록으로 매핑하십시오.

을 예약하려는 이유는입니까? 왜 헌신적 인 기억을 가지지 않는 것일까 요? 이 내가 생각하고있는 몇 가지 이유가 있습니다 :

일부 응용 프로그램이 특정 주소 범위를 필요로
  1. 는 0x400000에서 0x600000에게 말한다,하지만 아무것도 저장하기위한 메모리를 필요로하지 않는다. 메모리 액세스를 트랩하는 데 사용됩니다. 예 : 일부 코드가 해당 영역에 액세스하면 잡힐 것입니다. (어떤 이유로 유용합니다.)

  2. 일부 스레드는 점진적으로 확장되는 데이터를 저장해야합니다. 그리고 데이터는 하나의 인접한 메모리 덩어리에 있어야합니다. 한 번에 많은 물리적 메모리를 사용하지 않는 것이 좋으며, 필요하지 않으며 낭비가 될 수 있습니다. 메모리는 다른 스레드에서 먼저 사용할 수 있습니다.물리적 메모리는 필요할 때만 커밋됩니다.