Linux 시스템에서 다양한 메모리 문제를 겪어본 적이 있나요? 메모리 누수, 메모리 조각화 등 이러한 문제는 리눅스 커널 메모리 단편화 방지 기술에 대한 깊은 이해를 통해 해결될 수 있습니다.
리눅스 커널이 물리적 메모리를 구성하고 관리하는 방식이 버디 시스템인데, 물리적 메모리 조각화는 조각화 문제를 예방하고 해결하기 위해 몇 가지 실용적인 기술을 채택했습니다. 여기서 요약하겠습니다.
친구의 메모리 페이지 적용 적합한 페이지가 없으면 압축 및 회수라는 두 단계의 메모리 조정이 수행됩니다. 전자는 더 큰 연속 메모리를 얻기 위해 조각을 통합하는 것이고, 후자는 반드시 메모리를 차지하지 않는 버퍼 메모리를 재활용하는 것입니다. 여기서 초점은 전체 프로세스를 대략적으로 이해하는 것입니다.
으아아아GFP_FS 및 __GFP_IO; 또한, 영역의 남은 메모리는 특정 조건을 충족해야 합니다. 커널은 이를 "조각화 인덱스"라고 부릅니다. 이 값은 0에서 1000 사이입니다. 압축은 기본 조각화 인덱스가 더 큰 경우에만 수행할 수 있습니다. 500보다. 이 기본값은 proc 파일 extfrag_threshold를 통해 조정할 수 있습니다. 조각화 지수는 Fragmentation_index 함수를 통해 계산됩니다.
으아아아메모리 조각을 통합하는 과정에서 조각난 페이지는 이 영역 내에서만 이동하며, 해당 영역의 낮은 주소에 있는 페이지는 최대한 영역 끝으로 이동합니다. 새 페이지 위치 적용은 Compaction_alloc 함수를 통해 구현됩니다.
이동 프로세스는 동기식과 비동기식으로 구분됩니다. 메모리 적용이 실패한 후 첫 번째 압축에서는 비동기식을 사용하고 후속 회수에서는 동기식을 사용합니다. 동기 프로세스는 현재 사용되지 않는 페이지만 이동하고, 비동기 프로세스는 이동하기 전에 모든 MOVABLE 페이지가 사용될 때까지 순회하고 기다립니다.
메모리 페이지는 이동성에 따라 다음 세 가지 유형으로 구분됩니다.
UNMOVABLE: 메모리의 위치가 고정되어 있어 마음대로 이동할 수 없습니다. 커널에 의해 할당된 메모리는 기본적으로 이 유형에 속합니다.
RECLAIMABLE: 이동할 수는 없지만 삭제 및 재활용은 가능합니다. 예를 들어, 파일 매핑 메모리;
MOVABLE: 사용자 공간 메모리는 기본적으로 이 유형에 속합니다.
메모리 신청 시 이동성에 따라 먼저 지정된 유형의 무료 페이지에서 메모리를 신청하세요. 각 영역의 여유 메모리는 다음과 같이 구성됩니다.
으아아아
대체 유형 우선순위 목록은 다음과 같이 정의됩니다.
으아아아
으아아아
page_group_by_mobility_disabled인 경우 모든 메모리를 이동할 수 없습니다.
각 메모리 영역이 갖는 최소 페이지 수를 결정하는 매개변수인 pageblock_nr_pages가 있으며 다음과 같이 정의됩니다.
으아아아
시스템 초기화 중에 모든 페이지는 MOVABLE로 표시됩니다:으아아아
다른 이동성 유형의 페이지는 나중에 생성되는데, 이는 위에서 언급한 "훔치기"입니다. 이런 일이 발생하면 일반적으로 작은 조각 생성을 피하기 위해 대체에서 우선순위가 높고 더 큰 연속 페이지가 "도용"됩니다.으아아아
/proc/pageteypeinfo를 통해 현재 시스템의 다양한 유형의 페이지 분포를 볼 수 있습니다.
1. enum zone_type { 2. \#ifdef CONFIG_ZONE_DMA 3. ZONE_DMA, 4. \#endif 5. \#ifdef CONFIG_ZONE_DMA32 6. ZONE_DMA32, 7. \#endif 8. ZONE_NORMAL, 9. \#ifdef CONFIG_HIGHMEM 10. ZONE_HIGHMEM, 11. \#endif 12. ZONE_MOVABLE, 13. __MAX_NR_ZONES 14. };
ZONE_MOVABLE的启用需要指定kernel参数kernelcore或者movablecore,kernelcore用来指定不可移动的内存数量,movablecore指定可移动的内存大小,如果两个都指定,取不可移动内存数量较大的一个。如果都不指定,则不启动。
与其它内存域不同的是ZONE_MOVABLE不关联任何物理内存范围,该域的内存取自高端内存域或者普通内存域。
find_zone_movable_pfns_for_nodes用来计算每个node中ZONE_MOVABLE的内存数量,采用的内存区域通常是每个node的最高内存域,在函数find_usable_zone_for_movable中体现。
在对每个node分配ZONE_MOVABLE内存时,kernelcore会被平均分配到各个Node:
kernelcore_node = required_kernelcore / usable_nodes;
在kernel alloc page时,如果gfp_flag同时指定了__GFP_HIGHMEM和__GFP_MOVABLE,则会从ZONE_MOVABLE内存域申请内存。
总之,Linux kernel内存碎片防治技术是一个非常重要的概念,可以帮助你更好地理解Linux系统中的内存管理。如果你想了解更多关于这个概念的信息,可以查看本文提供的参考资料。
위 내용은 Linux 커널 메모리 단편화 방지 기술: 메모리 관리에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!