[혼자 공부하는 컴퓨터구조+운영체제]12장 프로세스 동기화
12-1 동기화란
동기화의 의미
- 프로세스 동기화: 프로세스 간의 수행 시기를 맞추는 것
- 실행 순서 제어: 동시에 실행되는 프로세스를 올바른 순서대로 실행
- 상호 배제: 동시에 접근 불가한 자원에 하나의 프로세스만 접근을 허용
- 생산자와 소비자 문제: 고전적인 상호 배제를 위한 동기화 문제
- 스레드 또한 동기화의 대상이다.
공유 자원과 임계 구역
- 공유 자원: 공동으로 이용하는 변수, 파일, 장치 등의 자원
- 임계 구역: 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- 레이스 컨디션(race condition): 여러 프로세스가 동시에 임계 구역의 코드를 실행하여 발생하는 문제
- 컴퓨터는 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정 중간에 문맥 교환 가능
⇒ 데이터의 일관성이 깨지는 경우 발생
- 컴퓨터는 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정 중간에 문맥 교환 가능
- 상호 배제를 위한 동기화 원칙
- 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입하면 다른 프로세스는 임계 구역 진입 불가
- 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 진입 가능
- 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 진입 가능
- 임계 구역에 진입하기 위해 무한정 대기하면 안 된다.
12-2 동기화 기법
뮤텍스 락
- MUTual EXclusion lock, Mutex
- 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는, 상호 배제를 위한 동기화 도구
- 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어두어 다른 프로세스의 진입을 막는 방법
- 단순한 뮤텍스 락의 구성
- 자물쇠 역할 ⇒ 프로세스가 공유하는 전역 변수 lock
- 임계 구역이 열려있는 경우 false, 잠겨 있는 경우 true
- 임계 구역을 잠그는 역할 ⇒ acquire 함수
- 프로세스가 임계 구역에 진입하기 전 호출
- 임계 구역이 잠겨 있다면 열릴 때까지 반복적으로 확인 ⇒ 바쁜 대기(busy wait)
- 임계 구역이 열려 있다면 임계 구역을 잠그는 동작 수행
- 임계 구역의 잠금을 해체하는 역할 ⇒ release 함수
- 임계 구역에서의 작업이 끝나고 호출
- 잠긴 임계 구역을 여는 동작 수행
- 자물쇠 역할 ⇒ 프로세스가 공유하는 전역 변수 lock
- 하나의 공유 자원에 접근하는 프로세스를 상정한 방식
세마포
- semaphore
- 뮤텍스 락과 비슷하지만 더 일반화된 방식
- 공유 자원이 여러 개 있는 상황에서 적용 가능한 동기화 도구
- 임계 구역 앞뒤로 wait과 signal 함수를 매번 올바르게 명시해야 한다는 단점 존재
상호 배제를 위한 동기화
- 카운팅 세마포를 이용한 단순한 구성
- 임계 구역에 진입할 수 있는 프로세스의 개수 ⇒ 전역 변수 S
- 사용할 수 있는 공유 자원의 개수를 나타냄
- 임계 구역 진입 가능 여부를 알리는 신호 ⇒ wait 함수
- 만일 S가 0 이하라면 반복적으로 자원을 확인 ⇒ 바쁜 대기
- S가 1 이상인 경우 1만큼 감소시키고 임계 구역 진입
- 임계 구역을 기다리는 프로세스에 주는 허락 신호 ⇒ signal 함수
- 임계 구역에서의 작업을 마치고 S를 1만큼 증가
- 임계 구역에 진입할 수 있는 프로세스의 개수 ⇒ 전역 변수 S
- 바쁜 대기는 CPU 주기를 낭비하므로 더 효율적인 방법 활용
- wait 함수는 사용할 수 있는 자원이 없는 경우 해당 프로세스를 대기 상태로 전환하고, 프로세스의 PCB를 세마포를 위한 대기 큐에 추가
- 다른 프로세스가 임계 구역에서 작업을 끝내고 signal 함수를 호출
- signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스를 준비 상태로 전환한 뒤 준비 큐로 옮김
실행 순서 제어를 위한 동기화
- 카운팅 세마포를 이용한 방법
- 세마포의 변수 S를 0으로 설정
- 먼저 실행할 프로세스(P1) 뒤에 signal 함수를, 다음에 실행할 프로세스(P2) 앞에 wait 함수를 붙임
P2를 P1보다 먼저 실행해도 반드시 P1이 먼저 실행된다.
모니터
- 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
- 프로세스는 반드시 인터페이스를 통해 공유 자원에 접근
- 모니터의 역할
- 모니터에 진입하기 위한 큐 생성
- 이 큐에서 공유 자원을 다루는 인터페이스로 접근 가능
- 모니터는 공유 자원에 접근하려는 프로세스를 큐에 삽입
- 큐에 삽입된 순서대로 공유 자원을 이동
- 모니터 안에 하나의 프로세스만 접근할 수 있도록 제어(상호 배제를 위한 동기화)
- 모니터에 진입하기 위한 큐 생성
실행 순서 제어를 위한 동기화
- 조건 변수를 이용하면 모니터가 특정 프로세스를 일시 중단 가능
- 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
- 조건 변수를 통해 wait, signal 연산 실행 가능(
조건변수.wait()
,조건변수.signal()
)- wait 연산
조건변수.wait()
을 호출한 프로세스를 대기 상태로 전환하고, 일시적으로 조건 변수에 대한 대기 큐에 삽입- 모니터의 상호 배제를 위한 큐가 비게 되므로 다른 프로세스가 모니터로 접근 가능
- 특정 프로세스가 아직 실행될 조건을 충족하지 않았을 때 wait을 통해 실행 중단
- signal 연산
조건변수.signal()
를 호출하면 해당 조건 변수에 대해 대기 상태에 있던 프로세스를 다시 모니터로 들여옴- 특정 프로세스가 실행될 조건을 충족했을 때 signal을 통해 실행 재개
- wait 연산
This post is licensed under CC BY 4.0 by the author.