WEEK[08~13] PintOS Project 4 File System까지의 간단한 회고

yeopto·2022년 6월 27일
0

SW사관학교 정글

목록 보기
13/14
post-thumbnail

Pintos 프로젝트가 오늘부로 마무리 되었다. 6주. 긴 여정이었다. 사실 File System에 관련된 WIL을 작성하려했지만 Project4는 시간도 짧았고, 내용이 방대하고 너무 어려웠다.(git book에 너무 정보가 없었음) 또, Jack의 로직을 흡수하기엔 내 그릇이 너무 작았다...! 테스트 케이스 두개 제외하고 다 통과했지만, 나의 project4 기여도는 5퍼정도랄까..(jack 전부..) 그래서 사실 WIL을 제대로 작성할 수 없다고 생각했다. 쓰게 된다면 내 지식이라기보단 Jack형의 지식을 쓰는 것이라 생각이 들었다.(제대로 쓰려면 3~4일은 공부해야할 듯) Pintos가 끝나고 이제 "나만의 무기" 여정이 시작되는데 6주를 한번 돌아보면서 새로운 마음가짐을 가지면 좋을거같았고, 기록하고 싶은 마음에 회고를 쓰게되었다.

Project 1 - Threads

대망의 pintos 첫 주가 시작됐다. 운영체제에 대해 "윈도우", "맥OS", "Linux" 이 이상 알고 있는게 없는 상태였다. 하지만 "Malloc도 구현해보고, Web proxy도 구현해보고 뭐 해봤는데 하면되겠지~" 라는 근자감은 굉장히 큰 착각에 오만함이었다.. 추상화.. abstraction.. 이 추상화 속을 이해하기란 쉽지가 않았다. 지금 타자를 치고 있는 이 순간에도 컴퓨터에선 굉장한 일들이 일어나고 있다.. 이걸 이해하기란 정말 어려웠다. 여튼 첫 주제를 키워드로 말하자면 가상화, race condition, context switching, 스케줄링, 인터럽트, 동기화 등이 있다. 프로세스가 실행되는 과정들을 알 수 있는 과제였다. 스케줄링은 어떻게 일어나는지, 우선순위를 어떻게 줄 것인지, 그리고 스케줄링된 컨텍스트로 컨텍스트 스위칭이 일어날텐데 그 과정은 어떻게 일어나고, 그 사이에 일어나는 인터럽트라는 것은 무엇이고 발생하면 어떻게 되는지, synchronization를 하기 위해선 공유 자원을 독점 할 수 있도록 해야하는데 그러기 위해(race-condition을 막기 위해) 임계영역(한순간에 반드시 하나의 프로세스 또는 스레드만이 진입해야함)을 어떻게 보장할 것(락, 세마포어 등)인지 등을 공부했다. prj1을 하면서 가장 기억에 남는것은 질문하나를 위해 6시간이나 걸렸다는 점이다. 질문을 하기위해선 내가 무엇을 모르는지 명확하게 해야하는데, 명확하게 하려고 정리하는 과정이 쉽지 않았다. 내가 뭘 모르지하고 생각을 따라가면서 비워진 지식들을 채우다보면, 처음에 내가 궁금했던 것이 해결되는것들 있었다. 평상시에 이렇게 생각하지 않고 무지성으로 이거 모르겠어요 떠먹여주세요 해왔던 내 자신을 반성을 했다. 질문을 논리정연하게 잘 정리해서 하게되면 정말 질 좋은 답변을 받을 수 있었다. 질문은 이렇게 해야되구나를 느꼈고, 이런 식으로 질문을 많이 하다보면 정말 많이 알아갈 수 있겠다 생각했다.

Project 2 - User Programs

prj2는 유저 프로그램 실행을 위한 시스템을 구현하는 것이었다. 키워드론 Usermode, Kernelmode, System call, argument passing, user stack등이 있다. 유저 프로그램을 실행하기 위해 인자를 어떻게 전달해야 하며, 어떻게 실행시킬 것인지, 각 시스템 콜은 어떻게 호출되는지 파일 시스템 콜은 어떤 흐름이며, 프로세스 관련 시스템 콜은 어떤 흐름인지 공부했다. 또, protection을 위해 user mode에서 system call을 통해 kernel mode로 바뀌는 과정, 프로세스 메모리 구조는 어떻게 되어있고, 물리메모리에서 커널 영역 구조는 어떻게 되어있는지 등을 알아보았다. prj2는 prj1과 다르게 코드부터 봤는데 나한텐 역시 비효율적이었다. 지식의 흐름이 이어지지 않고 파편화 되어있다. 또, 조원들 마다 지식의 차이가 있기도하고 추구하는 공부 방향도 달라서 서로가 다 개인적으로 진행했는데 이 방대한 지식을 혼자서 하기엔 역시 무리였다. 깊게 팔 수가 없었고 뭔가 껍데기만 공부한 느낌이다. 아쉬움 많았던 prj2였고 그 스노우볼은 prj3때 굉장히 크게 다가왔다.. 협업능력이 생각보다 굉장히 부족하다고 느꼈던 프로젝트였다.

