1 minute read

동시다발적으로 실행되는 프로세스 (스레드) 는 자원의 일관성을 보장해야 한다. -> 동기화를 고려해야 한다.

동기화의 의미

프로세스의 수행 시기를 맞추는 것

  • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
  • 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하기

Reader-Writer Problem

Writer : Book.txt 파일에 값을 저장하는 프로세스
Reader : Book.txt 팡리에 저장된 값을 읽어들이는 프로세스

이 두 프로세스는 아무렇게나 실행되어서는 안된다.
실행의 순서가 있기 때문

Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행 가능

Bank Account Problem

공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화

현재 계좌 잔액 10만원
프로세스 A : 현재 잔액에 2만원을 추가하는 프로세스
프로세스 B : 현재 잔액에 5만원을 추가하는 프로세스

프로세스 A, B를 동시에 실행하면 잔액은 얼마? 기대값 : 17만원
하지만 12만원, 15만원 등 예측할 수 없는 값이 나온다.
왜? 코드는 한 줄이어도, 기계어는 여러 줄이다. (읽어들이고, 변경하고, 저장하고) 이 사이에 문맥 교환이 일어나면 예상하지 못한 값이 나올 수 있다.

따라서 한 번에 한 프로세스만 접근 가능한 자원 (공유 불가 자원)은, 그 프로세스의 접근이 끝난 뒤에 다른 프로세스가 접근해야 한다.

Producer-Consumer Problem

Producer : 물건을 계속 생산 (총합 1 증가)
Consumer : 물건을 계속 소비 (총합 1 감소)
두 프로세스는 총합을 공유함
이 상태에서 생산자, 소비자를 각각 10만번 실행하면 ‘총합’은?
기대값 : 0
하지만 이 역시도 Bank Account Problem과 마찬가지로 예측하지 못한 값이 나올 수 있다.

공유 자원과 임계 구역

공유 자원 : 여러 프로세스 (스레드)가 공유하는 자원
임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

이런 임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있는데, 이를 경쟁 상태(Race Condition)이라고 한다.

운영체제가 임계구역 문제를 해결하는 세 가지 원칙

  1. 상호 배제 (Mutual Exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.
  2. 진행 (Progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면, 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  3. 유한 대기 (Bounded Wating) : 한 프로세스가 임계 구역에 진입하고 싶다면, 언젠가는 임계 구역에 들어올 수 있어야 한다. (임계 구역에 들어오기 위해 무한정 대기해서는 안된다.)