문제

나는에 대해 읽고의 메모리 조건에서 리눅스,및 다음과 같은 절에서 남자 페이지가 나를 생각하고 있어요:

기본적으로 리눅스는 다음과 같이 낙관적 메모리 할당은 전략이다.즉 malloc()returns NULL 이 아니라는 보장은 없는 메모리가 정말로 사용할 수 있습니다.이것은 정말 나쁜 버그입니다.는 경우에는 것이 밝혀졌어 시스템의 메모리,하나 이상의 프로세스에 의해 죽을 것입 악명 높은 OOM 살인자입니다.[...]

을 고려하는 운영자는 새로운 구현 끝날 것 호출하는 malloc 에서 어떤 시점이 있습을 보장하는 새로운 것입니다 실제로 리눅스에서 던져?되어 있지 않은 경우,어떻게 하나 손잡이 이것은 분명히 탐지 오류 상황입니까?

도움이 되었습니까?

해결책

때에 따라 다르지; 커널의 오버 커미트 설정을 구성 할 수 있습니다 vm.overcommit_memory 사용.

Herb Sutter는 몇 년 전에 어떻게 논의했습니다 이 동작은 실제로 C ++ 표준에 부합되지 않습니다.:

"구체적으로 Linux를 포함한 일부 운영 체제에서 메모리 할당은 항상 성공합니다. 전체 중지. 요청 된 메모리를 실제로 사용할 수 없을 때에도 할당은 어떻게 항상 성공할 수 있습니까? 이유는 할당 자체가 메모리 요청을 기록하기 때문입니다. 표지 아래에서 (물리적 또는 가상) 메모리는 메모리가 실제로 사용될 때까지 실제 백업 저장소와 함께 요청 프로세스에 실제로 최선을 다하지 않습니다.

"신규가 운영 체제의 시설을 직접 사용한다면, 새로운 새로운 성공은 항상 성공할 것이지만 BUF [100] = 'C'; 표준 C ++ 관점에서 던지거나 실패하거나 중단 할 수 있습니다. C ++ 표준은 New가 충분한 메모리를 커밋 할 수없는 경우 실패해야하며 (이것은 실패하지 않아야 함) BUF [100] = 'C'와 같은 코드가 예외를 던지지 않아야하거나 실패하지 않아야하기 때문에 부정하지 않습니다. 할 것 같다)."

다른 팁

당신은 처리할 수 없습니다 그것은 소프트웨어에서 순수하고 간단합니다.

응용 프로그램을 받을 것이 완벽하게 유효한 포인터이다.면 당신은에 액세스하려고 그것은,그것이 생성한 페이지에 오류 커널,커널을 시도를 할당하는 물리적인 페이지에 그것을 위해할 수 없는 경우에는...붐이다.

그러나 당신이 볼 때,이 모든 일어나는 커널 내에서,귀하의 응용 프로그램을 볼 수 없습니다.는 경우 그것은 중요한 시스템을 비활성화할 수 있는 오버 커밋 alltogether 에서 시스템입니다.

나는 malloc이 여전히 null을 반환 할 수 있다고 생각합니다. 이유는 사용 가능한 시스템 메모리 (RAM + SWAP)와 프로세스 주소 공간의 금액이 차이가 있기 때문입니다.

예를 들어, 표준 X86 Linux의 Malloc에서 3GB 메모리를 요청하면 사용자 공간 앱에 주어진 메모리의 양이 주어지면 불가능하기 때문에 반드시 NULL을 반환합니다.

내가 틀렸다면 용서해주십시오. 그러나 할당 된 메모리를 제로로 만들려고하지 않으려 고하지 않겠습니까? 아니면 마지막 바이트에 글을 쓰는 것조차도 기억이 실제로 당신의 것이 아니라면 예외가 발생합니까?

그것이 사실이라면, 당신은 기억의 마지막 (그리고 먼저) 바이트에 글을 쓰고 그것이 잘 작동하는지, 그리고 그것이 malloc에서 null을 반환 할 수 있는지 확인할 수 있습니다.

그렇습니다. 새로운 것이 결국 던질 것이라는 보장이 있습니다. 오버 커미트에 관계없이 주소 공간의 양은 제한됩니다. 따라서 메모리를 계속 할당하면 조만간 주소 공간이 부족하고 새로 새로워 질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top