애플리케이션이 메모리를 명시적으로 커밋 및 커밋 해제할 수 있나요?

애플리케이션이 메모리를 명시적으로 커밋 및 커밋 해제할 수 있나요?

애플리케이션에서 메모리 페이지 커밋을 명시적으로 제어하는 ​​것이 가능합니까? 몇 년 전 Windows 앱에서 무작위로 매달려 있는 참조/힙 손상 버그를 찾는 데 도움이 되는 "경보 시스템" 힙 관리자를 작성했습니다. 넓은 가상 메모리 영역을 예약한 다음 마음대로 페이지를 커밋/커밋 해제할 수 있었습니다. 당시 아이디어는 커밋되지 않은 페이지, 하나 이상의 커밋된 페이지(요청을 채우기에 충분함), 커밋되지 않은 다른 페이지가 포함된 세트를 만드는 것이었습니다. 호출자에게 반환된 포인터가 커밋된 영역의 시작 부분인지 끝 부분인지를 제어하는 ​​컴파일 타임 플래그를 사용합니다(각각 언더라이트 또는 덮어쓰기 시 예외를 즉시 발생시키기 위해). Windows는 메모리 영역을 예약하고 페이지를 커밋하기 위한 API를 제공합니다. 나는 내가 작성하고 있는 Linux 프로그램에서 이러한 북엔드 버퍼에 대한 또 다른 용도를 갖고 있는데, 커널이 동일한 종류의 기능을 제공하는지 궁금합니다.

답변1

나는 당신이 말하는 것을 이해합니다VirtualAlloc그리고친구. 내가 아는 한 Linux에는 직접적으로 동등한 것이 없지만 다양한 방법으로 동일한 효과를 얻을 수 있습니다. 메모리를 예약하려면 다음을 사용할 수 있습니다.mmap(2); 커밋하려면 직접 작성해야 합니다. 커밋을 해제하려면 다음을 사용할 수 있습니다.madvise(2)MADV_DONTNEED.

가드 페이지를 구현하려면 다음을 찾을 수 있습니다.mprotect(2)핸들러 와 함께 더 나은 옵션이 될 수 있습니다 SIGSEGV. 또한 컴파일러에서 제공하는 오버플로 방지( -fstack-protector등 및 다양한 -fsanitize옵션)를 살펴볼 수도 있습니다.

답변2

복잡한 메모리 관리자를 구현하는 것보다 단순히 자신의 프로그램을 디버깅하고 싶다면 다음과 같은 프로그램을 사용하는 것이 좋습니다.발그린드메모리 누수 및 매달린 포인터를 감지합니다.

관련 정보