Always Be Wise

Project_4 : File System - Buffer Cache 본문

카이스트 정글 - 프로젝트/Pintos

Project_4 : File System - Buffer Cache

bewisesh91 2022. 1. 30. 01:21
728x90

파일 블록의 캐시를 유지하기 위해 파일 시스템을 수정해야 한다.

블록 읽기 또는 쓰기 요청이 발생했을 때 해당 블록이 캐시에 있는지 확인하고,

캐시에 있다면 디스크로 이동하지 않고 캐시 된 블록을 사용하고, 캐시에 없다면 디스크에서 캐시로 블록을 가져온다.

이때, 필요한 경우 캐시에 있던 이전 블록을 방출할 수 있다. 캐시 크기는 64 섹터 이하로 제한된다.

 

적어도 클록 알고리즘만큼 좋은 캐시 교체 알고리즘을 구현해야 한다.

디스크 접근 횟수로 측정했을 때, 액세스 된 정보, 더티 정보 및 기타 정보의 조합이 최상의 성능을 제공하는지 확인해야 한다.

 

제공된 inode 코드는 디스크의 섹터별 인터페이스를 시스템 콜 인터페이스의 바이트 별 인터페이스로 변환하기 위해

malloc( ) 함수로 할당된 "bounce buffer"를 사용한다. 

 

수정된 데이터를 디스크에 즉시 기록하는 대신, 캐시에 더티 블록을 보관해야 한다.

그런데 더티 블록들은 캐시에서 방출될 때, 디스크에 기록되어야 한다.

크래시가 발생할 경우, write-behind는 파일 시스템을 취약하게 만든다. 따라서 정기적으로 더티 블록들을 디스크에 기록해야 한다.

또한, filesys_done( ) 함수 호출 시 디스크에 기록되어야 하며, Pintos를 중지하면 캐시가 사라진다.

 

첫 번째 프로젝트의 timer_sleep( )이 동작하는 경우, write_behind는 훌륭한 응용 프로그램이다.

그렇지 않다면 busy-waiting이 발생하지 않도록 해야 한다.

 

read-ahead 역시 구현해야 한다. 파일의 한 블록을 읽을 때, 해당 파일의 다음 블락을 자동적으로 캐시로 가져와야 한다. 

read-ahead는 비동기적으로 수행될 때 유용하다. 프로세스가 파일에 디스크 블록 1을 요청하면, 디스크 블록 1이 읽힐 때까지

블락되고 읽기가 완료되면 즉시 프로세스로 제어가 반환된다. 디스크 블록 2에 대한 read-ahead 요청은 비동기적으로 처리되어야 한다.

이렇게 하려면 IO 전용 스레드를 생성해야 하며, 디스크가 IO가 필요할 때 스레드는 전용 디스크 IO로 요청을 전달한다.

Hint for implementation

이 기능은 Linux처럼 가상 메모리 하위 시스템을 통해 구현할 수 있다.

새로운 VM 유형, pagecache를 도입하고, swap_in, swap_out, destroy 인터페이스를 통하여 버퍼 캐시를 관리할 수 있다.

이 설계를 선택하면 SECTOR_SIZE 세분화 대신, PAGE_SIZE 세분화로 캐시를 관리할 수 있다.

파일 백업 페이지 동기화 문제의 경우, mmaped 영역을 해당 페이지의 캐시로 사용할 수 있다.

캐시는 설계 초기에 통합하는 것이 좋다. 

 

Comments