이는 32비트 바이너리를 사용하고(...여전히 사용해야 함) 4G 제한을 고려하는 시스템에 유용한 기능입니다.
이는 본질적으로 32비트 사용자 공간 코드, 32비트 사용자 공간 데이터 및 (PAE의 경우 32비트 또는 64비트) 커널이 다음 위치에 있음을 의미합니다.다른주소 공간은 본질적으로 프로세스가 데이터를 저장하기 위해 가능한 최대 4G 주소 공간을 거의 모두 사용할 수 있도록 해줍니다.
일부를 제외하고고대 발표, 안타깝게도 더 이상 찾을 수 없습니다.
2.5.74 Linux 커널용 "4GB/4GB VM 분할" 패치의 첫 번째 공개 릴리스를 발표하게 된 것을 기쁘게 생각합니다.
http://redhat.com/~mingo/4g-patches/4g-2.5.74-F8
4G/4G 분할 기능은 주로 더 많은 코어/사용자 VM을 원하거나 확보해야 하는 대용량 RAM x86 시스템을 위한 것이지만 시스템 호출당 TLB 플러시 오버헤드가 발생합니다.
우리 모두 알고 있듯이 x86에서는 총 가상 메모리 양이 4GB로 제한됩니다. 총 4GB VM 중 3GB는 사용자 공간(0x00000000-0xbffffffff)에 사용되고 1GB는 커널(0xc0000000-0xffffffff)에 사용됩니다. 이 VM 구성표를 3/1 분할이라고 합니다. 이 분할은 RAM이 1GB에 도달할 때까지 잘 작동합니다. "highmem"이 다양한 대형 캐시(및 개체)를 높은 메모리 영역으로 이동하기 때문에 1GB RAM 이전에도 잘 작동합니다.
테스트에서 일부 프로세스가 2~3GB 정도에서 충돌이 발생하기 시작했습니다.
어떻게 해야 하나요? 저는 비교적 새로운 커널(4.10)을 사용하고 있습니다. 32비트 사용자 공간에서 64비트 커널을 사용하거나 32비트 PAE 커널을 사용할 수 있습니다.
일부 프로세스만 4G/4G를 사용했다면 충분하겠지만, 꼭 필요한 것 같습니다.
답변1
64비트 커널에는 이미 32비트 사용자 공간 프로그램에 액세스할 수 있는 전체 4G 공간이 있습니다. 터미널에 다음을 입력하여 직접 확인하십시오(경고: 이 명령을 실행할 때 시스템에 사용 가능한 4GiB RAM이 없으면 시스템이 응답하지 않을 수 있음).
cd /tmp
cat > test.c <<"EOF"
#include <stdlib.h>
#include <stdio.h>
int main()
{
size_t allocated=0;
while(1)
{
const size_t chunkSize=4096;
char* p=malloc(chunkSize);
if(!p) return 0;
*p=1;
allocated+=chunkSize;
printf("%zu\n",allocated);
}
return 0;
}
EOF
gcc test.c -o test -m32 && ./test | tail -n1
내 x86_64 커널 3.12.18에서는 약 4GiB~12.3MiB를 얻었 4282097664
으므로 4G/xG 분할 구현을 고려하는 것이 합리적입니다.