나는 내 기사의 독자들이 무언가를 오해하는 것을 피하고 매번 긴 문구를 사용하는 것을 피하기 위해 "사물 이름 지정"(리눅스의 메모리 관리와 관련하여)의 더 나은 방법을 알고 싶습니다.
- 파일 백업을 재활용하는 경우 해당 내용을 디스크에서 다시 검색할 수 있으므로 폐기할 수 있는 페이지를 말합니다. 하지만 "file-backed = 페이지 재활용 시 폐기될 수 있다"라는 의미에 초점을 맞추면 페이지 재활용 시 페이지를 폐기할 수 있는 특별한 경우가 있는지는 모르겠지만 여전히 파일 지원은 불가능합니다. 존경받는. 특수한 제로 페이지를 생각해 보십시오. 재활용할 수는 없지만 내용은 "일정"합니다. 가상 페이지가 제로 페이지에 매핑된 경우 정보 손실 없이 "다시 매핑"할 수 있으므로 안전하게 "매핑 해제"할 수 있습니다. "페이지 재활용 시 폐기될 수 있다"는 주장이 파일 백업 페이지의 개념과 잘 일치하지 않는 경우가 있나요? 아니면 실제로 이 두 개념 사이에 if와 only if가 있습니까?
- 전체 주소 지정 가능 범위의 가상 메모리와 현재 존재하는 가상 페이지의 가상 메모리를 구별합니다.
- "매핑"에 관하여: 페이지를 매핑한다는 것은 새로운 가상 페이지를 생성하여 주소 지정 가능한 전체 범위 어딘가에 배치한다는 것이 무엇을 의미합니까, 아니면 "페이지 매핑"이 "페이지 뒤에 가상 페이지 페이지를 RAM에 배치하는 것을 의미합니까?" 관련 페이지 오류"? 페이지가 스왑 아웃된 다음 다시 RAM으로 이동하는 두 번째 경우를 지칭하기 위해 "페이지 매핑"이라고 말하는 것이 맞습니까? 이전에 스왑의 페이지에 매핑되었던 가상 페이지가 이제 새 페이지 메모리 페이지를 가리킵니다.
- 물리적 페이지: 구체적으로 RAM의 페이지를 참조합니까, 아니면 물리적으로 어딘가(RAM 또는 디스크)에 존재합니까?
- 나는 어딘가에 있는 페이지에 "매핑"된 가상 페이지와 어딘가에 있는 페이지 자체를 구별하고 싶습니다. 나는 아무도 매핑하지 않은 가상 페이지를 의미하기 위해 "사용되지 않는 페이지"를 사용하는 것을 좋아하므로 여기서 설명하는 상황은 그 반대입니다. 그런데 "사용된 페이지"라고 하면 "최근 인용"이라든가 그런 식으로 이해할 수 있을지 모르겠습니다. 예를 들어 페이지 0에 매핑된 가상 페이지는 실제 페이지가 아니고 페이지 0은 실제 페이지이지만 이 두 개념의 이름을 올바르게 지정하는 방법을 모르겠습니다.
- 페이지를 구별하고 싶어요공유하도록 설계실제 공유 페이지와 함께. 예를 들어
.text
바이너리 자체의 일부에 매핑되는 페이지입니다. 이 페이지는공유하도록 설계또는잠재적인 공유(즉, 개인적인 의미는 아닙니다.) 그러나 실제로 공유되는지 여부는 동일한 바이너리를 실행하는 여러 프로세스가 있는지 여부에 따라 달라집니다. "비공개"와 동일: 페이지는 비공개이거나 공유될 수 있지만 비공개를 의미합니다. 예를 들어 CoW 가상 페이지(예: 0 페이지에 매핑된 가상 페이지 또는 a 이후의 상위 프로세스에서 상속된 가상 페이지)는fork
둘 다 공유되지만 비공개입니다. 이름을 사용하여 두 경우를 구별하는 방법을 알고 싶습니다. - 익명 페이지와 파일 기반 페이지: 혼란의 또 다른 원인입니다. 다음 상황을 고려하십시오. 동적 링크 라이브러리는 런타임 시 프로세스에 가상으로 매핑됩니다. RAM 페이지가 아직 할당되지 않았습니다. 파일 에는 일부 전역 변수가 포함된
.so
8kB 섹션이 있습니다 ..data
일부 전역 변수에 액세스한 후 두 페이지 모두에 RAM이 할당되었습니다. 이는 실제 파일 기반 페이지입니다(페이지 재활용의 경우 스왑으로 이동하는 대신 폐기될 수 있음). 이제 일부 변수가 수정되어 두 페이지가 파일에서 분리되어 익명이 됩니다(더 이상 삭제할 수 없음). 그러나cat smaps
파일을 참조하는 해당 주소 범위가 표시되면(inode는 0과 다르며 파일 경로가 표시됨.so
) 이제 두 페이지는 모두 익명입니다(Anonymous
출력 필드smaps
는 와 같습니다8 kB
). 여기서 "주소 범위"는 파일을 참조하지만 해당 페이지는 현재 파일로 백업되지 않습니다. "파일을 참조"하는 페이지나 범위, "파일에서"인 페이지 또는 범위를 구별할 수 있는 방법이 있습니까? 아니면 과거 특정 시점에 "파일 기반"이었던 페이지가 현재 파일 백업되는 경우를 구별할 수 있는 방법이 있습니까?
답변1
파일 지원이 페이지가 파일의 페이지에 매핑되었음을 나타냅니다. 파일 지원 페이지는
mmap()
파일 설명자를 호출하여 생성됩니다. 이는exec
프로세스가 로드될 때 자동으로 수행되고(텍스트 세그먼트는 실행 파일에 의해 지원됨) 공유 라이브러리를 링크할 때 동적 링커에 의해 수행됩니다.페이지를 재활용할 때 폐기할 수 있는지 여부를 나타내는 용어는 다음과 같습니다.흙그리고깨끗한. 디스크의 마지막 페이지 이후 더티 페이지가 변경되었으므로 이를 디스크에 다시 써야 합니다. 깨끗한 페이지는 간단히 폐기할 수 있습니다. 이는 파일 지원 여부와는 아무런 관련이 없습니다. 스왑 지원 페이지도 더럽거나 깨끗할 수 있습니다. 파일이 지원하는 페이지가 더티할 수 있으며, 이는 메모리 매핑을 사용하여 파일이 업데이트되는 방식입니다.
가상 메모리다양한 방법으로 사용할 수 있습니다. 기본 정의는 프로세스가 물리적 RAM보다 더 많은 데이터에 액세스할 수 있도록 하는 자동 메모리 관리 시스템입니다. 이것은 다르다교환, 결합된 메모리가 RAM보다 큰 여러 프로세스가 있을 수 있지만 단일 프로세스는 여전히 물리적 RAM으로 제한됩니다. 요즘은 일반적이지 않지만 프로세스를 전환할 때마다 프로세스의 전체 주소 공간이 디스크와 RAM 간에 복사됩니다. 램.
가상 메모리구현된 물리적 RAM이 아닌 프로세스의 가상 주소 공간을 참조하는 데에도 사용됩니다. 사용자 모드 프로세스는 일반적으로 가상 메모리에만 액세스할 수 있습니다. 실제 메모리는 운영 체제와 CPU의 메모리 관리 구성 요소에 의해 처리됩니다.
그리고가상 메모리때로는 가상 메모리 하위 시스템에서 관리하는 모든 메모리를 참조하는 데 사용됩니다. 디스크 공간이 지금만큼 저렴하지 않았던 시절에는 "가상 메모리가 고갈된" 상황이 흔히 발생했습니다. 스왑 파티션은 파일이 지원되지 않는 모든 메모리를 수용할 만큼 크지 않았습니다.
매핑가상 메모리 페이지를 디스크 페이지와 연결하는 것을 의미합니다. 파일 지원 페이지의 경우 파일의 해당 페이지에 매핑됩니다. 익명 페이지는 페이지 교환에 매핑됩니다. 후자는 일반적으로 투명하므로 파일로 뒷받침되는 페이지를 지칭하기 위해 주로 용어를 사용하며 일반적으로
mmap()
.실제 페이지일반적으로 RAM 페이지와 구별하기 위해 RAM 페이지를 나타냅니다.가상 페이지.
"어딘가에 있는 페이지에 "매핑"된 가상 페이지와 어딘가에 있는 페이지 자체를 구별하고 싶습니다. 이에 대한 적절한 용어가 있는지 잘 모르겠습니다.
"공유하려는 페이지와 실제로 공유되는 페이지를 구별하고 싶습니다."공유 가능. 원래 공유된 페이지의 경우
fork()
이보다 더 좋은 것은 없다고 생각합니다.사적인. 원래 공유된 경우 이는 COW를 의미합니다."익명성 및 파일 지원 페이지". 이
.data
섹션은 매핑에 사용될 수 있습니다MAP_PRIVATE
. 위에서 언급했듯이 이것은 COW를 의미합니다. 따라서 처음에는 파일 백업이지만 더러워지면 익명 페이지로 스왑되도록 매핑됩니다.