> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/11-..md).

# 11강. 프로세스 동기화

#### 개요

* 분리된 상태에서 동시에 실행되는 쓰레드들이 공유하는 데이터는 데이터의 무결성이 깨질 수 있다.
* 컨텍스트 스위칭이 발생하는 타이밍은 운영체제에 달려있다. 즉, 특정 쓰레드가 데이터의 제어권을 가지고 있는 타이밍은 예측이 불가능하고, Thread-safe하지 않은 작업은 공유 데이터의 값이 예상과 다르거나 매번 다를 수 있다는 점

<br>

#### Race Condition (경쟁 상황)

* N개 이상의 프로세스 혹은 쓰레드가 동시에 하나의 데이터를 공유한다면, 작업 순서에 따라 결과값이 달라질 수 있다
* 경쟁 상황을 해소하기 위해서, 데이터에 접근하는 하나의 프로세스만 접근할 수 있다면 문제가 발생하지 않는다. 이를 `Process Syncronization`이라고 한다.
* 대표적인 상황은 계좌 이체 시, 입금과 출금 순서에 따른 문제.

<br>

#### 임계 영역 문제

* N개의 프로세스가 특정 코드 영역을 임계 구역으로 지정하여, 다른 프로세스들은 해당 구역에 진입할 수 없도록 규정하면 경쟁 상황이 발생하지 않는다. Java에서 `Syncronized` 키워드처럼
* 그래서 진입점은 Entry Section, 출구를 Exit Section으로 규정한다.
* 임계 영역의 목표는

1. 상호 배제 - 가장 기본적인 목표
2. Dead Lock 회피 - 아무도 임계 영역에 진입하지 못하는 상황이 발생하면 안된다.
3. Starvation 회피 - 대기 시간은 한정되어야 한다. 영영 기다리기만 하면 곤란하다.

* 하지만 실제로는 모든 목표를 달성하기 어렵고, 데드락이나 기아가 발생하면 그냥 종료해버리는 방식을 채택함. → 확률은 이미 충분히 낮춰놨고 이를 영영 방지하는 것보다 기아나 데드락이 발생했을 때 판을 엎어버리는게 차라리 효과적인 케이스가 많음

\
\ <br>
