두다지 서버 개발자 양성 프로그램 Week 6

6번 째 멘토링

운영체제 남은 후반부를 학습한 후, 학습한 내용에 대한 정리를 하였다. 또한 운영체제 후반부에서 가장 중요한 부분 중 하나인 Concurrency Control(병행 제어)의 경우, 단순 학습에서 그치는 것이 아니라 Spinlock, Semaphore, Producer & Consumer Problem을 직접 소스 코드를 통해 구현해보며 해당 챕터에 대한 이해를 더할 수 있었다. 이 중 Spinlock의 경우, 초반에 이해를 잘못하여 올바른 소스 코드를 작성하지 못하였지만 다른 두 문제의 경우 의도한 대로 잘 작성할 수 있었다. 멘토링 시간에는 정리한 내용에 대한 이야기와 작성한 소스코드에 대한 리뷰를 진행하였다.

학습한 것에 대한 리뷰

  • Block & Wake-up Semaphore는 특정 PID에 Signal을 보내는 방식으로 구현 가능
    • 즉, Wake-up에 대한 책임은 현재 Running 중인 프로세스에게 있음
    • 이 때의 Semaphore는 Lock보다는 Signal을 위한 용도에 가까움
  • Wake-up의 방법 2가지
    • Blocked 된 프로세스들 중 하나를 Wake-up
      • 어떤 프로세스를 깨울 것인가에 대한 문제 존재
    • Blocked 된 프로세스들 전체를 Wake-up
      • 하나의 프로세스만을 running으로 변경하고, 다른 프로세스들을 다시 Blocked 시켜야 하는 Overhead 존재
  • Producer & Consumer Problem에서 2개의 Semaphore를 사용(Event-driven)하면 필연적으로 Busy Waiting보다 느리게 됨
    • CPU를 다 사용하면서, Lock-Free Queue를 사용하면 성능 향상 가져올 수 있음 -> But, Rare case
  • Semaphore에서 자원을 가감해주는 연산(R, V) 역시 공유 자원을 건들이는 것이기 때문에, 연산 전/후에 짧은 Busy-waiting을 통해 Lock을 걸어주어야 함

Operation System

  • Peterson's Algorithm은 현대에 더 이상 사용되지 않음
    • 현재는 Test_and_set과 compare_and_swap의 atomic한 연산을 사용
      • Test_and_set을 while문으로 기다려주는 것이 가장 쉬운 작성법
    • Write 이후에 스케줄링 때문에 context switch가 발생할 위험이 없어지게 됨
  • 언제 스케줄링해야 할지 모른다?
    • Generl Purpose OS의 경우, 운영체제와 어플리케이션단을 분리
      • General Purpose OS는 Virus 때문에 무조건 선점을 해야 함
      • OS 주도 하에 스케줄링을 진행하기 때문에 해당 순서도 OS가 바꿀 수 있음
      • 본질은 Read와 Write를 함께 할 수 없을까에 관한 것
    • Embedded OS의 경우, 운영체제와 어플리케이션이 함께 작동
      • 어플리케이션이 동작이 끝나면 자신의 종료를 Signal을 통해 알리며 운영체제에게 스케줄링 타이밍을 알림(비선점형)
  • 본인의 서비스의 형태에 따라, Busy-waiting or Block/wake-up 방식을 채택할 수 있어야 함
    • 즉, 개발자는 본인의 서비스가 어떻게 작동하는지를 본인이 가장 잘 알아야 함
  • 대부분의 연산의 경우, Lock을 잡으면 반드시 unlock을 하고 싶어 함
    • Semaphore의 경우, V-P를 할 수 있음(Dining Philosophers 문제 참조)
  • Java의 synchronized, Python의 with와 같은 개념이 다 Monitor
    • 프로그래머의 실수를 줄이면서, 병행 제어의 역할 수행 가능
  • 프로세스(혹은 쓰레드)를 Module화 할 때는 서로 공유하는 부분이 최대한 적게 하는 것이 좋음

다음 주 까지의 assignment

  • 'Computer Networking: A Top-down approach' 정리
  • 이후 과제: UDP 소켓 프로그래밍으로 TCP 구현
  • 추가적으로 '후니의 쉽게 쓴 네트워크 프로그래밍' 읽어보면 좋음


+ Recent posts