거북이의 쉼터

(2022.03.26) 프로젝트 4 Introduction 맛보기 본문

코딩 삽질/KAIST PINTOS (CS330)

(2022.03.26) 프로젝트 4 Introduction 맛보기

onlim 2022. 3. 26. 18:57

마참내. 마지막 프로젝트이다. 3월에 마지막을 하고 있는 나도 정상은 아니야...

 

K-핀토스로 개조되면서 가장 극심한 변화를 겪은 부분이기도 하며, 지난 번 진행할 때 격추된 부분이다. 극도로 조심히, 세밀하게 진행하도록 하자.

 

프로젝트 4는 여태 프로젝트들이 지난 프로젝트를 반드시 요구했던 것과는 다르게 프로젝트 2 위에 올리기만 해도 된다고 한다. 다만 점수가 깎일 뿐이지... ㅋㅋㅋㅋ 프로젝트 2 위에 직접 올리게 되면 10%의 점수가 차감된다. 프로젝트 3 위에 올리려고 한다면, filesys/Make.vars를 수정하라고 나온다. 죽이되든 밥이되든 프로젝트 3 위에 올릴 것이기에 수정하고 시작하자.

 

참고로 프로젝트 4의 Extra는 웬만한 일이 아니면 안 할 것이다. 첫 번째 이유는 기본 구현도 트라우마가 있는데 Extra를 건들일 여지가 있을까 하는 의문이고, 두 번째 이유는 A-만 노리면 되는데 굳이 구현을 해야 하는가 하는 이유이며, 마지막으로 세 번째 이유는 머학원 입시에 집중하고 싶기 때문이다. 심지어 여기에 Filesystem Journaling은 hidden test case에 take all or nothing 정책을 내세우고 있으니 진심으로 OS에 미친 사람이 아니라면 도전할 사람들은 많지 않을 것이다. 만약 생각이 바뀌더라도 Mount까지만 구현하지 않을까 싶다.

 

여태까지 우리는 file system의 구체적인 구현 방식을 생각하지 않고, 그냥 구현된 코드를 사용해서 프로젝트 3까지 진행해왔다. 이제 그 내부에 깔린 코드를 이해하고, 방식을 변경해볼 시간이 왔다. 현재 파일 시스템은 Unix-like 인터페이스를 가지고 잇다고 소개되어 있으며, Unix man 페이지를 참고해서 함수들에 대한 이해를 하라고 나와있다. 현재 파일 시스템은 동작은 하지만, 결정적인 결점이 있다고 하며, 이번 프로젝트를 통해 고쳐나가야 한다.

 

지금까지 모든 테스트 케이스는 Pintos가 한 번만 실행됐지만, 프로젝트 4에서는 두 번째 실행까지 consistency가 유지되는지를 확인할 것이다. 두 번째 실행에서 첫 번째 실행에서 생성된 파일을 하나의 파일로 압축하여 외부로 배출할 것이며, 채점 프로그램은 배출된 파일의 내용이 올바른지를 검사할 것이다. 이 말인즉, 하나의 파일로 압축하는 루틴이 완성되기 전에는 검사를 하나도 통과하지 못한다는 뜻이다. 압축하는 형식은 전형적인 Unix tar 포맷이며, 해당 프로그램은 extensible file과 subdirectory support를 모두 구현한 뒤에야 제대로 동작할 것이라고 매뉴얼에 나온다.

 

매뉴얼의 내용이 비교적 적기 때문에 만족스럽지가 않다. 대체 뭘 고쳐야 하는지 감이 잘 안 잡히는데 수정할 파일들에 적힌 설명에 일종의 힌트가 있다.

include/filesys/fat.h, filesys/fat.c

Manage the FAT filesystem.

 

파일 시스템을 구현할 때 방식은 FAT여야 한다. 예전에는 inode pointer structure를 차용하는 Unix File System을 구현하는 것이 목표였지만, 이제는 File Allocation Table이라는 파일 시스템을 구현하라고 한다. 이게 뭔데? 이에 대한 자세한 설명은 FAT가 매뉴얼 상에 언급된 Indexed and Extensible Files 부분을 진행할 때 하겠다. 그 때 자료를 찾아서 이해를 해 보자.

 

다음으로 vm에서 종종 언급되었던 아래 코드에 대한 설명이 있는데,

include/filesys/page_cache.h, filesys/page_cache.c

Page cache implementation that utilize vm functionalities. We strongly recommend you to use this template. But you might write down your own codes. Note that if you turn off the vm flag, you cannot use this template.

 

해당 코드는 Buffer Cache 부분을 진행할 때 사용이 될 것이다. 해당 파트를 진행할 때 더 자세히 살펴보긴 하겠지만, 파일의 일부분을 메모리에 caching해서 IO 속도를 높이는 것이 주 목적이며, 그토록 기피해왔던 timer_sleep()을 실용적으로 써먹을 기회 중 하나이기도 하다. 프로젝트 3 위에 프로젝트 4를 올린다면, 구현했던 vm 시스템을 활용해 일부 프레임을 cache로 활용할 수 있기 때문에 유용하게 쓸 수 있다.

 

Introduction 선에서는 뽑아먹을 수 있는게 이 정도인것 같다. 아직 다루지 못한 Subdirectories and Soft Links에서는 디렉토리 이름을 파싱해서 만들고, 관리하는 syscall을 구현하는 것이 목적인 것 같다. 마지막으로 진행해야 하는 Synchronization은 중요해보이므로 다른 어떤 것을 진행하기 전에 먼저 보고 가도록 하자. 왜 맨날 중요해 보이는 걸 마지막에 갖다놓고 전체 수정을 하게 만드는 걸까? 악랄한 놈들...

Comments