저는 아래와 같이 Linux가 개인 개체를 관리하는 방법에 대한 교과서를 읽고 있습니다.
다이어그램은 두 프로세스가 개인 개체를 가상 메모리의 서로 다른 영역에 매핑하지만 개체의 동일한 물리적 복사본을 공유하는 상황을 보여줍니다. 개인 개체를 매핑하는 각 프로세스에 대해 해당 개인 영역의 페이지 테이블 항목은 읽기 전용으로 표시되고 영역 구조는 개인 쓰기 시 복사로 표시됩니다. 프로세스가 비공개 영역의 페이지에 쓰기를 시도하면 쓰기로 인해 보호 오류가 발생합니다. 오류 처리기가 쓰기 영역의 개인 복사본에 있는 페이지에 쓰려는 시도로 인해 보호 예외가 발생했음을 발견하면 물리적 메모리에 페이지의 새 복사본을 만들고 새 페이지를 가리키도록 페이지 테이블 항목을 업데이트합니다. 복사한 다음 페이지 쓰기 권한을 복원합니다.
우리는 Linux가 vm_area_struct
(영역 구조체)를 사용하여 현재 가상 주소 공간의 영역을 다음과 같이 표현한다는 것을 알고 있습니다.
vm_flags
쓰기 중 복사가 작동할 수 있도록 비공개 영역을 "비공개"로 설정하면 될 것 같습니다.
내 질문은 프로세스 2의 가상 메모리에 있는 개인 개체의 개인 영역이 이라고 가정해 보겠습니다 pa2
. 따라서 처음에 프로세스 2는 (시작 가상 주소가 이라고 가정 0x404000
) 에 페이지 쓰기를 시도하여 pa2
보호 오류를 유발한 다음 이를 처리하고 물리적 메모리에 페이지의 새 복사본을 만듭니다. 일정 시간이 지난 후 프로그램이 0x404000
다시 시작하는 페이지를 수정해야 하고, pa2
여전히 개인 영역이기 때문에 또 다른 보호 오류가 발생하고, 페이지의 또 다른 새 복사본이 물리적 메모리에 생성된다고 가정해 보세요. 하지만 첫 번째 새 페이지는 어떻게 될까요? ? 첫 번째 오류 처리 중에 생성되었습니까? 더 이상 가상 주소로 참조되지 않고 여전히 물리적 메모리에 상주합니다. 이것이 리소스 낭비입니까?
답변1
페이지 오류가 발생하면 커널이 쓰기 중 복사 시나리오에서 쓰기가 실패했다고 판단하고 페이지에 최소 두 명의 사용자가 있는 경우 원본 페이지를 새 페이지에 복사하고(설명한 대로) 새 페이지 쓰기 가능. 소유 프로세스에서 동일한 페이지에 대한 후속 쓰기는 페이지 오류를 일으키지 않습니다.