Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

seven05

[PintOS] 정글 WEEK10 WIL. PROJECT 3: VIRTUAL MEMORY + PROJECT 4: FILE SYSTEM 본문

SW JUNGLE 9기/Pintos

[PintOS] 정글 WEEK10 WIL. PROJECT 3: VIRTUAL MEMORY + PROJECT 4: FILE SYSTEM

박상비누 2024. 10. 21. 22:45

기간: 2024.10.08~2024.10.14

 

이번 Pintos 4주차에는 저번주차에 마무리한 mmap의 다음과제인 Swap I/O 과 Copy-on-write 그리고 Project 4 File system의 첫과제인 Indexed and Extensible file 중 Indexed 까지만 진행할수있었다. 이전과 마찬가지로 Pintos WIL은 과제의 내용이나 개념보다는(검색하면 나보다 훨씬 정리를 잘하는사람이 많기때문) 나만의 경험에 대해서 써보려고 한다.

 

1. Project1의 코드가 Project3에 와서 발목을 붙잡았다.

mmap을 다 구현했음에도 mmap-exit 테스트가 자꾸 실패하기에 테스트 코드를 보더라도 도저히 모르겠어서 swap구현을 먼저하러왔는데 swap을 전부 제대로 구현했음에도 swap-anon을 제외한 다른 테스트가 통과가 되지않기때문에 되게 절망적인 상황이였다 심지어 결과가 잘못된것이 아니라 kernel panic이 계속 발생했기에 더더욱 그랬는데... 너무 이상한 나머지 실패한 11개의 테스트 코드들의 공통점을 찾게되었고 모두 fork를 사용하는 테스트라는것을 알수있었다. 그리고 5개는 kernel panic 6개는 child (0,1,2,...) Fail이 발생했는데, 아무래도 이렇다보니 fork를 하고 테스트 코드가 돌아가는 중에 kernel panic이 오는 잘못된 주소참조가 일어나는것으로 보였다. 그래서 gdb로 child를 생성하는 테스트 코드인 page-merge-stk를 실행하고 돌려보았는데 아니 이럴수가 donate-priority 함수에서 Assert가 뜨는것을 확인할수있었다. project2에 있는 fork 관련 코드도 아니고 project1의 코드에서 Assertion이 생기는 상황에 당황스러울수밖에 없었다. 그래서 gdb에 다시 breakpoint를 걸고 확인해보았는데 wait_on_lock을 타고 lock으로 들어가 holder를 참조하는 과정에서 holder가 NULL인 상황이 발생하던것을 확인할수있었다. 우리가 project1을 할 당시에는 앞에서 lock을 잡고있는 쓰레드가 죽더라도 lock이 해제될것이라 생각하여 holder가 NULL인 상황 자체를 생각 하지않았는데 그런 상황이 발생해서 Assertion을 일으키고 있던 것이였다. (아직도 어떻게 하면 lock을 붙잡고있는 쓰레드가 죽었는데 lock이 살아있는지는 잘 모르겠다) 아무튼 우리는 project1 manual을 다시 살펴보았고 donation의 깊이를 8로 제한 해두라는 코멘트를 확인할수있었고, while로 wait_on_lock이 존재하는 한 끝까지 donation을 하던 코드는 depth를 8로 제한 거는 for문 코드로 고치고 나서야 vm의 fork를 사용하는 모든 테스트 코드들이 한번에 해결되었다.

 

2.Project 4에서 이전 project들의 테스트 코드들을 일단 pass하게 만드는것부터 힘들다.

이번 발표 주제로도 잡은 내용이지만 FILE SYSTEM 과제는 FAT를 구현하게 만들었다. 그렇게 manual에 적혀있는 첫 시작부터 fat.c만 고치면 되는것처럼 소개되어있다. 우리는 빠르게 Fat에 대한 공부를 마치고 fat.c에 있는 6개의 Todo가 적힌 함수만 구현하고 test를 돌려보았는데...

위처럼 therad의 테스트를 제외한 모든 테스트가 다 FAIL이 발생했다. 이때부터 매우 힘들었는데 앞의 project들은 manul을 따라가면 적어도 테스트가 어디까지 통과되고 이러한 안내가 있었는데 여기는 그런것이 존재하지않았다. 거의 2일을 코드의 흐름을 알아내는데 사용했던것 같고 [Pintos Project] File System - Indexed and Extensible Files 이 블로그 글을 참고 하고 나서 우리에게 무엇이 필요했는지 정확하게 파악할수있었다. filesys가 적용된 테스트 부터는 pintos가 2번 실행되면서 우리가 만든 filesys으로 한번 포멧한뒤에 그 filesystem에 테스트할 유저프로그램을 얹어서 테스트를 돌리는데 fat.c 함수만 수정한다고 fat 방식으로 filesystem이 생성되고 저장되는것이 아니였다. 그래서 filesystem을 생성하고 거기에 파일들을 저장하는 기본적인 연결고리들을 완성해주어야 테스트 코드를 돌릴수있었던 것이고 이를 위해서 여러가지 함수를 수정해줄 필요가 있었던 것이다.

길면서도 짧고 매우 힘들었던 pintos 기간이 종료되었다. 우리팀은 Project4의 아주 초반 부분까지만 할수있었고 최종 193개의 테스트 중에 49개가 실패하는것으로 마무리되었다. 주어진 과제는 project3까지이기는 했지만 project4를 진행해보니 project4까지 할수있는 시간이 주어졌다면 더 많은것을 배우고 가져갔을것같아서 조금의 아쉬움이 남아있다. 다른조에서 구현은 느리고 끝까지 못하더라도 특정 문제를 깊게파고 하는 부분을 볼때마다 내 공부 방법이 틀렸나 싶은 생각도 들긴했지만 빨리 달려서 파일 시스템을 공부해보면서 나도 나름의 챙겨가는것이 있다는 생각이 들어서 괜찮지않나 하고 넘어갈수있었다. 후... 나중에 파일시스템은 혼자서 더 찾아봐야겠다. 앞으로 남은 정글기간 마무리 잘해야겠다.