운영체제를 구현하면서 느낀 것들(2번째)

seanlion·2021년 2월 18일
0
post-thumbnail

Intro

Pintos 구현 2번째 term을 마무리했다. 1번째 term에서는 쓰레드와 CPU 스케쥴링(우선순위 기반)을 다뤘다면, 2번째 term에서는

- User Memory Access
- Argument Passing
- System Call

등을 다뤘다.

이번 term은 어떻게 컴퓨터는 우리가 만든 프로그램 혹은 타이핑한 명령을 실행시켜주는가?에 대한 답을 얻은 term이었다.

좀 더 구체적으로 보자면,

  • 어떻게 프로세스(혹은 스레드)를 종료시킬지(exit)
  • 어떻게 프로세스가 우리가 입력한 프로그램을 실행시킬지(exec)
  • 어떻게 프로세스가 파일을 읽고 쓰는지(read/write)
  • 어떻게 프로세스가 자식 프로세스를 만드는지(fork)

등의 시스템 콜 구현을 통해 프로그램의 동작원리를 깨우칠 수 있었다.

이번 term에서 가장 힘들었던 건 아래의 2가지였다.

  • 프로세스 간의 적절한 동기화 시점을 파악하는 것(semaphore & lock)
  • 시스템 콜 간의 연계로 인해 더욱 복잡해진 디버깅(특히 fork, wait...)

Kernel panic 등의 에러가 나도 정확히 에러의 근원이 어디인지 컴파일러가 명시적으로 알려주지 않기 때문에, 그 근원을 찾으러가는 과정에서 일어나는 고뇌는 머리를 어질어질하게 만들기 충분했다.

그렇기 때문에 이 회고를 읽는 다른 분들(pintos 구현을 하시는 분들)은 고생을 덜 하시라는 차원에서, 이번 term에 대한 팁을 몇 가지 남기고자 한다.

Tips

  1. 동기화에 대한 개념을 이해하고 넘어가라.
    • lock, semaphore, monitor에 대한 이해는 필수이다. 특히 monitor에 대한 이해를 꼭 하고가는걸 추천드린다.
    • 대표적인 동기화 문제 reader/writer 문제를 한번 보면 핀토스의 동기화도 금방 이해할 수 있을 것이다.

관련 글 :
- 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 할지를 주의해서 설계해야 한다.
  1. 메모리 free는 정확하게 하고 넘어가야 한다.
    • 핀토스에서 테스트를 돌리다보면(make check 명령어로 실행), 메모리 누수 관련 테스트를 할 일이 생길거다.(multi-oom 같은)

    • 어떤 함수 내에서 데이터를 사용하기 위해 메모리를 새로 할당했다면(malloc), 함수가 종료되기 전에 free를 해줘야 한다.

    • 할당한 메모리를 해제시키지 않으면 계속해서 쓸모없는 메모리가 남게 되는데, 핀토스의 메모리 크기가 큰 것도 아니라서 결국 언젠가 falut를 낼 수 있다.

    • malloc-free 뿐만 아니라 palloc_get_page - palloc_free_page 또한 메모리를 할당하는 함수이기 때문에 참고하면 좋겠다.

  2. 위와 마찬가지로 열었던 파일은 꼭 닫아야 한다.
    • 파일을 open 한 뒤, 다시 close 하지 않으면 파일은 계속 open된 상태로 존재하는데, 이는 메모리 누수를 야기할 수 있다.

    • 그렇기 때문에 프로세스를 exit할 때는 열려있던 모든 파일을 꼭 닫아주어야 한다.

이정도만 참고해서 시작해도 효율적인 코딩을 할 수 있을 것이다.

다음 term은 Virtual Memory이다. 핀토스 부분 중 가장 어려워보이는데, 잘 이겨내고 여러가지 배움을 얻을 수 있는 시간으로 만들고 싶다.

profile
소프트웨어 엔지니어링을 연마하고자 합니다.

0개의 댓글