project 3 - Virtual Memory

prj3은 가상 메모리를 어떻게 관리할 것인지에 대해 알아보는 프로젝트였다. 페이징기법에서 페이지는 어떻게 만들어지고 프레임은 어떻게 만들어져서 페이지와 프레임은 어떻게 매핑되는지, 페이지와 프레임은 어떻게 관리를 할 것인지(spt, frame_table), 관리를 위해 어떤 자료구조를 사용할 것인지(doublely linked_list, hash 등), 메모리를 효율적으로 관리하기 위해 lazy-load를 해야하는데 어떻게(page-fault) 할 것인지, swap in/out은 어떻게 되는 것인지, eviction을 어떤 방식으로 해서 swap out을 할 것인지 등을 공부했다. prj3은 굉장히 힘들면서 뿌듯했던 프로젝트였다. 3이 시작되고 그 주 티 타임때 운영진분들이 어려운 것 알겠지만 "Critical Thinking"을 기르기 위해서 정답 같이 보이는 코드를 참고하지말라 하셨다. prj 1,2 때 나는 떠돌아다니는 핀토스 코드들을 이것저것 다 참고했다. prj2때는 여러 사람들걸 참고하다보니 사람들마다 로직이 다를텐데 짬뽕시키다 보니까 돌아가지도 않고 디버깅이라기보단 틀린그림찾기하는데 시간을 쏟았다. prj2가 끝나고 굉장히 허탈한 감정이었어서 git book만 보고 해봐야겠다는 생각을 하면서도 과연 내가 코드를 참고하지 않고 이걸 할 수 있을까라는 걱정을 했고 겁을 많이 먹었다. 프로젝트 초반엔 지식들이 구멍이 나 있어서 (특히 파일 관련) 굉장히 어려웠다. 뭔가 팀에 민폐인거같고 모르면 물어보는데 이해가 느려서 팀원을 많이 답답하게 했다. 멘탈이 많이 나갔지만 팀원들이 잘할 수 있다고 멘탈을 계속 잡아줬다. 나는 어렵다고 겁부터 먹지 않도록 노력했다. 겁 먹지 않으니 귀가 열리기 시작했고 나도 할 수 있었다.(전에 비해) 정글에서 제일 팀플답게 했던 프로젝트였다. 다 같이 나와서 같이 들어가고, 협업 툴도 쓰고, 챕터마다 회고도 하고, 팀 단위로 움직이고 행동했다. 팀원들은 날 어떻게 생각할지 모르지만 나는 케미가 참 잘 맞았던 조원들이었다.(나만 그럴 수도ㅋ 근데 재관스파르타코딩클럽 빡셈ㅋ) 그리고 빈 지식을 다는 아니지만 꽤나 채울 수 있어서 좋았고, 지난 프로젝트의 아쉬움도 달랠 수 있었다. 또, 지식뿐 만이 아닌 jack을 보고 프로그래밍을 대하는 자세에 대해서도 생각해보고 많은걸 느낀 프로젝트였다.

Project 4 - File System

git book에 내용도 많이 없고 굉장히 어려웠다.(자료도 진짜 없음..) indexed and extensible file까지는 어떻게든 따라가려고 노력했는데 subdirectory부터는 Jack의 머릿속을 따라가기가 너무 어려웠다. 또 이해하기에 시간도 너무 오래걸렸다. 한주동안 나만의 무기 이슈로 분위기도 싱숭생숭하고 공부가 잘 되지않았다. 팀에 도움이 많이 못돼서 아쉬웠다. 핀토스 파일시스템 너무 방대하고, 깃북이 불친절하다..

마무리

마지막에 유종의 미를 못 거둔것 같아 많이 아쉽긴하다. pintos 정말 어려웠고 하는 동안에 힘들기도 했지만 뿌듯할 때도 있었다. 끝나니 후련하면서도 시원섭섭하다. 조금만 더 열심히 할 수 있지 않았나라는 아쉬움이 좀 남는거 같다.(머리가 안따라주는건가?) 이제 나만의 무기라는 진짜 마지막 프로젝트가 시작된다. 정글 입소 첫 날보단 많이 성장했기를 기대하며 내가 하고 싶었던 공부를 할테니까 이왕 하는거 즐기려고 한다. 5주 뒤의 나는 또 어떤 모습일지 기대가 된다. 나만무 화이팅~~

profile
https://yeopto.github.io로 이동했습니다.

0개의 댓글