내가 읽고있다리눅스 프로그래밍 인터페이스.
49.9MAP_NORESERVE 및 스왑 공간 초과 할당
일부 응용 프로그램은 대규모(종종 비공개 익명) 지도를 생성하지만 매핑된 영역의 작은 부분만 사용합니다. 예를 들어, 일부 유형의 과학 응용 프로그램은 매우 큰 배열을 할당하지만 배열에서 멀리 떨어져 있는 소수의 요소(소위 희소 배열)에서만 작동합니다.
커널이 항상 전체 맵에 대해 충분한 스왑 공간을 할당(또는 예약)하면 많은 양의 스왑 공간이 낭비될 수 있습니다. 대신 커널은 실제로 필요할 때만(즉, 애플리케이션이 페이지에 액세스할 때) 매핑된 페이지에 대한 스왑 공간을 예약할 수 있습니다. 이 방법은게으른 스왑 예약, 애플리케이션에서 사용하는 총 가상 메모리가 총 RAM 크기에 스왑 공간을 더한 크기를 초과할 수 있다는 장점이 있습니다.
즉, 지연 스왑 예약으로 인해 스왑 공간이 과도하게 할당될 수 있습니다. 이 접근 방식은 모든 프로세스가 맵의 전체 범위에 액세스하려고 시도하지 않는 한 잘 작동합니다. ...
내가 아는 한, 스왑 공간은 메모리 스와핑을 위해 예약된 디스크 공간입니다. 메모리의 이러한 페이지가 비활성 상태이면 다음 페이지로 교체됩니다.스왑 공간디스크에. 이는 메모리/RAM의 L2 캐시와 같습니다.
그래서 이것은 무엇입니까?게으른 스왑 예약기구?
예를 들어 내 혼란을 보여 드리겠습니다.
일부 애플리케이션은 대규모(종종 비공개 익명) 지도를 생성합니다.
malloc
좋아, 그렇다면 큰 바이트 배열 16384(4096*4)
(대형(대개 개인 익명) 맵 생성)이 있고 배열에서 널리 분리된 몇 가지 요소에서만 작동한다고 가정해 보겠습니다 .
그러면 일부 비활성 페이지가 스왑 공간으로 스왑됩니다. 그렇죠? 메모리에 있는 다른 모든 비활성 페이지가 스왑 공간으로 스왑 된다고 가정합니다 0-4095(4096B)
.8192-12287(4096B)
4096-8191(4096B)
12288-16383(4096B)
그러면 이 문장은 무엇을 의미합니까?
대신 커널은 실제로 필요할 때만(즉, 애플리케이션이 페이지에 액세스할 때) 매핑된 페이지에 대한 스왑 공간을 예약할 수 있습니다.
이러한 비활성 페이지( 4096-8191(4096B)
및 12288-16383(4096B)
)가 계속 켜져 있지 않은 경우스왑 공간? 텍스트는 스왑 공간에 사용되는 세 번째 수준 캐시가 있음을 나타내는 것 같습니다.
memory -> swap space (disk) -> ????
답변1
스왑은 진정한 인메모리 L2 캐시가 아닙니다.메모리를 위한 여러 백업 저장소 중 하나입니다.. 커널이 물리적 메모리 페이지를 할당해야 하지만 사용 가능한 메모리가 충분하지 않은 경우 다른 페이지를 제거해야 합니다. 제거된 페이지의 내용을 삭제할 수 있거나 다른 곳에서 복구할 수 있는 경우에만 이를 수행할 수 있습니다. 다른 곳에 백업 저장소가 있습니다. 이는 디스크의 파일일 수 있습니다(예를 들어실행 파일이나 매핑된 파일의 경우) 또는 특정 스왑 영역.
교환예약초과 커밋을 추적할 때 메모리 계산이 작동합니다(표 49-4 참조).LPI). 오버커밋이 허용되지 않으면 커널은 할당 시 할당이 가능한지 여부를 결정해야 합니다. 개인용 쓰기 가능 매핑 및 공유 익명 매핑의 경우 이는 충분한 주소 공간과 충분한 스왑 공간이 있어야 함을 의미합니다(커널이 매핑된 메모리의 내용이 거기에 기록될 수 있음을 보장할 수 있으므로 매핑된 메모리에 대한 쓰기가 보장됨). 결코 ) 이 발생하지 않습니다 SIGSEGV
.
오버커밋에는 지연된 스왑 예약이 필요합니다. 이는 커널이 해당 스왑 공간을 예약하지 않고 스왑 지원 메모리 맵을 할당할 수 있음을 의미합니다. 에서 언급했듯이LPI를 사용하면 프로그램이 실제로 사용 가능한 것보다 훨씬 더 많은 메모리를 할당할 수 있으며 를 사용하여 요청해야 합니다 MAP_NORESERVE
. 그런 다음 보존은 페이지에 쓰는 동안에만 발생합니다. 이는 쓰기가 실패 SIGSEGV
하고 OOM 킬러가 개입할 수 있음을 의미합니다.
이는 16KiB 예제보다 훨씬 큰 할당에 중요합니다. 프로그램을 더 쉽게 작성할 수 있도록 희소한 64GiB, 262,144×262,144 배열을 원한다고 상상해 보십시오. 엄격한 예약을 사용하면 사용 가능한 모든 메모리가 필요하지만 엄격하게 예약하지 않으면 실제로는 쓰는 페이지만 가능합니다. 할당됩니다.
이는 모두 Linux에만 적용되며 /proc/sys/vm/overcommit_memory
선택한 시스템 오버커밋 정책과 밀접하게 관련되어 있습니다. 모드 1(항상 오버커밋) 및 2(오버커밋하지 않음)에서는 MAP_NORESERVE
아무것도 변경되지 않으며 모드 0에서만 유효합니다.
답변2
스왑 공간은 디스크의 공간입니다.
어떤 공간인가요? 가상 메모리.
커널은 각 프로세스에 필요한 가상 메모리를 쉽게 제공합니다. 그것은 게으르고 지나치게 헌신적인 부분이다. 예는 다음과 같습니다희소 과학 배열게으름을 보여주고 싶은 것은 종종 좋은 생각입니다. 전체 배열이 즉시 사용되지 않으므로 다른 프로그램을 동시에 실행할 수 있습니다.
이는 메모리/RAM의 L2 캐시와 같습니다.
그러나 대부분의 경우 "해당" 디스크보다 빠르지 않습니다(전용 스왑 장치 없음).
특히 오버커밋하는 경우에는 정반대입니다.
스와핑은 (물리적) RAM을 저장 장치용 캐시로 전환합니다.
(즉, RAM은 프로세스가 소유하고 보유하는 것이 아니지만 각 프로세스의 활성 페이지(매핑된 파일 포함)에 대한 작업 영역입니다.)
여기에 관련된 것은 RAM뿐만 아니라 스왑 공간의 과도한 사용입니다. 교환 여부에 관계없이 과도한 사용은 OOM을 유발할 수 있습니다.