저는 현재 Pintos라는 교육용 운영체제를 개발 중입니다. 가상 메모리를 구현하면서 겪었던 문제 중 하나는 파일 시스템에서 데이터를 읽어 스왑하기 위해 데이터를 쓸 때 발생하는 페이지 폴트였습니다.
문제는 스왑 파티션과 파일 시스템 파티션이 동일한 컨트롤러를 사용하기 때문에 한 번에 하나만 액세스할 수 있다는 점입니다. 파일 시스템 읽기로 인해 발생한 페이지 오류를 교환하기 위해 페이지를 제거하려고 하면 교착 상태가 발생합니다(각 장치는 다른 장치가 사용 가능해지기를 기다리고 있으므로 둘 다 진행할 수 없습니다).
실제 운영 체제(예: Linux)가 이 문제를 어떻게 해결하는지 알고 싶습니다. 제가 고려 중인 한 가지 해결책은 먼저 스왑된 페이지를 커널 메모리에 쓰고 이를 대기열에서 관리한 다음 나중에 장치를 사용할 수 있게 되면 쓰기 저장이 스왑되도록 예약하는 것입니다. 그러나 쓰기를 두 번 완료해야 하기 때문에 비용이 많이 듭니다. 또한 실제 메모리보다 사용 가능한 스왑 공간이 훨씬 많기 때문에 RAM이 부족할 가능성이 더 높습니다.
페이지 부재 시 장치를 유휴 상태로 "강제"하는 또 다른 솔루션은 무엇입니까? 나는 장치 컨트롤러가 장치 상태를 결정하기 위해 일부 비트(BSY 및 DRQ)를 사용한다는 것을 알고 있습니다. 그러나 이는 구현에 따라 다를 가능성이 높으며 하드웨어에 의해 설정될 수 있으므로 이러한 비트를 건드려야 하는지 잘 모르겠습니다.
어떤 조언이라도 대단히 감사하겠습니다.
답변1
음... 간단합니다. 대기열입니다. 디스크: 대기열. 두 작업이 하나의 파티션에 있는 서로 다른 파일에 액세스하려고 하는지, 아니면 두 개의 서로 다른 파티션에 있는 서로 다른 파일에 액세스하려고 하는지는 중요하지 않습니다. 두 요청 모두 대기열에 저장되고 디스크 드라이버는 한 번에 하나씩 해당 요청을 처리합니다.