나는 당신의 malloc()를 사용하여 RAM에서 사용할 수있는 것보다 더 많은 바이트를 할당하려고 할 때, 그것은 가상 메모리를 할당하는 읽기
처음에는 올바르지 않습니다. 항상 가상 메모리를 할당하십시오. 이 가상 메모리는 실제 메모리 (RAM) 또는 스왑 공간의 일부 영역에 매핑됩니다. 스왑 공간 + 실제 메모리가 100GB 미만이면 할당이 실패합니다. 또한 libc
구현에 일부 (프로그래밍 가능한) 제한이 설정되어있는 경우 그러한 많은 양을 할당하지 못할 수도 있습니다.
는하지만 난 htop 도구에서 프로세스에 대한 가상 메모리의 100기가바이트을 표시하는 이상한 일이있다. 그리고 그것은 단일 코드 라인을 통해 달성 가능하다고 주장됩니다. 그냥이 정도의 가상 메모리를 필요로하는 경우
예, 메모리를 예약하지만 커밋 수 없습니다. mmap
(* NIX) 또는 VirtualAlloc
(Windows)을 동일한 용도로 사용하는 방법을 읽을 수 있습니다. 특정 가상 주소 범위를 예약하면
, 당신은 당신이이 범위를 사용하려는 운영 체제를 말해, 그래서 다른 코드는 사용할 수 없습니다. 하지만 실제로 사용할 수있는 것은 아닙니다. 이것은 또한 RAM/스왑 백킹이 필요 없다는 것을 의미합니다. 따라서 임의의 많은 양 (물론 64 비트 시스템에서 2^48 바이트 미만)을 예약 할 수 있습니다.
htop
에 표시되는 값에 해당 값이 포함되는지 확실하지 않지만이를 시험해 봐야합니다.
실제로 가상 메모리 수가 증가하지 않으면 익명으로 매핑하는 대신 파일에 매핑 할 수 있습니다. 이렇게하면 시스템에 100GB의 파일이 생성 될 수 있지만 (많은 공간이 있다고 가정), 파일을 읽고 쓸 수 있어야합니다.
다음 코드는 리눅스에서 사용할 수 있습니다 -
int fd = open("temp.txt", O_RDWR | O_CREAT);
void* addr = mmap(NULL, 100 * GBS, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0);
스왑 영역의 크기는 얼마나됩니까? 어쩌면 관련이 있습니다 : https://stackoverflow.com/a/11198816/7926064 – BNT
그리고 시스템에 * 100 기가 바이트 이상의 가상 메모리가 있습니까? [free 명령 (http://man7.org/linux/man-pages/man1/free.1.html)은 무엇을보고합니까? 아마도 가상 메모리가 어떻게 작동하는지 오해하고 있습니까? –
위의 설명 외에도'gb '는 무엇입니까? 나쁜 정의로 코드를 깨는 방법을 상상할 수 있습니다. 실제로'int'라는 코드를 사용하여 코드를 컴파일 할 수있게 해주는 정의가 나오기가 어렵습니다. – Yunnosch