동기화
협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화되어야 한다.
그렇다면 프로세스 동기화란 무엇일까?
간단히 말해 프로세스들 사이의 수행 시기를 맞추는 것이다. 수행 시기를 맞추어 프로세스 간에 정보를 일치시키는 것이다.
수행 시기를 맞춘다엔 크게 두 가지를 말한다.
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근
실행 순서 제어를 위한 동기화
실행 순서 제어를 위한 동기화는 쉽게 예를 들 수 있다.
Wirter라는 프로세스와 Reader라는 프로세스가 동시에 실행 중이다.
Writer는 Book.txt 파일에 값을 저장하는 프로세스, Reader는 저장된 값을 읽어 들이는 프로세스이다.
Reader 가 Writer보다 먼저 실행되면 제대로 된 실행 순서가 아니다.
이런 식으로 올바른 순서에 맞게 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화이다.
상호 배제를 위한 동기화
공유가 불가능한 자원의 동시 사용을 피하기 위해 사용된다.
예로 바로 들어보자.
동기화 x
프로세스 A | 프로세스 B | 변수 x |
변수를 읽는다 | 0 | |
y = x + 2; | 0 | |
문맥 교환 | 0 | |
변수를 읽는다 | 0 | |
z = x + 5; | 0 | |
x = y; | 2 | |
x = z; | 5 | |
최종 x == 5 |
동기화 o
프로세스 A | 프로세스 B | 변수 x |
변수를 읽는다 | 0 | |
y = x + 2; | 0 | |
문맥 교환 | 0 | |
x = y; | 2 | |
변수를 읽는다 | 2 | |
z = x + 5; | 2 | |
x = z; | 7 | |
최종 x == 7 |
이렇게 동시에 접근해서는 안 되는 자원(변수 x)에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화이다.
공유 자원과 임계 구역
위에서 나온 변수 x와 같이 공동의 자원을 공유 자원이라고 한다.
그리고 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역이라고 한다.
임계 구역에는 한 순간에 반드시 하나의 프로세스만 진입해야 한다.
여러 프로세스가 동시에 임계 구역에 진입하는 것을 레이스 컨디션이라고 한다.
상호 배제를 위한 동기화를 위해서는 세 가지 원칙이 반드시 지켜져야 한다.
- 상호 배제 mutual exclusion: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행 progress: 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기 bounded waiting: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다(임계 구역에 들어오기 위해 무한정 대기해서는 안 된다).
참고
혼자 공부하는 컴퓨터구조 + 운영체제 <강민철>