Pintos 구현 2번째 term을 마무리했다. 1번째 term에서는 쓰레드와 CPU 스케쥴링(우선순위 기반)을 다뤘다면, 2번째 term에서는
- User Memory Access
- Argument Passing
- System Call
등을 다뤘다.
이번 term은 어떻게 컴퓨터는 우리가 만든 프로그램 혹은 타이핑한 명령을 실행시켜주는가?에 대한 답을 얻은 term이었다.
좀 더 구체적으로 보자면,
등의 시스템 콜 구현을 통해 프로그램의 동작원리를 깨우칠 수 있었다.
이번 term에서 가장 힘들었던 건 아래의 2가지였다.
Kernel panic 등의 에러가 나도 정확히 에러의 근원이 어디인지 컴파일러가 명시적으로 알려주지 않기 때문에, 그 근원을 찾으러가는 과정에서 일어나는 고뇌는 머리를 어질어질하게 만들기 충분했다.
그렇기 때문에 이 회고를 읽는 다른 분들(pintos 구현을 하시는 분들)은 고생을 덜 하시라는 차원에서, 이번 term에 대한 팁을 몇 가지 남기고자 한다.
동기화에 대한 개념을 이해하고 넘어가라.
관련 글 :
- https://en.wikipedia.org/wiki/Readers–writers_problem
- https://velog.io/@seanlion/monitorsync
process_create_initd - thread_create - process_exec - load
로 이어지는 플로우에서 언제 semaphore count를 up,down 할지를 주의해서 설계해야 한다.메모리 free는 정확하게 하고 넘어가야 한다.
핀토스에서 테스트를 돌리다보면(make check
명령어로 실행), 메모리 누수 관련 테스트를 할 일이 생길거다.(multi-oom
같은)
어떤 함수 내에서 데이터를 사용하기 위해 메모리를 새로 할당했다면(malloc
), 함수가 종료되기 전에 free를 해줘야 한다.
할당한 메모리를 해제시키지 않으면 계속해서 쓸모없는 메모리가 남게 되는데, 핀토스의 메모리 크기가 큰 것도 아니라서 결국 언젠가 falut를 낼 수 있다.
malloc-free
뿐만 아니라 palloc_get_page - palloc_free_page
또한 메모리를 할당하는 함수이기 때문에 참고하면 좋겠다.
위와 마찬가지로 열었던 파일은 꼭 닫아야 한다.
파일을 open 한 뒤, 다시 close 하지 않으면 파일은 계속 open된 상태로 존재하는데, 이는 메모리 누수를 야기할 수 있다.
그렇기 때문에 프로세스를 exit할 때는 열려있던 모든 파일을 꼭 닫아주어야 한다.
이정도만 참고해서 시작해도 효율적인 코딩을 할 수 있을 것이다.
다음 term은 Virtual Memory이다. 핀토스 부분 중 가장 어려워보이는데, 잘 이겨내고 여러가지 배움을 얻을 수 있는 시간으로 만들고 싶다.