> 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/12..md).

# 12. 프로세스 동기화 해결책

<br>

### 피터슨 알고리즘

* 특정 플래그 값을 기준으로 임계영역의 진입 가능 여부를 판별하는 방식
* 단, 해당 방식은 완전히 동기화를 보장하지는 않는다. 기계어 레벨에서 생각하지 않는다면 load, store 과정에서 context switching이 일어나면서 데이터 불균형 문제가 발생한다.
* 두개의 프로세스가 공유하는 변수 (flag, turn)를 사용하여 임계 영역에 진입할 수 있는 권한을 확인한다.
* 두 프로세스가 번갈아가며 임계영역 진입 가능 여부를 확인하기 때문에 CPU 리소스를 활용하는데 비효율이 발생한다.
* 상호 배제, 데드락 회피, 기아 회피를 모두 충족하지만 문제가 없는 것은 아니다.

<br>

#### 원자성

* 특정 동작의 원자성을 보장하기 위해서, 하나의 명령을 여러 개의 기계어로 쪼개지 말고 한번에 실행되도록 하드웨어를 지원한다. (명령어 회로를 만들어버림)
* 근데 이건 하드웨어 개발자들이 할 일이라… 어셈블리 개발 할 것도 아니고…
* Java에선 Atomic Variable을 지원하기 때문에 이걸 쓰면 된다. 내부적으론 하드웨어 레벨까지 내려가지만 굳이 알 필요는…
