Skip to content
This repository was archived by the owner on Dec 10, 2025. It is now read-only.
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions 9주차/heehee.md
Original file line number Diff line number Diff line change
@@ -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)
좀 더 일반화된 방식의 동기화 도구로, 공유 자원이 여러개 있는 경우에도 적용 가능
<br/>

- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
- 세마포의 단순한 형태: 전역변수 하나, 함수 두개

1. 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
2. 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
3. 임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수

### Busy waiting 문제
- CPU 사이클 낭비
<br/>
- 해결 방법
- 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦

## 모니터
세마포어에서 매번 임계 구역 앞뒤로 wait(), signal()을 호출해야하는데 실수한다면?<br/>
그래서 등장한 것이 모니터<br/>
사용자(개발자)가 다루기에 편한 동기화 도구
- 세마포어는 직접 키 해제와 공유자원 접근 처리를 해주어야 하는 반면, 모니터는 공유자원에 접근할 수 있는 키의 획득과 해제를 모두 함수로 처리해준다.