동기화란?
- 공동의 목적을 위해 동시에 수행되는 프로세스 사이에 자원의 일관성을 위해 수행 시기를 맞추는 것
- 구체적으로는 프로세스를 올바른 순서대로 실행하기 위한 실행 순서 제어, 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하는 상호 배제 2가지를 의미함
실행의 문맥을 갖는 모든 대상은 동기화 대상이기에 스레드도 동기화 대상이 됨
실행 순서 제어를 위한 동기화
- 동일한 텍스트의 값을 읽어오는 Writer, Reader 프로세스가 있다 가정해보자
- Reader는 텍스트가 존재한다는 조건이 만족되어야만 실행이 가능
- 이렇게 선행 관계가 존재하는 프로세스간에는 실행 순서의 제어가 필요함
상호 배제 제어를 위한 동기화
- Bank account problem, 생산자 소비자 문제 -> 프로세스간 동시 실행 결과로 의도하지 않은 자원의 변화 발생 가능
- 따라서 이런 경우에 한 프로세스가 자원에 접근했다면 다른 프로세스는 대기하고 있어야함
공유 자원과 임계 구역
- 공유 자원: 전역변수, 파일과 같이 여러 프로세스 혹은 스레드가 공유하는 자원
- 임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- 임계 구역에 진입하고자 한다면 진입한 프로세스 이외에는 대기해야 함
- 임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있게 되는데 이를 레이스 컨디션(race condition)이라고 함
- 운영체제는 임계구역 문제를 해결하기 위해 상호 배제, 진행, 유한 대기의 3가지 원칙을 지켜야 함
상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없음
진행(progress): 임계 구역에 어떠한 프로세스도 없으면 진입하고자 하는 프로세스는 들어갈 수 있어야 함
유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다는 무한정 대기해서는 안되고 언젠가는 들어올 수 있어야 함
뮤텍스 락
- 상호 배제를 위한 동기화 도구
- 대략적으로 아래 코드와 같은 구조를 가짐
acquire() {
while (lock == true)
;
lock = true;
}
release() {
lock = false
}
- 반복적으로 확인하기 때문에 바쁜 대기(busy wating)가 생김 -> CPU cycle 낭비가 생김
세마포어
- 뮤텍스 락이 하나의 공유자원이 있는 경우를 다루던 것에 비해 세마포어는 공유 자원이 여러개 있는 경우에도 적용 가능함
- 임계 구역 앞에서 멈추는 신호를 받으면 잠시 기다리게 되고, 진행을 해도 좋다는 신호를 받으면 임계 구역에 진입하게 됨
- 대략적으로 아래 코드와 같은 구조를 가짐
wait() {
while( S<= 0)
;
S--;
}
signal() {
S++
}
- busy wating 방지를 위해 사용할 수 있는 자원이 없는 경우 프로세스를 대기 상태로 만들고, 자원이 생긴 경우에 대기 큐의 프로세스를 준비 상태로 만드는 방법을 사용함
- 순서를 동기화 시킬 경우에 먼저 실행할 프로세스 뒤에 signal 함수를 붙이고, 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 됨
모니터
- 세마포어 사용시 실수를 하게되면 큰 문제가 발생하게 됨 -> 문제를 해결하기 위해 모니터를 사용함
- 상호 배제를 위한 동기화 도구와 실행 순서 제어를 위한 동기화 도구를 모두 제공함
- 상호 배제를 위한 동기화 도구로서는 인터페이스를 위한 큐를 제공 -> 공유자원에 접근하고자 하는 프로세스를 큐에 삽입해 공유 자원을 큐에 삽입된 순서되로 이용하게 됨
- 실행 순서 제어를 위한 동기화로는 조건 변수를 이용해 프로세스나 스레드의 실행 순서를 제어하게 됨
특정 프로세스가 실행될 조건이 되지 않으면 wait를 통해 실행을 중단하고, 특정 프로세스가 실행될 조건이 충족됬을 때에는 signal을 통해 실행을 재개함
https://www.youtube.com/watch?v=Jjfah3t_xWk&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=35
혼자 공부하는 컴퓨터 구조+운영체제, 강민철, 한빛미디어