오래 못 할 짓 하지 않기
[ 운영체제 ] 9. 프로세스 동기화 기법 본문
프로세스 동기화 방법에는
1. 상호 배제
2. 실행 순서 제어
이 두 가지를 이용하여 동기화 하는 기법들을 알아볼 거시다
뮤텍스 락
상호 배제를 이용한 동기화 도구 = 자물쇠 역할
탈의실 : 임계 구역 ( in 자원 )
프로세스 : 손님
탈의실이 잠겨있다면, 사람이 있다는 것이다.
● 구현법
구성 : 전역 변수 하나 + 함수 두 개
- 자물쇠 역할 : 변수 lock (boolean)
- 임계 구역을 잠그는 역할 : acquire 함수 → 작업 시작할 때 잠근다
: 프로세스가 임계 구역에 진입하기 전에 호출
if 임계 구역이 잠겨있다면
▶ (임계 구역이 열릴 때까지) 임계 구역을 반복적으로 확인
if 임계 구역이 열려있다면
▶ 임계 구역을 잠그기
- 임계 구역을 잠금을 해제하는 역할 : release 함수 → 작업이 끝날 때 잠근다
: 임계 구역에서의 작업이 끝나고 호출
현재 잠긴 임계 구역을 열기
아래는 사용할 때 구조
입장 후 문 잠그기( ) ;
갈아입기( ) ;
문 열고 나오기 ( ) ;
세마포
뮤텍스 락 = 탈의실 하나
세마포 = 탈의실 여러 개
: 조금 더 일반화된 방식의 동기화 도구
세마포 = 가도 된다 or 안 된다 나타내는 신호
= 임계 구역 앞에서 멈출지, 갈지 정하는 신호
● 구현법
구성 : 전역 변수 하나 + 함수 두 개
- 임계 구역에 진입할 수 있는 프로세스의 개수( 사용 가능한 공유 자원의 개수 ) 를 나타내는 전역 변수
- 임계 구역에 들어가도 좋은지, 기다려야 할지 나타내는 wait 함수
- 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다' 알려주는 signal 함수
예제)
이렇게 계속 lock == ture인지 무한으로 확인하는 것이
Busy waiting 이라고 한다.
확인하는 것에 CPU를 계속 사용하므로 비효율적이다.
● 해결 방법 :
- if 사용할 수 있는 자원이 X → 대기 상태로 만든다.
( = 해당 프로세스의 PCB를 대기 큐에 삽입 )
- if 사용할 수 있는 지원이 생겼을 경우 → 대기 큐에 있는 프로세스를 준비상태로 만든다.
( = 해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입 )
세마포를 이용한 실행 순서 동기화
- 세마포의 변수 S를 0으로 둔다.
- 먼저 실행할 프로세스 뒤에 signal 함수
- 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다.
p2로 먼저 간다해도 S가 0이라서 sleep
p1에서 S++가 되어야 S==1이라 p2 실행됨
임계구역 앞 뒤로 wait과 signal 함수를 호출하는 것이 번거롭다.
그러다 실수라도 하면 어떡하나..싶을 때 나온 해결방법
모니터
● 상호 배제를 위한 동기화
- 인터페이스를 위한 큐
- 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
- 큐에 삽입된 순서대로 ( 한 번에 하나의 포르세스만 ) 공유 자원 이용
● 실행 순서 제어를 위한 동기화
- 조건 변수 이용
- 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
> 조건변수.wait( ): 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
> 조건변수.signal( ): wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경
[ 상호 배제를 위한 큐 ]와 [ 조건 변수에 대한 큐 ]는 다르다.
(큐에 있는 프로세스의 순서는 [4] [3] [2] [1] 이라고 가정 )
2번을 1번보다 먼저 실행하고 싶으면?
1) 1번 프로세스에 대해 x.wait()으로 조건변수 x 큐에 넣고 대기상태가 된다.
2) 2번 프로세스를 실행
3) 1번 프로세스를 x.signal()로 실행
특징 : 모니터 안에는 하나의 프로세스만이 있을 수 있다.
(아래는 모니터 작업 방식인데, 좀 깊게 배우면 알게 됨)
1. wait()을 호출한 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 실행되는 방법
2. signal()을 호출한 프로세스의 실행을 일시 중단하고, 자신이 실행된 뒤에
다시 signal()을 호출한 프로세스의 수행을 재개
[ 실행 순서 제어를 위한 동기화 with 모니터 ]
1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 떄는 wait을 통해 실행을 중단
2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개
(출처)
유튜브 한빛미디어
'3학년 1학기 > 운영체제 (OS)' 카테고리의 다른 글
[ 운영체제 ] 11. 교착 상태 해결 방법 (0) | 2024.01.13 |
---|---|
[ 운영체제 ] 10. 교착 상태 (0) | 2024.01.13 |
[ 운영체제 ] 9. 프로세스 동기화 (0) | 2024.01.11 |
[ 운영체제 ] 8. CPU 스케줄링 알고리즘 (0) | 2024.01.10 |
[ 운영체제 ] 7. CPU 스케줄링 (0) | 2024.01.09 |