[정글 88일차]Pintos Project 4 (Indexed and Extensible Files)

김희산·2022년 12월 15일

어느덧 시간이 흘러 벌써 핀토스의 마지막 project4(파일시스템)에 도달했다.
시간이 어떻게 흘렀는지도 잘 모르겠다. 88일차를 달려오면서 처음 다졌던 의지가 꺾이는 순간도 여러번 있었다. 그래서 하루하루에 충실했고 여기까지 왔다.
마지막 project4를 시작하면서 간단하게 구현해야 할 내용들을 정리해보았다.
kaist pintos 공식 깃북(https://casys-kaist.github.io/pintos-kaist/)을 참조하였다.

Indexed and Extensible Files

  • 현재 프로젝트3까지의 파일시스템은 single extent로 파일을 할당함. ( 데이터가 이어진 형태의 연속 할당)
  • 디스크 전체에는 file size만큼 공간이 남아있어도 할당 못받는 경우 발생(외부단편화)
  • on-disk inode structure 수정함으로써 문제를 해결하자
  • FAT를 사용하라
  • 파일 시스템 파티션은 8MB 이하이다. file은 파티션만큼의 크기(빼기 메타데이터의 크기) 로 다뤄야 함
  • 각 disk sector안에 있는 각각의 inode는 가지고 있는 block의 수만큼 block pointer를 가져야 함

Indexing large files with FAT (File Allocation Table)

주의사항 : 이 문서는 당신이 FAT 과 일반적인 filesystem을 이해하고 있다는 것을 가정한다.

  • 기본 파일시스템에서 여러 개의 disk sector에 걸쳐 이어진 형태로 공간에 저장되어 있었음
  • 이것을 cluster 라고함. cluster는 한 개, 혹은 다수의 disk sector를 가질 수 있다.
  • 이 관점에서 기존 file system의 한 cluster size는 cluster안에 저장되있는 file의 size와 같다고 할 수 있음
  • 현재 핀토스에서는 한 cluster의 sector 수는 1로 고정되어있다. 한 개의 cluster는 file 전체를 담기에는 충분하지 않을 지도 모른다. 그래서 multiple cluster 가 필요하고, 따라서 file의 cluster의 위치를 추적할 data structure를 inode안에 넣어야 함 ( 가장 쉬운 방법은 linked-list )
  • inode에는 file의 첫 block의 sector의 갯수 저장
  • 첫 블록은 다음 블록의 섹터의 갯수를 저장
  • 하지만 이 방법을 쓰면 마지막 block 을 읽으려면 전체 block을 다 읽어야 하는 비효율이 있다.
  • 이 때문에 FAT (File Allocation Table) 시스템은 고정된 크기의 FAT에 블록의 connectivity (연결 수단, 일종의 포인터?)를 놓음
  • FAT는 실제 data보다는 연결 수단만을 담고있기 때문에, FAT는 DRAM에 들어갈 만큼 작아짐
  • 결과적으로는, table안의 entry만 읽으면 된다.
  • filesys/fat.c에 제공된 skeleton code로 inode indexing을 수행해야 함
  • 무엇보다, fat.c 안의 fat.c (i.e. fat_init(), fat_open(), fat_close(), fat_create(), fat_boot_create() 6개 함수들은 boot time 시에 disk와 format을 초기화하기 때문에 수정할 필요가 없다.
  • 하지만 어떤 함수가 도움이 될 건지 이해할 필요가 있으며 fat_fs_init()은 작성해야한다.

File Growth

  • 기존 file system에서 file의 크기는 file이 만들어질 때 명시되었다.
  • 요즘은 대부분 file system에서(project4부터) file은 만들어질 때 크기가 0이 되고, EOF로 write가 끝날 때마다 갱신된다. 이것을 구현해야함
  • file system의 size를 초과하는 file 크기가 아니라면, file의 크기에 제한을 둬선 안된다.
  • 이는 root directory file 에도 적용되며, 이 directory의 file 갯수 제한 (16개) 은 해제된다.
  • User programe이 현 EOF를 넘어서 검색할 수 있도록 해야 함
  • 이 검색은 file은 확장하지 않음
  • 기존 EOF를 넘어가는 위치에서의 쓰기 작업은 EOF를 현 쓰기 작업이 끝난 위치로 옮긴다.
  • 기존 EOF와 쓰기의 시작 지점 사이의 공간은 0으로 채워야한다.
  • 이전 EOF 위치에서부터 시작된 읽기 작업은 no byte를 반환한다.
  • EOF를 넘어선 쓰기 작업은 (EOF와 쓰기 작업의 시작 위치 사이에) 0으로만 채워진 block을 만들 수 있다.
  • 일부 file system은 이 0만 있는 block에 메모리를 할당하고 쓰기 작업을 수행함
  • 하지만 이 block에 쓰기 작업이 수행될 때 까지, 이 공간을 할당하지 않는 file system도 있다.
  • 이러한 file system을 "sparse files"를 지원한다고 하며, 둘 중 아무거나 택해도 된다.

출처 : https://casys-kaist.github.io/pintos-kaist/project4/indexed_and_extensible_files.html

profile
성공은 제로섬 게임이 아니라 주변인들과 함께 나아가는 것이다.

0개의 댓글