나는 이것이 단순화/일반화된 설명이라는 것을 알고 있지만 유틸리티는 top(1)
FreeBSD의 메모리를 6개의 풀 Active
( Inactive
, , Wired
, Cache
및 )로 나눕니다. 출력 예:Buffers
Free
top(1)
Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free
Active
Wired
주로 커널에서 실행 중인 프로세스에 사용됩니다 . Inactive
재사용이 필요할 경우를 대비해 여전히 캐시되어 있는 닫힌 프로세스의 메모리, Cache
캐시된 데이터, 디스크 버퍼( Linux 출력(?) Buffers
과 비슷한 것 같아요 ), 완전히 사용되지 않은 메모리입니다. FreeBSD 커널은 , 풀 에서 또는 필요한 경우 자동으로 공간을 할당합니다 . 맞습니까?cached
free(1)
Free
Inactive
Cache
Buffers
Active
Wired
답변1
요컨대,긍정적인그리고열광한사용된 메모리는 사용 가능한 메모리로 교체되어서는 안 되거나 교체될 수 없습니다. 하지만비활성적절하게 교체할 수 있지만 여전히 프로세스나 커널이 소유하므로(해제되지 않음) 메모리를 많이 사용하지는 않지만 여전히 사용됩니다.
새로운 것은빨래이것은 스왑 장치에 써야 할 수 있는 더티 메모리 페이지 목록입니다. 더티 메모리를 교체해야 하는지 여부에 관계없이 해당 메모리는 비활성 대기열에 다시 추가됩니다.
열광한안전(커널의 경우)이나 사용자 영역 프로세스 최적화(예: ZFS)를 위해 메모리를 교체해서는 안 됩니다. 유선 메모리는 파일 시스템 캐싱에 사용되며 커널에 의해 해제될 수 있습니다. 적어도 ZFS의 경우 이는 대부분 여유 메모리로 간주될 수 있습니다.
무료메모리는 완전 무료입니다.
은닉처(현재는 더 이상 사용되지 않는 것 같습니다)은 교체되었으며 가능한 재할당에만 사용되므로 해제할 준비가 되어 있습니다.
완충기대부분의 파일 시스템(UFS, FAT...)에서 캐시로 사용되며 파일 시스템에서 사용하는 메모리 양입니다. 활성, 비활성 또는 유선일 수 있습니다.
호(적응 대체 캐시)는 ZFS에서 사용하는 캐시이며 필요할 때 해제할 수 있는 메모리입니다.
메모리 클래스
긍정적인
- 사용자 공간의 "활성"(최근) 참조가 포함된 페이지
- 깨끗한 페이지와 더티 페이지가 혼합되어 있음
- 페이지 데몬은 페이지를 주기적으로 스캔합니다(각 페이지는 vm.pageout_update_ period 초마다 액세스됩니다).
- 스캔은 마지막 스캔 이후 페이지가 참조되었는지 확인합니다.
- 참조를 보지 않고 충분한 스캔이 완료되면 페이지가 비활성 대기열로 이동됩니다.
- 의사 LRU 구현
비활성
- 활성 대기열을 벗어난 페이지가 포함되어 있습니다.
- 버퍼 캐시에서 제거된 페이지를 포함합니다.
- 깨끗한 페이지와 더티 페이지가 혼합되어 있음
- 메모리가 부족하면 페이지 데몬이 페이지를 스캔합니다(큐의 헤드에서 시작).
- 참조된 페이지는 활성 대기열 또는 비활성 대기열의 끝으로 다시 이동됩니다.
- 더티 페이지는 세탁 대기열의 끝으로 이동됩니다.
- 참조되지 않은 클린 페이지는 즉시 해제되어 재사용 가능
- 두 번째 기회 LRU 구현
빨래
- 재사용하기 전에 정리("세척")해야 하는 더티, 비활성 페이지를 관리하는 데 사용되는 대기열
- 페이지 데몬 대신 별도의 스레드(세탁 스레드)로 관리됩니다.
- 세탁 스레드는 비활성 대기열과 세탁 대기열의 균형을 맞추기 위해 소수의 페이지를 정리합니다.
- 청소 빈도는 다음에 따라 달라집니다.
- 페이지 데몬이 얼마나 많은 클린 페이지를 해제하는지, 더 많은 자유도는 더 높은 세탁 빈도로 이어집니다.
- 비활성 대기열에 비해 세탁 대기열의 크기입니다. 세탁 대기열이 길어지면 옷을 더 자주 세탁하게 됩니다.
- 페이지는 세탁 스레드에 의해 스캔됩니다(대기열의 선두에서 시작):
- 참조된 페이지는 활성 대기열 또는 세탁 대기열의 끝으로 다시 이동됩니다.
- 더티 페이지는 정리된 다음 비활성 대기열의 헤드 근처로 이동됩니다.
무료
- 시스템의 나머지 부분에서 사용할 수 있는 메모리입니다.
열광한
- 페이징 불가능한 메모리: 소유자가 명시적으로 해제할 때까지 해제할 수 없습니다.
- 사용자 모드 메모리는 mlock(2)을 통해 연결될 수 있습니다(시스템 및 사용자별로 제한됨)
- 커널 메모리 할당자는 유선 메모리를 반환합니다.
- ARC의 내용과 버퍼 캐시가 연결되어 있습니다.
- 일부 메모리는 영구적으로 연결되어 있으며 해제되지 않습니다(예: 커널 파일 자체).
~에서FreeBSD 운영 체제의 설계 및 구현6.12장 페이지 교체(더 이상 완전히 정확하지는 않지만 이전 질문을 참조하기 위해 여기에 있습니다):
커널은 주 메모리를 5개의 목록으로 나눕니다.
- 열광한: 연결된 페이지가 메모리에 잠겨 있어 불러올 수 없습니다. 일반적으로 이러한 페이지는 커널이나 물리적 메모리 호출기에서 사용 중이거나 잠겨 있습니다.몰록. 또한 로드된(즉, 교체되지 않은) 프로세스에 대한 스레드 스택을 보유하는 모든 페이지도 연결됩니다.
- 긍정적인: 활성 페이지가 하나 이상의 가상 메모리 영역에서 사용되고 있습니다. 커널이 이를 호출할 수 있지만 그렇게 하면 활성 프로세스가 다시 실패할 수 있습니다.
- 비활성: 비활성 페이지는 더러워지고 여전히 알려진 콘텐츠를 포함할 수 있지만 일반적으로 활성 영역에 속하지 않습니다. 페이지의 콘텐츠가 더러워지면 페이지를 재사용하기 전에 해당 콘텐츠를 백업 저장소에 기록해야 합니다. 페이지가 정리되면 캐시 목록으로 이동됩니다. 시스템 메모리가 부족한 경우 페이징 데몬은 실제로 사용되지 않는 페이지를 찾기 위해 활성 페이지를 비활성 목록으로 이동하려고 시도할 수 있습니다. 이 섹션의 뒷부분에서는 활성 목록에서 비활성 목록으로 이동할 페이지를 선택하기 위해 페이지 콜아웃 데몬이 사용하는 선택 기준에 대해 설명합니다. 사용 가능한 메모리와 캐시 목록이 낮은 수준으로 떨어지면 페이징 데몬은 더 많은 캐시와 사용 가능한 페이지를 생성하기 위해 비활성 목록을 순회합니다.
- 은닉처: 캐시된 페이지의 내용은 여전히 알려져 있지만 매핑의 일부는 아닙니다. 활성 영역에 결함이 있는 경우 어떤 매핑에도 속하지 않습니다. 활성 영역에서 실패하면 캐시 목록에서 활성 목록으로 이동됩니다. 읽기나 쓰기에 사용되는 경우 먼저 캐시 목록에서 버퍼 캐시로 이동되고 결국 비활성 목록으로 해제됩니다. 하나몰록시스템 호출은 캐시 목록에서 페이지를 회수하고 연결할 수 있습니다. 캐시 목록의 페이지는 페이지된 이후 수정되지 않았거나 백업 저장소에 기록되었기 때문에 더티가 아니라는 점을 제외하면 비활성 페이지와 유사합니다. 페이지가 필요할 때 새로운 목적으로 선언할 수 있습니다.
- 무료: 유휴 페이지에는 유용한 콘텐츠가 없으며 새 페이지 오류 요청을 충족하는 데 사용됩니다.
원래 질문에 대답하려면
필요한 경우 FreeBSD 커널이 자동으로 비활성 풀, 캐시 풀 및 버퍼 풀의 공간을 활성 풀이나 유선 풀에 할당한다는 것이 맞습니까?
긍정적인페이지가 될 수 있습니다비활성한동안 사용하지 않았다면. 커널이비활성페이지 이 페이지는 다음으로 이동되었습니다.은닉처목록. 페이지는 다음 위치에 있습니다.은닉처목록은 프로세스의 가상 맵의 일부가 아니지만 쉽게 재활용할 수 있습니다.긍정적인또는열광한. 또는 I/O가 필요한 경우완충기은닉처.
열광한메모리는 주 메모리에서 교체될 수 없습니다. 프로세스에 의해 연결된 경우 호출을 통해 munlock
연결을 취소해야 합니다.긍정적인다시 기억하세요.
긍정적인,비활성그리고열광한메모리는 프로세스나 커널에 의해 해제되고 다음에 추가될 수 있습니다.무료목록.