728x90
동기화 해결의 세 가지 원칙
- 상호 배체: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 대기해야 함
- 진행: 어떤 프로세스도 임계 구역에 진입하지 않았다면 진입이 가능해야 함
- 유한 대기: 한 프로세스가 임계 구역 진입을 위해 대기하고 있다면 언젠간 진입이 가능해야 함
뮤텍스 락(Mutex Lock) - 상호 배제를 위한 동기화 도구
뮤텍스 락은 한 마디로 자물쇠(lock)다.
간단하게 설명해 보자면,
- 자물쇠 역할: 프로세스들이 공유하는 전역변수 lock
- 자물쇠 잠그기: acquire 함수 (임계 구역 진입 전 실행되는 함수)
- 자물쇠 열기: release 함수
acquire() {
while (lock == true) /* 만약 임계 구역이 잠겨있다면 */
; /* 임계구역이 잠겨있는지를 반복적으로 확인 */
lock = true /* 만약 임계 구역이 잠겨있지 않다면 임계구역 잠금 */
}
release () {
lock = false; /* 임계구역 작업이 끝났으니 잠금 해제 */
}
- while() 문에서 계속 lock이 잠겨있는지, 열려있는지 확인하는 과정을 바쁜 대기(busy waiting)이라고 부른다.
세마포: 상호 배제 & 실행 순서 제어를 위한 동기화 도구
여기서 말하는 세마포는 카운팅 세마포를 나타낸다.
- 뮤텍스 락은 기본적으로 공유 자원이 하나일 경우 상정(위 코드 예시처럼 lock이 하나일 때)
- 세마포는 공유 자원이 여러 개 있을 경우도 동기화(실행 순서 제어, 상호 배제 동기화) 가능
- 변수 S: 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)
- wait 함수: 임계구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
- signal 함수: 임계구역 앞에서 기다리는 프로세스에게 ‘이제 가도 좋다’고 신호를 주는 함수
wait()
// 임계 구역
signal()
wait() {
while(s <= 0) /* 1 */
; /* 2 */
s --; /* 3 */
}
1: 만일 임계구역에 진입할 수 있는 프로세스 개수가 0 이하라면 (= 진입할 수 없다면)
2: 사용할 수 있는 자원이 있는지 반복적으로 확인
3: 임계구역에 진입할 수 있는 프로세스 개수가 하나 이상이라면 S를 1 감소시키고 임계구역 진입
signal() {
s++ /* 1 */
}
1: 임계구역에서의 작업을 마친 뒤 s 1 증가
그런데 사실 바쁜 대기 (무한히 반복해서 상태 체크하는 방식)는 불필요하게 cpu를 낭비할 수 있으니 그렇게 좋은 방식은 아니다. 그래서 세마포에선 다른 방식을 사용할 수 있다.
프로세스 상태 전이 활용
바쁜 대기를 상태 대기로 바꾼 것이다. 무한 반복 확인을 대기 상태로 바꾼 것뿐
wait() {
s --;
if ( s < 0) {
add this process to Queue; /* 1 */
sleep(); /* 2 */
}
}
1: 해당 프로세스 PCB(Process Control Block)를 세마포 큐에 삽입
2: 대기 상태로 접어들기
signal() {
s++
if ( s < 0) {
remove a process P from Queue /* 1 */
wakeup(p) /* 2 */
}
}
1: 세마포 큐에 있는 프로세스 제거
2: 프로세스를 대기상태에서 준비상태로 만들기
실행 순서 제어를 위한 동기화
- 실행 순서를 위한 동기화
- 먼저 실행할 프로세스 뒤에 signal
- 나중에 실행할 프로세스 앞에 wait
'Upstage AI Lab 4기 > 컴퓨터 공학' 카테고리의 다른 글
[운영 체제] 교착 상태 (1) | 2024.07.25 |
---|---|
[운영 체제] 동기화 해결 방법 (2) - 조건 변수와 모니터 (0) | 2024.07.25 |
[운영 체제] 운영 체제(커널 영역과 사용자 영역) (0) | 2024.07.25 |
[컴퓨터 구조] 논리 주소와 물리 주소 (0) | 2024.07.25 |
[컴퓨터 구조] CPU 성능 (1) | 2024.07.24 |