2017-12-12 15 views
0

많은 양을 할당합니다. 적어도 리눅스에서.실패는 당신이 <code>malloc()</code>를 사용하여 RAM에서 사용할 수있는 것보다 더 많은 바이트를 할당하려고 할 때, 그것은 가상 메모리를 할당하는 읽기 가상 메모리

나는 가상 메모리의 엄청난 금액을 할당 할 100 GB의 말을 할 수 있습니다. 그래서 다음과 같이 썼습니다 :

void* virtual_memory = malloc(100 gb int); 

그러나 반환 된 포인터는 NULL입니다.

이 코드는 64 비트 Ubuntu 가상 컴퓨터에서 실행됩니다.

내가 뭘 잘못하고 있니?

편집 내가 달성하기 위해 노력하고있어 내 프로세스 VIRT 열에 1백기가바이트를 표시 htop 도구를 만드는 것입니다.

내가 malloc을 호출 할 수 있습니다 UPDATE가 한 번에 2GB의 할당 50 회

+2

스왑 영역의 크기는 얼마나됩니까? 어쩌면 관련이 있습니다 : https://stackoverflow.com/a/11198816/7926064 – BNT

+4

그리고 시스템에 * 100 기가 바이트 이상의 가상 메모리가 있습니까? [free 명령 (http://man7.org/linux/man-pages/man1/free.1.html)은 무엇을보고합니까? 아마도 가상 메모리가 어떻게 작동하는지 오해하고 있습니까? –

+1

위의 설명 외에도'gb '는 무엇입니까? 나쁜 정의로 코드를 깨는 방법을 상상할 수 있습니다. 실제로'int'라는 코드를 사용하여 코드를 컴파일 할 수있게 해주는 정의가 나오기가 어렵습니다. – Yunnosch

답변

2

나는 당신의 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); 
+0

예, 항상 가상 메모리를 할당합니다. 내 잘못이야. 커밋하지 않고 메모리를 확보하는 것은 내가 필요한 것처럼 보입니다. 나는 그것을 밖으로 시도 할 것이다. 감사! – Lingviston

+0

Linux는 항상 커밋하지 않고 메모리를 예약합니다. 리눅스에서'malloc'을 호출 할 때, 실제 메모리는 할당 할 때까지 할당되지 않습니다. 실패한 경우 프로세스 별 또는 시스템 별 제한이 있기 때문에 발생합니다. – JeremyP

+0

@JeremyP 어떻게 이러한 제한을 제거 할 수 있습니까? 가상 머신에 우분투 17.04 64 비트를 새로 설치했습니다. – Lingviston

0

다음 코드는 나를 위해 일을 : int_pow 정수를 운영하고 단지 사용자 정의 pow 구현입니다

for (int i = 0; i < 50; ++i) { 
    malloc(int_pow(2, 31)); 
} 

. 이 응용 프로그램을 실행 한 후 htop 도구는 정확히 100GB의 가상 메모리를 사용함을 보여줍니다.