Chapter 12 프로세스 동기화 - goorm-6th-Als/for_study_Algorithm GitHub Wiki
동기화
특정 자원에 접근할 때 한개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것을 의미합니다.
프로세스 들사이의 수행 시기를 맞추는 것
- 실행 순서 제어

Book.txt 을 파일에 내용을 작성하거나, 가져오는 프로세스인 Writer, Reader 프로세스가 있다고 가정을 해봅시다.
이 두 프로세스는 동시에 실행이 되어서는 안됩니다. Writer 프로세스가 실행이 끝나고, Reader 프로세스가 실행이 되어야 하듯이 실행의 순서를 의미합니다.
- 상호 배재
공유가 불가능한 동시 사용을 피하기 위해 사용하는 알고리즘
하나의 프로세스가 접근해 있는 자원에 다른 프로세스가 접근하지 못하게 해야하는 것이 상호 배제를 위한 동기화입니다.


위의 동기화를 지키지 못하면, 10만원이 있는 통장에 동시 5만원 3만원을 입금하면 원하는 값은 18만원이 오지 않고, 13만원이 출력될 수 도 있습니다.
시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 메모리, 파일 데이터 등의 자원이나 변수를 의미합니다
공유 자원에 둘이상의 프로세스가 동시에 접근하여 결과값에 영향을 줄 수 있는 상태를 의미합니다
- 공유 데이터 접근
여러 스레드 또는 프로세스가 공유된 메모리나 파일 등의 데이터에 동시에 접근하고 수정하려고 경우
- 자원 예약
여러 스레드나 프로세스가 공유된 자웜을 동시에 예약하려고 경우
- 상태 업데이트
여러 스레드나 프로세그가 동시에 공유된 상태를 업데이트하려고 할 때 경쟁 상태가 발생할 수 있다.
공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역
- 상호 배제
한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
- 진행
임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야한다.
- 유한 대기
한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.
출처
상호 배제를 위한 동기화 도구
뮤텍스 락은 하나의 전역 변수와 두 개의 함수로 구현 가능
- 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할: acquire 함수
- 임계 구역의 잠금을 해제하는 역할: release 함수
바쁜 대기 : 프로세스가 반복적으로 lock을 확인하는 것
공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구
세마포는 하나의 변수와 두 개의 함수로 구현 가능
- 전역 변수 S: 임계 구역에 진입할 수 있는 프로세스 수 (사용 가능한 공유 자원의 수)
- wait 함수: 임계 구역에 들어갈지, 기다릴지 알려주는 함수
-
signal 함수: 임계 구역 앞에서 기다리는 프로세스에 '가도 좋다' 신호를 주는 함수
공유 자원이 없는 경우, 프로세스는 무한히 반복하며 S 확인 -> CPU 주기 낭비
ex) 공유 자원 2개, 프로세스 3개
S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait 함수룰 붙임
공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리. 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근 가능
공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수인 조건 변수를 사용
조건변수.wait() : 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
조건변수.signal() : wait()으로 대기 상태에 접어든 조건변수를 실행 상태로 변경