2017-03-29 13 views
2

리눅스에서 2-3GB of data into memory을 더로드하려고 시도하는 동안 out of memory (OOM)32bit binaries and 32 bit Perl의 문제가 발생했습니다.32 비트 바이너리 프로세스가 4GB를 초과 할 수없는 이유는 무엇입니까?

항상 OS with Demand Paging 기능이 상주 페이지를 디스크로 스왑하고 더 많은 페이지를로드하여 4GB 제한을 초과 할 수 없는지 궁금하십니까?

아마 페이지 폴트가 자주 발생하지만 (성능에 영향을 미칩니다) OOM 문제는 발생하지 않아야합니까?

+0

이것은 스택 오버플로에 있어야합니다. – TheValyreanGroup

+0

그들은 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366527(v=vs.85).aspx https://linux.die.net/man/2/mlock 할 수 있습니다. 프로그래머가 수동으로 창 작업을 수행해야합니다. – Vality

+0

페이징 및 주소 지정이 다릅니다. 32 비트 숫자에는 2^32 개의 가능한 값이 있습니다. 일종의 메모리 나 저장 장치에 대한 주소로 사용될 경우 32 비트 포인터로 2^32 바이트를 고유하게 식별 할 수 있습니다. 프로그램이 2^32 바이트 (4GB) 이상의 메모리를 식별 할 수 없으면 디스크, RAM, 캐시 등을 백업하는 것이 무엇이든 상관없이 프로그램에서 작동 할 수 없습니다. – Linuxios

답변

1

32 비트 프로세서는 메모리에 액세스하는 동안 32 비트 만 주소 지정할 수 있기 때문에 3GB (3 × 10243 바이트)가이 작업의 한계입니다.

+0

물론 OS 페이지 오류는 없지만 이전 페이지를 디스크로 이동하여 주소 공간을 확보 할 수 있습니까? – Shashi

+2

@Shashi 페이지 오류는 완전히 다른 주제입니다. 여기서 논의되는 문제는 32 비트를 사용하여 4GB 이상의 메모리를 처리 할 수 ​​없다는 것입니다. 예, 페이지 폴트를 할 수 있지만 이러한 여분의 메모리 위치를 제공 할 주소는 무엇입니까? 0부터 9까지의 한자리 숫자로 20 개의 봉투에 고유하게 레이블을 붙이라고 요청하는 것과 같습니다. –

0

32 비트는 논리 주소 공간의 크기를 정의합니다. 프로그램은 언제든지 최대 2 ** 32 바이트의 메모리에 액세스 할 수 있습니다.

프로세스에 사용할 수있는 실제 메모리가 2 ** 32 바이트 미만인 경우, 즉 운영 체제가 페이지를 디스크로 스왑 할 때입니다.

예전에는 주소 공간보다 더 많은 실제 메모리 (예 : 16 비트 주소 공간 및 1MB 메모리)가 있었을 때 프로세서가 주소 공간의 세그먼트 스와핑을 지원하는 것이 일반적이었습니다. 제안해라.