Linux 시스템에서 다양한 메모리 문제를 겪어본 적이 있나요? 메모리 누수, 메모리 조각화 등 이러한 문제는 Linux 커널 메모리 재활용 메커니즘에 대한 심층적인 이해를 통해 해결될 수 있습니다.
컴퓨터에 메모리가 아무리 많아도 충분하지 않으므로 Linux 커널은 시스템이 계속해서 메모리를 사용하도록 거의 사용되지 않는 일부 메모리 페이지를 회수해야 합니다. 페이지 재활용에는 페이지 쓰기 저장, 페이지 교환 및 페이지 폐기의 세 가지 방법이 있습니다. 거의 사용되지 않는 페이지의 백업 저장소가 블록 장치(예: 파일 매핑)인 경우 메모리를 블록 장치에 직접 동기화하여 해제할 수 있습니다. 페이지를 다시 사용할 수 있습니다. 페이지에 백업 저장소가 없으면 특정 스왑 파티션으로 교체한 다음 페이지의 백업 저장소가 파일인 경우 다시 액세스할 수 있습니다. 그러나 파일 내용은 메모리(예: 실행 파일)에서 수정할 수 없으며 현재 필요하지 않은 경우 직접 삭제할 수 있습니다.
2.1 페이지 프레임 재활용
LRU(Least Recent Used)는 최근에 가장 적게 사용된 연결 목록으로, 가장 적게 사용된 연결 목록은 연결 목록의 끝에 존재하며 다음 매크로 정의를 통해 알 수 있습니다.
#define lru_to_page(_head) (list_entry((_head)->prev, 구조체 페이지, lru))
각 영역에는 최근에 사용한 다양한 페이지를 저장하는 5개의 LRU 링크 목록이 있습니다.
열거형 lru_list {
LRU_INACTIVE_ANON = LRU_BASE,
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
이 중 INACTIVE_ANON, ACTIVE_ANON, INACTIVE_FILE, ACTIVE_FILE 4개의 연결리스트에 있는 페이지는 재활용이 가능하다. ANON은 익명 매핑을 나타내며, 백업 저장소가 없음을 나타냅니다. FILE은 파일 매핑을 나타냅니다.
페이지를 재활용할 때 INACTIVE 페이지가 먼저 재활용됩니다. INACTIVE 페이지가 거의 없는 경우에만 ACTIVE 페이지가 재활용 대상으로 간주됩니다.
페이지의 활동을 평가하기 위해 커널은 PG_referend 및 PG_active라는 두 가지 플래그를 도입합니다. 왜 2비트가 필요한가요? 페이지가 활성화되었는지 여부를 식별하는 데 하나의 PG_active만 사용된다고 가정합니다. 이 비트는 페이지에 액세스할 때 설정되지만 언제 지워지나요? 이렇게 하려면 많은 수의 커널 타이머를 유지 관리해야 하며 이 접근 방식은 실패할 운명입니다.
두 개의 플래그를 사용하여 보다 우아한 접근 방식을 구현할 수 있습니다. 하나는 현재 활동 수준을 나타내고 다른 하나는 최근에 참조되었는지 여부를 나타냅니다.
(1) 페이지가 활성 상태이면 PG_active 비트를 설정하고 ACTIVE LRU 목록에 저장합니다. 그렇지 않으면 INACTIVE로 설정합니다.
(2) 페이지에 액세스할 때마다 PG_referenced 비트가 설정됩니다. mark_page_accessed 함수가 이 작업을 담당합니다.
(3) PG_referenced 및 역방향 매핑에서 제공되는 정보는 페이지 활동을 결정하는 데 사용됩니다. 이 비트가 지워질 때마다 페이지 활동이 감지됩니다.
(4) mark_page_accessed를 다시 입력하세요. PG_referenced가 설정되어 있는 것으로 확인되면 page_referenced를 확인하지 않았다는 의미이므로, page_referenced보다 mark_page_accessed가 더 자주 호출되며, 이는 해당 페이지에 자주 액세스한다는 의미입니다. 페이지가 INACTIVE 링크 목록에 있으면 ACTIVE로 이동하세요. 또한 PG_active 플래그가 설정되고 PG_referenced가 지워집니다.
(5) 페이지 활동이 감소할 경우, 중간에 mark_page_access를 거치지 않고 page_referenced를 연속해서 두 번 호출할 수도 있습니다.
메모리 페이지에 대한 액세스가 안정적인 경우 page_referenced 및 mark_page_accessed에 대한 호출은 본질적으로 균형을 이루며 페이지는 현재 LRU 목록에 유지됩니다. 또한 이 솔루션은 메모리 페이지가 ACTIVE와 INACTIVE 연결 목록 사이에서 빠르게 이동하지 않도록 보장합니다.
2.2 slab**** 캐시 재활용
슬랩 캐시 재활용은 상대적으로 유연하며,shrinker_list에 등록된 모든 메소드가 실행됩니다.
커널은 기본적으로 각 파일 시스템에 대해 prune_super 메소드를 등록합니다. 이 함수는 파일 시스템에서 더 이상 사용되지 않는 dentry 및 inode 캐시를 재활용하는 데 사용됩니다.
Android의 lowmemorykiller 메커니즘은 프로세스를 선택적으로 종료하고 프로세스에서 사용하는 메모리를 회수하는 방법을 등록합니다. 3****페이지 프레임을 재활용하는 방법
shrink_page_list는 실제로 페이지를 재활용하는 프로세스입니다
4.1 kswapd
kswapd는 각 메모리 노드에 대해 커널에 의해 생성된 메모리 재활용 스레드입니다. 재활용 메커니즘이 부족할 때 주기적인 재활용이 필요한 이유는 무엇입니까? 인터럽트 및 예외 처리기의 메모리 할당과 같은 일부 메모리 할당은 복구 대기를 차단하는 것이 허용되지 않기 때문에 일부 메모리 할당은 I/O 액세스를 활성화하는 데 허용되지 않습니다. 메모리가 부족한 경우에만 재활용 프로세스를 완전히 실행할 수 있으므로 시스템의 유휴 시간을 활용하여 메모리를 회수하는 것이 매우 필요합니다.
이 함수는 마지막 밸런싱 작업에 사용된 할당 순서를 기록합니다. kswapd_max_order가 마지막 값보다 크거나, classzone_idx가 마지막 값보다 작을 경우, 메모리 도메인의 밸런싱을 다시 수행하기 위해 Balance_pgdat가 호출됩니다. 그렇지 않으면 짧은 절전 모드가 수행될 수 있습니다. 수면 시간은 HZ /10이고, 팔(HZ=100)의 경우 수면 시간은 1ms입니다.
Balance_pgdat는 메모리 도메인의 zone_wartermark_ok까지 작업 균형을 유지합니다.
4.2 캐시_reap
캐시_reap은 슬랩의 유휴 개체를 재활용하는 데 사용됩니다. 유휴 개체를 페이지로 복원할 수 있으면 버디 시스템으로 다시 릴리스됩니다. 캐시_reap이 호출될 때마다 모든 slab_caches가 순회된 다음 2*HZ 동안 절전 모드로 전환됩니다(HZ=100). 주기는 20ms입니다.
간단히 말하면, Linux 커널 메모리 재활용 메커니즘은 Linux 시스템의 메모리 관리를 더 잘 이해하는 데 도움이 될 수 있는 매우 중요한 개념입니다. 이 개념에 대해 더 자세히 알고 싶다면 이 문서에 제공된 리소스를 확인하세요.
(1) 《리눅스 커널의 이해》
(2) 《전문 리눅스 커널 아키텍처》
위 내용은 Linux 커널 메모리 재활용 메커니즘: 메모리 관리에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!