-
[Operating System] 프로세스 동기화 : 동기화 기법Operating System 2024. 5. 20. 11:30
여러 프로세스 동기화 기법 중
뮤텍스 락, 세마노, 모니터에 대해 정리하였습니다.참조 : 인프런 '개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제'
< 뮤텍스 락 Mutex Lock >
동기화의 두 가지 종류(실행 순서 제어, 상호 배체) 중 상호 배제를 위한 동기화 도구입니다.
자물쇠 역할을 하여 임계구역을 관리합니다.뮤텍스 락 이미지 [ 뮤텍스 락 구현 방법 ]
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 프로세스가 임계 구역에 진입하기 전에 호출
- 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인
(이를 busy waiting이라고 합니다. 반복적으로 계속해서 확인하는 이러한 방식은 좋은 방식이 아닙니다.)
- 임계 구역이 열려 있다면 임계 구역을 잠그기(lock을 true로 바꾸기) - 임계 구역의 잠금을 해제하는 역할 : release 함수
- 임계 구역에서의 작업이 끝나고 호출
- 현재 잠긴 임계 구역을 열기(lock을 false로 바꾸기)
뮤텍스 락 코드 구현(C언어)
< 세마포 Semaphore >
공유 자원이 여러 개 있는 경우에도 적용 가능한, 뮤텍스 락보다 좀 더 일반화된 방식의 상호 배제를 위한 동기화 도구입니다.
(세마포를 활용한 실행 순서 제어 동기화 또한 가능합니다.)
다음과 같은 방식으로 구현합니다.
- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 대기.
- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입.세마포 이미지 [ 세마포 구현 방법 ]
- 임계구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수 (임계구역 진입 전 호출)
wait 함수 - 임계구역에 진입할 수 있는 프로세스 개수가 0 이하라면 사용할 수 있는 자원이 있는지 반복적으로 확인(busy waiting)
- 임계구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역 진입- 임계구역 앞에서 기다리는 프로세스에 '가도 좋다'고 신호를 주는 signal 함수 (임계구역 진입 후 호출)
signal 함수 - 임계구역에서의 작업을 마친 뒤 S를 1 증가
[ Busy Waiting 해결 방법 ]
: Busy Waiting 방식은 CPU를 사이클을 낭비합니다. 이를 해결하기 위해 대기상태와 준비상태를 활용합니다.
- 사용할 수 있는 자원이 없을 경우 해당 프로세스를 대기 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에 삽입)
: 해당 프로세스를 대기 큐에 삽입 후 대기 상태로 전환
- 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦
(해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
: 대기 큐에 있는 프로세스 P 제거 후 대기 상태에서 준비 상태로 전환
[ 세마포를 활용한 실행 순서 동기화 ]
- 세마포의 변수 S를 0으로 두고,
- 먼저 실행할 프로세스 뒤에 signal 함수,
- 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 됩니다.
Ex) P1, P2가 동시에 실행 중에 있는데 P1이 반드시 먼저 실행되어야 하는 경우
세마포를 활용한 실행 순서 동기화 - P1이 P2보다 먼저 실행 되는 경우 : P1 먼저 임계 구역 진입
- P2가 P1보다 먼저 실행 되는 경우 : wait() 함수를 만나기 때문에 P1 먼저 임계 구역 진입
세마포에는 이진세마포와 카운팅 세마포가 있는데 여기서는 카운팅 세마포를 다루었습니다.
< 모니터 Monitor >
실행 순서 제어를 위한 동기화, 상호 배제를 위한 동기화 모두 제공해주는 동기화 도구입니다.
[ 모니터 상호 배제 동기화 구현 방법 ]
- 특정 인터페이스를 통해서만 공유 자원에 접근 가능
- 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
- 큐에 삽입된 순서대로 한 번에 하나의 프로세스만 공유 자원 이용
[ 모니터 실행 순서 제어 구현 방법 ]
1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단합니다.
2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개합니다.
- 조건 변수 condition variable 를 이용합니다.
(프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수입니다.) - 조건변수.wait() : 프로세스를 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
: 큐의 두번째 프로세스가 먼저 실행되어야 할 경우 첫 번째 프로세스의 wait함수 호출하여 대기 상태로 변경 → 두 번째 프로세스가 먼저 임계 구역 진입
- 조건변수.signal() : wait으로 대기 상태에 접어든 조건 변수를 실행 상태로 변경
: 두 번째 프로세스가 signal함수 호출 시 두 가지 방식이 있습니다.
- wait()를 호출했던 첫 번째 프로세스는 signal()을 호출한 두 번째 프로세스가 모니터를 떠난 뒤 수행 시작
- signal()을 호출한 두 번째 프로세스의 실행을 일시 중단하고 첫 번째 프로세스가 실행된 뒤 다시 signal()을 호출한 두 번째 프로세스의 수행 재개
'Operating System' 카테고리의 다른 글
[Operating System] 교착 상태 : 교착 상태 해결 방법 (0) 2024.05.20 [Operating System] 교착 상태 : 교착 상태란 (0) 2024.05.20 [Operating System] 프로세스 동기화 : 동기화란 (0) 2024.05.19 [Operating System] CPU 스케줄링 : 알고리즘 (0) 2024.05.19 [Operating System] CPU 스케줄링 : 개요 (0) 2024.05.19 - 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock