Linux의 힙 메모리 할당

Linux의 힙 메모리 할당

프로세스가 "x"만큼의 힙을 요청할 때 Linux에서 할당한 메모리가 실제로 물리적으로 연속되어 있는지 혼란스럽습니다.

나의 현재 이해는 다음과 같습니다. Linux의 메모리 할당 단위는 페이지 크기입니다. 기본적으로 페이지 크기는 4KB입니다. 페이지는 RAM에서 물리적으로 연속되어 있습니다.

/proc/buddyinfo의 출력에서 ​​총 메모리가 그룹 0, 그룹 1, ... 그룹 10 등 여러 그룹으로 나누어져 있음을 알 수 있습니다.

각 그룹 "n"은 각각 크기가 4KB * (2^n)인 여러 개의 물리적으로 연속된 메모리 페이지를 포함합니다.

따라서 그룹 0에는 4KB 크기의 페이지가 포함되고, 그룹 1에는 8KB 크기의 페이지가 포함되며, 그룹 2에는 16KB 크기의 페이지가 포함됩니다.

이제 애플리케이션이 12KB의 메모리를 요청하고 그룹 2부터 사용 가능한 여유 페이지가 없다고 가정합니다.

나는 알고 싶다

  1. 이 경우 그룹 0과 그룹 1에서 각각 1페이지를 사용하여 메모리 할당 요청이 성공할까요? 아니면 실패할까요?

  2. 특정 그룹 'n'의 페이지가 물리적 메모리에서 연속되어 있습니까? 예를 들어, 그룹 2가 5개의 사용 가능한 페이지를 가정하는 경우 5개 페이지가 모두 물리적으로 연속되어 있습니까(5 * 4 * 4 = 80KB의 RAM 연속 블록)?

답변1

실제로 물리적으로 연속적인가요?

아니요. 이것은 매우 간단합니다! 물리적 페이지와 프로세스 메모리 간의 매핑은 거의 임의적입니다.

이 경우 그룹 0과 그룹 1에서 각각 1페이지를 사용하여 메모리 할당 요청이 성공할까요? 아니면 실패할까요?

일반적으로 말하면 작동합니다(12kB는 정말 작습니다. 시스템에 연속된 페이지가 그렇게 많지 않으면 심각한 문제가 발생합니다). 이것이 MMU의 마법입니다. 원하는 방식으로 실제 페이지를 재정렬할 수 있습니다. 필요한 테이블을 컴팩트하게 유지하고 사용 가능한 메모리를 빠르게 찾기 위해 이러한 매핑을 가능한 한 "직접"으로 만들려고 노력하지만, 연속 메모리가 충분하지 않더라도 실패하지는 않지만 전체적으로 사용되지 않은 페이지가 충분합니다.

특정 그룹 'n'의 페이지가 물리적 메모리에서 연속되어 있습니까? 예를 들어, 그룹 2가 5개의 사용 가능한 페이지를 가정하는 경우 5개 페이지가 모두 물리적으로 연속되어 있습니까(5 * 4 * 4 = 80KB의 RAM 연속 블록)?

아니요. 특히 물리적 메모리와 운영 체제 간의 가상화를 통해 시스템이 중첩된 페이지 테이블의 또 다른 계층을 가질 수 있는 방법을 고려할 때 더욱 그렇습니다.

관련 정보