예상보다 작은 최대 malloc 크기

Irbis

다음은 최대 malloc 크기를 확인하는 간단한 프로그램입니다.

#include <iostream>

std::size_t maxDataSize = 2097152000; //2000mb

void MallocTest(void*& ptr)
{
    while (1)
    {
        ptr = malloc(maxDataSize);

        if (ptr)
        {
            std::cout << "Malloc success: " << maxDataSize << std::endl;
            return;
        }

        maxDataSize -= 1024;

        if (maxDataSize <= 0)
        {
            return;
        }           
    }
}

int main()
{
    void* ptr = nullptr;
    MallocTest(ptr);
    if (ptr)
    {
        free(ptr);
    }
    system("pause");
    return EXIT_SUCCESS;
}

Windows 10 x64 및 Visual Studio 2017을 사용합니다. 해당 프로그램을 실행하면 ~ 1300mb에 대한 malloc 호출이 성공적으로 수행됩니다. 이 프로그램은 32 비트 아키텍처 (릴리스 모드)를 사용하여 빌드되었으므로 이론적으로 메모리 제한은 2GB입니다. 메모리 조각화를 일으키는 원인이 있습니까? 1300MB 이상을 할당 할 수없는 이유는 무엇입니까?

R .. GitHub 얼음을 돕는 중지

참고 :이 답변의 대부분은 OP가 사용중인 OS를 표시하기 전에 작성되었습니다. 개념은 여전히 ​​유효하지만 세부 사항은 다를 수 있습니다.

당신은 당신의 OS가 32 비트이고 실제로 좋은 32 비트 구현은 2GB의 하드 제한을 가질 것이라고 말했습니다. 왜냐하면 개체 PTRDIFF_MAX가 많은 미묘한 문제를 가지고 있기 때문입니다 . 둘 다 사용시 쉽게 정의되지 않은 동작을 일으키고 컴파일러 버그를 유발하기 때문입니다. 포인터 산술 처리. 그러나 당신은 더 낮은 제한 요소에 도달했습니다.

Linux에서 32 비트 프로세스에 대한 가상 주소 공간 제한은 대부분의 아치에서 3GB, 일부에서 2GB, 32 비트 프로세스가 64 비트 커널에서 실행중인 경우 전체 4GB입니다. 그러나이 공간 에는 주소 공간 조각화 하고 연속 범위의 길이를 제한 하는 여러 항목이 이미 매핑되어 있습니다. 여기에는 프로그램 자체가 포함되며 동적 연결 인 경우 동적 링커 및 사용중인 공유 라이브러리가 포함됩니다.

프로그램이 PIE (위치 독립적 실행 파일)로 빌드되지 않은 경우 Linux / x86에서 기본 주소는 128MB입니다. 이로 인해 주소 공간의 처음 128MB가 연속 상단 부분과 함께 사용할 수없는 것으로 분할됩니다. 라이브러리는 일반적으로 상위 주소 공간 제한 바로 아래에로드되어 그 끝에서 일부를 분리하지만 너무 많지는 않습니다. ASLR (주소 공간 레이아웃 무작위 화) 그것들을 약간 아래로 이동시킬 수 있지만, 메인 라인 커널은 이미 매우 제한된 주소 공간을 심하게 조각화하는 것을 피하기 위해 그렇게 많이하지 않습니다. 추가 강화를 위해 패치 된 일부 커널은 훨씬 더 무작위 화 될 수 있습니다.

궁극적으로 32 비트 시스템에서는 대규모 연속 할당 (반 GB 이상, 그 이하일 수 있음)을 안정적으로 사용할 수 없습니다. 필요한 경우 64 비트 시스템을 사용해야합니다. 그러나 더 나은 선택은 연속 할당이 필요하지 않거나 메모리에 맞지 않는 데이터로 작동 할 수있는 대체 데이터 구조를 찾는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

예상보다 작은 Clonezilla 이미지 크기

분류에서Dev

예상보다 작은 Clonezilla 이미지 크기

분류에서Dev

예상보다 작은 Clonezilla 이미지 크기

분류에서Dev

기본 너비가 최대 화면 크기보다 작은 이미지에 대한 반응 기본의 width = '100 %'

분류에서Dev

예상보다 낮은 최대 프로세서 속도

분류에서Dev

오류 : 목록의 최대 색인이 목록 크기보다 작은 지 확인하십시오.

분류에서Dev

Perl 배열 크기가 예상보다 작습니다.

분류에서Dev

char 배열의 최대 크기를 알 때 malloc 사용

분류에서Dev

전보 링크가 예상대로 작동하지 않습니다.

분류에서Dev

체크 박스가 예상대로 작동하지 않는 Android 목록보기

분류에서Dev

