diff --git "a/9\354\243\274\354\260\250/heehee.md" "b/9\354\243\274\354\260\250/heehee.md" new file mode 100644 index 0000000..077a4fe --- /dev/null +++ "b/9\354\243\274\354\260\250/heehee.md" @@ -0,0 +1,69 @@ +# 프로세스 동기화 + +## 동기화의 의미 +프로세스들의 수행 시기를 맞추는 것 +- 실행 순서 제어를 위한 동기화 : 프로세스를 올바른 순서대로 실행하기 +- 상호 배제를 위한 동기화 : 한 번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화 + +## 임계 구역(Critical Section) +- 공유 자원: 여러 프로세스 혹은 스레드가 공유하는 자원 + ex. 전역 변수, 파일, 입출력 장치 등등 +- 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 + +### 운영체제가 임계구역 문제를 해결하는 세 가지 원칙(= 상호배제를 위한 동기화) +1. 상호배제(Mutual Exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다. +2. 진행(Progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야한다. +3. 유한대기(Bounded Waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다. + +# 동기화 기법 +## 뮤텍스 락(Mutex Lock) +상호 배제를 위한 동기화 도구(자물쇠 역할) + +- 뮤텍스 락의 단순한 형태: 전역 변수 하나, 함수 2개 + +1. 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock +2. 임계 구역을 잠그는 역할: acquire 함수 +3. 임계 구역의 잠금을 해제하는 역할: release 함수 + +```c +acquire(){ + /* 바쁜 대기(busy waiting): + 임계 구역이 잠겨있는지를 반복적으로 확인하는 작업 */ + while (lock == true) + ; + lock = true; +} + +release(){ + lock = false; +} + +acquire(); // 자물쇠가 잠겨있는지 확인, 잠겨있지 않다면 잠그고 들어가기 +//임계 구역 // 임계 구역에서의 작업 진행 +release(); // 자물쇠 반환 +``` + +## 세마포(Semaphores) +좀 더 일반화된 방식의 동기화 도구로, 공유 자원이 여러개 있는 경우에도 적용 가능 +
+ +- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기 +- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입 +- 세마포의 단순한 형태: 전역변수 하나, 함수 두개 + +1. 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S +2. 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수 +3. 임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수 + +### Busy waiting 문제 +- CPU 사이클 낭비 +
+- 해결 방법 + - 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 + - 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 + +## 모니터 +세마포어에서 매번 임계 구역 앞뒤로 wait(), signal()을 호출해야하는데 실수한다면?
+그래서 등장한 것이 모니터
+사용자(개발자)가 다루기에 편한 동기화 도구 +- 세마포어는 직접 키 해제와 공유자원 접근 처리를 해주어야 하는 반면, 모니터는 공유자원에 접근할 수 있는 키의 획득과 해제를 모두 함수로 처리해준다. \ No newline at end of file