프로세스 동기화
1. 정의
1개의 자원을 한 순간에 1개의 프로세스만이 이용하도록 제어하는 것
2. 목적
- 두 개 이상의 프로세스가 공유된 자원에 동시 접근하면 데이터 불일치(data inconsistency)가 발생할 수 있기 때문에 일관성을 유지하기 위한 매커니즘(동기화)가 필요함
ㄴ 동일한 자원을 동시에 접근하는 작업(공유변수 사용, 동일 파일 사용)을 실행하는 코드 영역 : Critical Section
3. Critical Section Problem (임계영역 문제)
- 프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계하는 것
1) Requirements(해결을 위한 기본조건)
상호배제(Mutual Exclusion)
- Critical section을 가진 스레드의 런타임이 겹치지 않게 하는 것 / 프로세스 P1이 Critical Section에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section에서 실행될 수 없음
- locking, unlocking 사용
진행(Progress)
- Critical section에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로 참여될 수 있음
한정된 대기(Bounded Wating)
- 프로세스 P1이 Critical section에 진입 신청 후, 받아들여질 때까지 다른 프로세스들이 Critical section에 진입하는 횟수는 제한이 있어야 한다.
2) 해결책
1) Mutex Lock
- 동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section에 진입하는 프로세스는 Lock를 획득하고, 빠져나올 때 Lock을 방출함
- 한계 : 다중처리기 환경에서는 시간적인 효율성 측면에서 적용할 수 없음
2) Semaphores
lock / unlock 기능 , 공유 자원을 획득하게 해줌
-
복수개의 스레드가 임계 구역에 접근 가능
-
wait, signal로 구현
-
wait이 먼저 호출되어 임계 구역에 들어갈 수 있는지, 우선적으로 실행되어야 할 스레드가 실행되는지 확인
-
세마포어는 뮤텍스가 될 수 있지만 그 반대는 안됨
-
Counting semasphore, Binary semapore
문제점1) Deadlock (둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 event를 무한히 기다리는 현상)
=> P0과 P1는 S와 Q를 동시에 가질 수 없음, 자원 갖는 순서를 (S->Q)로 지정하면 해결 가능.
문제점2) Starvation : 프로세스가 suspend된 이유에 해당하는 semaphore 큐에서 빠져나갈 수 없는 현상
3) 모니터
- 고급 언어의 설계 구조물 = 라이브러릴 혹은 프레임워크가 제공 (Java에 존재)
- syncronized, wait(), notify() 등의 키워드로 편하게 동기화 가능
참고
https://velog.io/@suuhyeony/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Ch6.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%8F%99%EA%B8%B0%ED%99%94