2010-12-01 4 views
8

이전에 사용되었지만 현재 필요하지 않은 메모리에 대해 내 프로세스에 예약 된 가상 주소 공간을 유지하려고합니다. 나는 호스트 커널이 Linux이고 커밋 된 메모리에 대한 자세한 계산을 통해 오버 커밋을 방지하도록 구성되어있는 상황에 관심이있다.mmap/mprotect-readonly 페이지가 커밋 된 메모리에 계산됩니까?

내 응용 프로그램이 더 이상 실제 메모리를 차지하지 않거나 디스크를 낭비하지 않게하려면 (자원 낭비) (madvise) 커널을 불필요하게 만들거나 mmap 이상의 새로운 제로 페이지를 만들 수 있습니다 그것의 꼭대기. 그러나 이러한 접근 방식 중 어느 것도 커밋 된 메모리 양을 반드시 줄이지는 못하며 다른 프로세스를 사용하지 못하게됩니다.

페이지를 읽기 전용으로 표시된 제로 페이지로 교체하면 어떻게됩니까? 내 의도는 그들이 커밋 된 메모리에 포함되지 않는다는 것입니다. 그리고 나중에 mprotect을 쓰기 가능하게 만들 수 있고, 쓰기 가능으로 만들면 커밋 된 메모리 제한을 초과하게됩니다. 내 이해가 맞습니까? 이게 효과가 있니?

+1

읽기 전용 페이지는 프로세스의 커밋 요금에서 고려되어서는 안됩니다. (나는 참고 자료가 없으므로 답변이 아닙니다.) 그리고 Linux는 MAP_NORESERVE 플래그를 제공하여 훨씬 더 강해야합니다 보증. 하지만 저는 묻고 있습니다 : 사용하지 않는 메모리를 예약해야하는 이유는 무엇이라고 생각합니까? – Anon

+0

Badities (tm)는 동일한 가상 주소가 프로그램이 그것을 인식하지 않고 (무작위로) 'mmap'에 의해 할당 된 경우에 발생합니다. :-)'MAP_NORESERVE'에 관해서는, 나중에 쓰기 가능하도록'mprotect' 한 후에도 페이지가 카운트되는 것을 막을지도 모른다는 걱정이 듭니다. 저는 제로 페이지를 새로 만들면 다시 쓸 수 있다고 생각합니다. –

+0

어떤 나쁜 일이 일어날까요? 프로그램이 이전에 사용 된 주소 공간을 결코 재사용하지 않아도되는 이유는 무엇입니까? 그것은 매우 이례적인 것처럼 보입니다. – Angus

답변

1

페이지를 사용하고 있지 않다면 (읽거나 쓰는) 페이지는 귀하의 주소 공간 (예약 됨)으로 커밋되지 않습니다.

주소 공간이 제한되어 있으므로 원하는대로 재생할 수 없습니다.

예를 들어 "nul page/guard page"(액세스 할 수없는 익명 메모리)가 삽입되어 많은 수의 할당에 실패 할 수있는 ElectricFence를 참조하십시오. ") mprotect가 (실패 : 메모리를 할당 할 수 없습니다" 다음 스레드에서보세요 리눅스에서 오버 커밋을 가정하는 것은 불가능되지 않았습니다 http://thread.gmane.org/gmane.comp.lib.glibc.user/538/focus=976052

+3

* *는 가상 크기로 청구되지만 RSS에는 청구되지 않습니다. –

1

, 당신은 페이지 수 있도록 할, mmapMAP_NORESERVE 플래그를 사용할 수 있습니다 해당 메모리에 액세스하기 전에 할당 된 메모리로 간주되지 않습니다. 오버 커밋이 완전히 비활성화 된 경우 아래에서 다중 매핑 페이지를 참조하십시오.

제로 페이지에 대한 Linux의 동작이 과거에는 때때로 변경되었습니다. 일부 커널 버전에서는 페이지를 읽는 것만으로 할당 할 수 있습니다. 다른 사람들과 함께 쓰기가 필요합니다. 보호 플래그가 직접 할당을 유발하지는 않습니다. 그러나 실수로 할당을 실행하는 것을 방지 할 수 있습니다. 따라서 가장 신뢰할 수있는 결과를 얻으려면 을 PROT_NONE으로 보내서 페이지에 전혀 액세스하지 않아야합니다.

또 다른 휴대용 옵션으로 동일한 페이지을 여러 위치에 매핑 할 수 있습니다. 즉, 빈 임시 파일을 만들고 열어서 합리적인 페이지 수로 ftruncate을 연결 한 다음 mmap을 오프셋 0으로 반복하여 파일에 연결합니다. 이것은 메모리가 프로그램의 메모리 사용량에 대해 한 번만 계산된다는 것을 절대적으로 보장합니다. 심지어 페이지에 쓸 때 MAP_PRIVATE을 사용하여 자동으로 다시 할당 할 수도 있습니다.

이 방법은 MAP_NORESERVE 기술 (커널 추적 데이터와 임시 파일 자체 페이지 모두)보다 메모리 사용량이 많을 수 있으므로 사용 가능한 경우 MAP_NORESERVE을 사용하는 것이 좋습니다. 이 기술을 사용하는 경우, 맵핑되는 영역을 상당히 크도록 만드십시오 (실제 디스크 입출력을 피하기 위해 Linux의 경우 /dev/shm에 넣으십시오). 각 개별 mmap 호출은 특정 양의 (교체 할 수없는) 커널 메모리를 사용하여이를 추적하므로 추적 횟수를 줄이는 것이 좋습니다.

+1

전반적으로 유용한 정보이지만'MAP_NORESERVE'는 유용하지 않습니다. 오버 커밋이 완전히 비활성화되면 무시됩니다. –

+0

'/ dev/zero' 매핑은 제안서의 임시 파일뿐만 아니라 작동 할 것이라고 생각합니까? –

+0

@ Zan, no. '/ dev/zero' 맵은 일반적인'MAP_ANON' 맵과 같기 때문에 다른 메모리 할당처럼 설명 될 것입니다. – bdonlan