반응형
Chapter 12. 프로세스 동기화
요약
프로세스 동기화의 의미와 다양한 기법들에 대해 알 수 있었다.
내용 정리
12-1. 동기화란
동기화의 의미
프로세스 동기화(synchronization)
- 프로세스 사이 수행 시기를 설정하는 것
- 동시다발적으로 실행되는 프로세스들은 독립적이거나, 서로 정보를 주고받고 협력할 수 있다.
- 서로 영향을 주는 프로세스들은 실행 순서와 자원 사용의 일관성을 보장해야 하기에 동기화 돼야 한다.
- 참고> 프로세스 뿐 아니라 스레드도 동기화의 대상이다. 즉, 실행의 흐름을 갖는 모든 것은 동기화 대상이다.
프로세스 동기화 시 요구조건
- 실행 순서 제어: 프로세스를 올바른 순서로 실행
- 상호 배제: 동시에 접근하면 안되는 자원에 하나의 자원만 접근할 수 있도록 하기
1. 실행 순서 제어를 위한 동기화
- 프로세스를 올바른 순서대로 실행해야 한다.
- 예시
- reader와 write 프로세스가 동시에 실행 중이라 가정
- write 프로세스는 book.txt 에 값을 저장함
- reader 프로세스가 book.txt 에 값을 읽어들임
- write 프로세스가 값을 저장한 후에 read 프로세스가 값을 읽어들여야 함
2. 상호 배제를 위한 동기화
- 상호배제(mutual exclusion): 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
- 한 프로세스가 자원에 접근했을 때 다른 프로세스는 대기해야한다.
- 대기하지 못하면 충돌이 일어나 자원의 결과값이 예상과 달라질 수 있다.
- ex> 은행에 100만원이 입금돼 있다고 하자. 그리고 10만원을 입금하는데, 입금이 기록되기 전에 100만원을 출금하는 프로세스가 시작되는 경우, 은행의 잔고는 0원으로 오표기될 수 있다.
생산자와 소비자 문제
- 상호배제를 위한 동기화 예시 문제
- 물건을 계속 생산하는 생산자 프로세스와 물건을 계속 소비하는 소비자 프로세스로 구성됨. 물건의 총합은 변수로 존재
- 생산자와 소비자를 동시에 계속해서 실행하면 예상값과 다른 결과를 얻을 수 있다.
- 이는 두 프로세스가 제대로 동기화되지 않았기 때문이다.
- 동기화가 제대로 안되면 생산자와 소비자가 상대 프로세스가 종료되기 전에 총합을 수정할 수 있다.
- 즉, 동시에 접근하면 안되는 자원에 동시에 접근해서 생기는 문제이다.
공유 자원과 임계구역
공유 자원(shared resource)
- 동시에 실행되는 프로세스들이 공동으로 사용하는 자원
- 전역 변수, 파일, 입출력 장치, 보조기억장치 등 다양한 자원이 공유될 수 있다.
- 공유 자원 중에서 두 개 이상 프로세스가 동시에 접근하면 문제가 발생하는 경우가 있다.
임계 구역(critical section)
- 공유 자원에 동시에 접근해 문제를 발생시키는 영역
- 임계 구역에는 두 개 이상 프로세스가 동시에 실행되면 안된다.
- 두 개 이상 프로세스가 임계 구역에 진입하려 하면 하나는 대기해야 한다.
- 임계 구역에 선진입한 프로세스가 종료되면 후진입한 프로세스가 진입해야 한다.
레이스 컨디션(race condition)
- 여러 프로세스가 동시 다발적으로 임계 구역 코드에 접근해 문제가 발생하는 경우
- 레이스 컨디션 발생 시, 데이터 일관성이 깨지는 문제가 발생한다.
- 컴퓨터는 고급 언어를 저급 언어로 변환해 사용하는 과정에서 문맥 교환이 발생한다.
- 문맥 교환이 임계 구역에서 발생하는 경우, 문제가 생길 수 있다.
- 상호 배제를 위한 동기화는 두 개 이상 프로세스가 임계 구역에 접근하지 못하도록 관리한다.
운영체제의 동기화 원칙
- 상호 배제(mutual exclusion): 한 프로세스가 임계 구역 진입 시 다른 프로세스는 임계 구역에 진입할 수 없다.
- 진행(progress): 임계 구역에 프로세스가 없으면 프로세스는 임계 구역에 진입할 수 있다.
- 유한 대기(bounded wating): 프로세스가 임계 구역에 진입하고 싶으면 언젠가는 임계 구역에 진입할 수 있어야 한다. (무한정 대기가 일어나면 안된다.)
12-2. 동기화 기법
동기화의 대표적인 도구
1. 뮤텍스 락
2. 세마포
3. 모니터
1. 뮤텍스 락
뮤텍스 락(Mutex lock: MUTual EXclusion lock)
- 상호배제를 위한 동기화 도구로 동시에 접근하면 안되는 자원에 프로세스/스레드의 동시접근을 막는다.
- 임계구역이 비었을 때 임계구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계구역에 자물쇠를 걸어둔다.
- 다른 프로세스는 임계구역이 잠겨 있으면 기다리고, 비게되면 뮤텍스 락을 걸고 임계구역에 진입한다.
뮤텍스 락의 구현
- 하나의 전역 변수와 2개의 함수로 구현된다.
- 전역변수 lock: 임계구역의 자물쇠 역할로 프로세스들이 공유하는 전역 변수
- 함수 acquire: 임계구역을 잠그는 함수
- 함수 release: 임계구역의 잠금을 해제하는 함수
- acquire 함수
- 프로세스가 임계구역에 진입 전 호출한다.
- 임계 구역이 열려 있으면 임계 구역을 잠근다 (lock을 false -> true로 변경).
- 임계 구역이 잠겨 있으면 열릴 때 까지(true -> false 상태가 될 때 까지) 임계 구역을 반복적으로 확인한다.
- release 함수
- 프로세스가 임계 구역에서 작업을 끝내고 호출하는 함수이다.
- 잠긴 임계 구역을 열어주는 함수 (lock을 true -> false로 변경함).
- acquire와 release의 pseudo code
acquire() {
while (lock == true) /* 만약 임계 구역이 잠겨 있다면 */
; /* 임계 구역이 잠겨 있는지를 반복적으로 확인 */
lock = ture; /* 만약 임계 구역이 잠겨 있지 않으면 임계 구역을 잠금 */
}
release() {
lock = false; /* 임계 구역 작업이 끝났으니 잠금 해제 */
}
- 프로세스의 임계 구역 진입
acquire(); // 자물쇠 잠겨 있는지 확인, 잠겨 있지 않으면 잠그고 들어가기
// 임계 구역 // 임계 구역에서의 작업 진행
release(); // 자물쇠 반환
- 뮤텍스 락에서 프로세스 임계 구역 접근 과정 정리
- 락을 획득할 수 없으면 (임계 구역 진입이 불가하면) 무작정 기다린다.
- 락을 획득할 수 있으면 (임계 구역 진입이 가능하면) 임계 구역을 잠근 뒤 임계 구역에서 작업을 진행한다.
- 임계 구역을 빠져 나올 땐 임계 구역 잠금을 해제한다.
- 바쁜 대기(busy wait): 반복적으로 상태가 변경되었는지 확인하며 대기하는 방식
- 뮤텍스 락에서는 acquire함수가 lock 전역변수 상태 변경을 끊임없이 확인하며 대기한다.
- 뮤텍스 락의 한계
- 사용할 수 있는 공유 자원이 없으면 프로세스는 무한히 반복하며 공유 자원 사용 가능 여부를 확인해야 한다.
- 즉, 바쁜 대기 상태로 CPU의 주기를 낭비하게 된다.
2. 세마포
세마포(semaphore)
- 뮤텍스 락보다 조금 더 일반화된 동기화 도구
- 공유 자원이 여러 개 있는 상황에서도 적용이 가능하다.
- 철도 신호기에서 세마포란 단어가 유래되었다.
- 세마포의 종류
- 이진 세마포(binary semaphore): 뮤텍스 락과 비슷한 개념(공유 자원이 하나)
- 카운팅 세마포(counting semaphore): 공유 자원이 여러 개일 때
세마포의 구현
- 하나의 전역 변수와 두개의 함수로 구현된다.
- 전역 변수 S: 임계 구역 진입 가능 프로세스 개수 (사용 가능 공유 자원 개수)를 나타냄
- wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 하는지를 확인하는 함수
- signal 함수: 임계 구역에서 기다리는 프로세스에 진입이 가능하다고 신호를 주는 함수
- wait 함수와 signal 함수 구현
# wait 함수
wait () {
while (S <= 0 ) # 1 임계 구역에 진입할 수 있는 프로세스 개수가 0개 이하라면
; # 2 사용할 수 있는 자원이 있는지를 반복 확인
S--; # 3 임계 구역 진입 가능 프로세스가 1개 이상이면 S를 1 감소시키고 임계구역 진입
}
# signal 함수
signal () {
S++ # 임계 구역에서 작업을 마친 후 S를 1 증가 시킨다.
}
- 세마포를 통한 프로세스의 공유자원 접근
wait()
// 임계 구역
signal()
- 세마포의 바쁜 대기 극복
- 세마포는 wait 함수에서 사용 가능 자원이 없을 때 프로세스를 대기상태로 만들어 바쁜 대기를 방지한다.
- 프로세스의 PCB를 대기 큐에 집어넣고, signal 함수 호출을 대기한다.
- 다른 프로세스가 임계 구역 작업이 끝나고 signal 함수를 호출하면, signal 함수는 대기 중인 프로세스를 대기 큐에서 제거한다.
- 대기 큐에서 제거된 프로세스는 준비 상태로 변경되고 준비 큐로 이동된다.
# 변경된 wait 함수
wait () {
S--;
if ( S < 0 ) {
add process p to Queue; /* 1. 프로세스 p의 PCB를 대기큐에 삽입 */
sleep(); /* 2. 대기 상태로 변경 */
}
}
# 변경된 signal 함수
signal () {
S++
if (S <= 0 ) {
remove a process p from Queue /* 1. 대기 큐의 프로세스 p 제거 */
wakeup(p) /* 2. 프로세스 p를 대기 상태에서 준비 상태로 변경 */
}
}
- S 값이 0 이하인 경우 프로세스 진입은 방지된다. 이 경우, S 값은 계속 감소하지만, 프로세는 대기큐로 보내진다.
- 어떤 프로세스가 종료되서 signal 함수가 호출되면 S 값이 1 증가한다. 그리고 S값이 0 이하인 경우, 대기큐에 프로세스가 있다는 것을 의미한다.
- 이 경우, 대기 큐의 프로세스를 꺼내 준비 상태로 변경한다.
세마포를 이용해 프로세스 순서를 제어하는 방법
- 프로세스 P1과 P2가 동시에 실행될 때, P1이 먼저 실행되야 하는 경우
- S는 0으로 설정하고, P1은 임계구역 뒤에 signal() 함수를, P2는 임계구역 앞에 wait()를 두면 순서는 무조건 P1, P2로 실행된다.
- 이 경우, P1은 바로 임계구역으로 진입, P2는 S값이 -1이 되어 무조건 대기가 걸린다.
세마포의 한계
- 사용하기 불편하다.
- 임계구역 앞뒤로 wait와 signal을 명시하는 일
- 잘못된 코드로 인해 오류가 발생할 수 있다.
- 세마포를 누락한 경우(wait와 signal 함수 누락)
- wait와 signal 순서를 반대로 쓴 경우
- wait 또는 signal을 중복해서 사용한 경우
3. 모니터
모니터(monitor)
- 공유 자원과 옹유 자원에 접근하는 인터페이스(통로)를 묶어서 관리
- 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근
- 인터페이스에 접근할 프로세스는 큐(모니터에 진입하기 위한 큐)에 삽입되고, 모니터 내에는 항상 하나의 프로세스만 들어오도록 하여 상호배제를 위한 동기화를 실현한다.
- 조건 변수를 통해 특정 조건을 바탕으로 프로세스 실행 및 일시 중단하여 실행 순서를 위한 동기화를 실현한다.
- 조건 변수(conditional variable): 프로세스나 스레드 실행 순서를 제어할 때 사용하는 변수
모니터의 조건 변수
- 조건 변수는 wait와 signal 연산을 수행할 수 있다.
- wait는 호출한 프로세스 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
- 여기서 상호 배제를 위한 큐(모니터에 진입하기 위한 큐)와 조건 변수에 대한 대기 큐(wait 호출 후 실행 중단된 프로세스들이 삽입되는 큐)는 다르다.
- 모니터에 진입하기 위한 큐는 하나의 프로세스만 모니터에 진입하게 만들어진 큐다.
- 조건 변수에 대한 대기 큐는 모니터에 진입한 프로세스가 실행 조건 만족 때까지 대기하기 위해 만들어진 큐다.
- 조건변수는 여러가지가 있을 수 있다.
- 예를 들어 특정 프로세스가 모니터에 들어오고 x.wait()가 호출되면 조건 변수 x가 만족할 때까지 대기한다.
- wait 연산으로 실행이 일시 중지된 프로세스는 다른 프로세스의 signal 연산을 통해 실행이 재개될 수 있다.
- 예를 들어 x.signal은 조건변수 x 대기 큐에 삽입된 프로세스 실행을 재개하는 함수이다.
모니터에서 프로세스의 실행 조건
- wait 호출한 프로세스는 signal 호출한 프로세스가 모니터를 떠난 뒤 실행될 수 있다.
- signal 호출한 프로세스 실행을 일시 중지될 때
모니터의 프로세스 실행 순서 제어 동기화
- 조건 변수를 이용해서 실현된다.
- 특정 프로세스가 아직 실행될 조건이 되지 않으면 wait를 통해 실행을 중단한다.
- 특정 프로세스 실행 조건이 충족된 경우, signal을 통해 실행을 재개한다.
모니터 장점
- 세마포에 비해 사용자가 이용하기 편한 도구
참고
반응형
'Study > 컴퓨터공학' 카테고리의 다른 글
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 13 교착 상태 (0) | 2022.12.13 |
---|---|
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 11 CPU 스케줄링 (4) | 2022.12.06 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 10 프로세스와 스레드 (0) | 2022.11.30 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 9 운영체제 시작하기 (0) | 2022.11.25 |
[컴퓨터 구조] 혼자 공부하는 컴퓨터구조 + 운영체제 Chapter 8 입출력장치 (2) | 2022.11.24 |