인터뷰 질문을했다 :이 루프는 몇 번 실행됩니까?
이 루프는2 gb
램과
8 gb
램에서 실행됩니다 얼마나 많은 시간
while(1)
{
void * a = malloc(1024*1024);
}
?
메모리가 가득차더라도 종료 조건이 없으므로 무한 루프가 발생했습니다. 그는 동의하지 않습니다. 나는 지금 전혀 몰라. 도와주세요.
인터뷰 질문을했다 :이 루프는 몇 번 실행됩니까?
이 루프는2 gb
램과
8 gb
램에서 실행됩니다 얼마나 많은 시간
while(1)
{
void * a = malloc(1024*1024);
}
?
메모리가 가득차더라도 종료 조건이 없으므로 무한 루프가 발생했습니다. 그는 동의하지 않습니다. 나는 지금 전혀 몰라. 도와주세요.
무한정 실행해야합니다. 대부분의 플랫폼에서 사용할 수있는 메모리가 더 이상없는 경우 malloc()
은 0을 반환하므로 할당 된 메모리 양을 변경하지 않고 루프가 계속 실행됩니다. 리눅스는 메모리 과다 약속을 허용하여 malloc()
호출이 가상 메모리에 계속 추가됩니다. malloc()
이 메모리를 관리하기 위해 사용하는 데이터가 문제를 일으키기 시작하면 (결국 코드가 사용하지 않기 때문에 할당 된 메모리 자체를 사용하려고하기 때문에) 프로세스가 OOM 킬러에 의해 종료 될 수 있습니다. 그러나 Linux 문제의 플랫폼으로 규정되어 있지 않습니다.
OOM 킬러는 메모리가 실제로 사용되는 즉시 조치에 들어갑니다. 필자가 할당되지 않은 메모리를 유지하는 한 아무 일도 일어나지 않아야한다. – glglgl
흠, 틀렸어. 1 MiB malloc 크기로 관리 데이터가 커져 결국 64 비트 시스템의 메모리를 가득 채 웁니다. 1 GiB malloc 크기를 사용하면 가상 메모리 크기가 107t로 빨라지고 (top에 따라) 프로그램이 무기한 실행됩니다. – glglgl
@glglgl : 그렇습니다.하지만 malloc()이 할당 된 것을 유지하기 위해 메모리에 쓰기를해야만하고, 그 시점에서 OOM Killer가 작동 할 수도 있습니다. –
@Nobilis 메모리가 가득 차면 malloc()은 NULL을 반환합니다. –
그리고 왜 아래로 투표 ??? –
@ H2CO3 그래, 나는 그것에 대해 생각하고 사실 malloc 호출이 NULL을 반환하고 계속 주석을 제거하므로 segfault가 보장되지는 않는다. – Nobilis