두다지 서버 개발자 양성 프로그램 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 존재
- Blocked 된 프로세스들 중 하나를 Wake-up
- 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가 발생할 위험이 없어지게 됨
- 현재는 Test_and_set과 compare_and_swap의 atomic한 연산을 사용
- 언제 스케줄링해야 할지 모른다?
- Generl Purpose OS의 경우, 운영체제와 어플리케이션단을 분리
- General Purpose OS는 Virus 때문에 무조건 선점을 해야 함
- OS 주도 하에 스케줄링을 진행하기 때문에 해당 순서도 OS가 바꿀 수 있음
- 본질은 Read와 Write를 함께 할 수 없을까에 관한 것
- Embedded OS의 경우, 운영체제와 어플리케이션이 함께 작동
- 어플리케이션이 동작이 끝나면 자신의 종료를 Signal을 통해 알리며 운영체제에게 스케줄링 타이밍을 알림(비선점형)
- Generl Purpose OS의 경우, 운영체제와 어플리케이션단을 분리
- 본인의 서비스의 형태에 따라, 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 구현 - 추가적으로 '후니의 쉽게 쓴 네트워크 프로그래밍' 읽어보면 좋음
'Non-school Course' 카테고리의 다른 글
두다지 서버 개발자 양성 프로그램 Week 8 (0) | 2018.10.13 |
---|---|
두다지 서버 개발자 양성 프로그램 Week 7 (0) | 2018.10.04 |
두다지 서버 개발자 양성 프로그램 Week 5 (0) | 2018.09.27 |
두다지 서버 개발자 양성 프로그램 Week 4 (0) | 2018.09.11 |
두다지 서버 개발자 양성 프로그램 Week 3 (0) | 2018.09.11 |