이전에 사용되었지만 현재 필요하지 않은 메모리에 대해 내 프로세스에 예약 된 가상 주소 공간을 유지하려고합니다. 나는 호스트 커널이 Linux이고 커밋 된 메모리에 대한 자세한 계산을 통해 오버 커밋을 방지하도록 구성되어있는 상황에 관심이있다.mmap/mprotect-readonly 페이지가 커밋 된 메모리에 계산됩니까?
내 응용 프로그램이 더 이상 실제 메모리를 차지하지 않거나 디스크를 낭비하지 않게하려면 (자원 낭비) (madvise
) 커널을 불필요하게 만들거나 mmap
이상의 새로운 제로 페이지를 만들 수 있습니다 그것의 꼭대기. 그러나 이러한 접근 방식 중 어느 것도 커밋 된 메모리 양을 반드시 줄이지는 못하며 다른 프로세스를 사용하지 못하게됩니다.
페이지를 읽기 전용으로 표시된 제로 페이지로 교체하면 어떻게됩니까? 내 의도는 그들이 커밋 된 메모리에 포함되지 않는다는 것입니다. 그리고 나중에 mprotect
을 쓰기 가능하게 만들 수 있고, 쓰기 가능으로 만들면 커밋 된 메모리 제한을 초과하게됩니다. 내 이해가 맞습니까? 이게 효과가 있니?
읽기 전용 페이지는 프로세스의 커밋 요금에서 고려되어서는 안됩니다. (나는 참고 자료가 없으므로 답변이 아닙니다.) 그리고 Linux는 MAP_NORESERVE 플래그를 제공하여 훨씬 더 강해야합니다 보증. 하지만 저는 묻고 있습니다 : 사용하지 않는 메모리를 예약해야하는 이유는 무엇이라고 생각합니까? – Anon
Badities (tm)는 동일한 가상 주소가 프로그램이 그것을 인식하지 않고 (무작위로) 'mmap'에 의해 할당 된 경우에 발생합니다. :-)'MAP_NORESERVE'에 관해서는, 나중에 쓰기 가능하도록'mprotect' 한 후에도 페이지가 카운트되는 것을 막을지도 모른다는 걱정이 듭니다. 저는 제로 페이지를 새로 만들면 다시 쓸 수 있다고 생각합니다. –
어떤 나쁜 일이 일어날까요? 프로그램이 이전에 사용 된 주소 공간을 결코 재사용하지 않아도되는 이유는 무엇입니까? 그것은 매우 이례적인 것처럼 보입니다. – Angus