Xcode : malloc 크기는 중요하지 않은 것 같습니다.

분류에서Dev

주어진 한계보다 크지 않은 크기를 가진 최대 가중치를 가진 노드 찾기

분류에서Dev

최대 분석 기능과 창 정렬 순서가 예상대로 작동하지 않습니다.

분류에서Dev

Debian RAID 드라이브 크기가 예상보다 작습니다.

분류에서Dev

WPF Borderless 창은 기본 화면 크기로만 최대화됩니다.

분류에서Dev

스파크 폭발 기능이 예상대로 작동하지 않습니다.

분류에서Dev

img srcset 및 크기가 예상대로 작동하지 않습니다.

분류에서Dev

선택기에 너무 작은 대화 상자 크기

분류에서Dev

크기가 다른 이중 채널 램 및 예상보다 낮은 주파수

분류에서Dev

autoresizingMask가 UITableView.tableHeaderView의 하위보기에 대해 예상대로 작동하지 않습니다.

분류에서Dev

최대 풀 크기를 변경하면 SQL Server를 다시 시작합니까?

분류에서Dev

Imagemagick 최대 색상 및 크기 조정

분류에서Dev

UIView 사용자 지정에 하위보기 추가가 예상대로 작동하지 않습니다.

분류에서Dev

R의 다른 열 값보다 작거나 같은 목록 열에서 최대 값 찾기

분류에서Dev

크기 유효성 검사 최대 값은 {javax.validation.constraints.Size.message}입니다.

분류에서Dev

malloc 및 free 사용 : 유효하지 않은 다음 크기 오류

분류에서Dev

배열에서 최소 및 최대 수 찾기, 최소값은 항상 0

분류에서Dev

스택보기 (및 / 또는 콘텐츠보기)가 포함 된 스크롤보기가 예상대로 작동하지 않음

분류에서Dev

최대 힙 크기보다 더 많은 메모리를 사용하는 Java 프로세스

Related 관련 기사

  1. 1

    예상보다 작은 Clonezilla 이미지 크기

  2. 2

    예상보다 작은 Clonezilla 이미지 크기

  3. 3

    예상보다 작은 Clonezilla 이미지 크기

  4. 4

    기본 너비가 최대 화면 크기보다 작은 이미지에 대한 반응 기본의 width = '100 %'

  5. 5

    예상보다 낮은 최대 프로세서 속도

  6. 6

    오류 : 목록의 최대 색인이 목록 크기보다 작은 지 확인하십시오.

  7. 7

    Perl 배열 크기가 예상보다 작습니다.

  8. 8

    char 배열의 최대 크기를 알 때 malloc 사용

  9. 9

    전보 링크가 예상대로 작동하지 않습니다.

  10. 10

    체크 박스가 예상대로 작동하지 않는 Android 목록보기

  11. 11

    Xcode : malloc 크기는 중요하지 않은 것 같습니다.

  12. 12

    주어진 한계보다 크지 않은 크기를 가진 최대 가중치를 가진 노드 찾기

  13. 13

    최대 분석 기능과 창 정렬 순서가 예상대로 작동하지 않습니다.

  14. 14

    Debian RAID 드라이브 크기가 예상보다 작습니다.

  15. 15

    WPF Borderless 창은 기본 화면 크기로만 최대화됩니다.

  16. 16

    스파크 폭발 기능이 예상대로 작동하지 않습니다.

  17. 17

    img srcset 및 크기가 예상대로 작동하지 않습니다.

  18. 18

    선택기에 너무 작은 대화 상자 크기

  19. 19

    크기가 다른 이중 채널 램 및 예상보다 낮은 주파수

  20. 20

    autoresizingMask가 UITableView.tableHeaderView의 하위보기에 대해 예상대로 작동하지 않습니다.

  21. 21

    최대 풀 크기를 변경하면 SQL Server를 다시 시작합니까?

  22. 22

    Imagemagick 최대 색상 및 크기 조정

  23. 23

    UIView 사용자 지정에 하위보기 추가가 예상대로 작동하지 않습니다.

  24. 24

    R의 다른 열 값보다 작거나 같은 목록 열에서 최대 값 찾기

  25. 25

    크기 유효성 검사 최대 값은 {javax.validation.constraints.Size.message}입니다.

  26. 26

    malloc 및 free 사용 : 유효하지 않은 다음 크기 오류

  27. 27

    배열에서 최소 및 최대 수 찾기, 최소값은 항상 0

  28. 28

    스택보기 (및 / 또는 콘텐츠보기)가 포함 된 스크롤보기가 예상대로 작동하지 않음

  29. 29

    최대 힙 크기보다 더 많은 메모리를 사용하는 Java 프로세스

뜨겁다태그

보관