2023.07.29 - [컴퓨터 공학/운영체제] - [혼공컴운] chapter.11 CPU 스케줄링
12-1 동기화란
- 프로세스 동기화(synchronization): 프로세스 사이의 수행 시기를 맞추는 것.
* 프로세스뿐 아니라 스레드 또한 동기화의 대상.- 실행 순서 제어를 위한 동기화
: 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것.
* 프로세스들에 따라서 아무 순서대로 실행되어선 안되는 프로세스가 있음. - 상호 배제(mutual exclusion)를 위한 동기화
: 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘. 동시에 접근하지 못하게 하는 것.
- 실행 순서 제어를 위한 동기화
- 생산자와 소비자 문제
- 생산자
produce()
{
//버퍼에 데이터 삽입
result++;
}
- 소비자
consume()
{
//버퍼에서 데이터 빼내기
result--;
}
→ 이를 동시에 실행하면 result 값이 예상하지 못한 값이 나올 수 있다!
- 공유 자원과 임계 구역
- 공유 자원(shared resource): 프로세스에서 공동으로 접근할 수 있는 자원.
ex) 전역 변수, 파일, 입출력장치, 보조기억장치 등 - 임계 구역(critical section): 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역.
- 레이스 컨디션(race condition): 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하는 경우
- 공유 자원(shared resource): 프로세스에서 공동으로 접근할 수 있는 자원.
- 두 개 이상의 프로세스가 임계 구역에 진입하려는 상태 그래프
- T1: 프로세스 A가 임계 구역에 진입.
- T2: 프로세스 B가 임계 구역에 진입하려 시도.
- T2~T3: 프로세스 B는 대기.
- T3: 프로세스 B 임계 구역에 진입.
- T4: 프로세스 B 임계 구역에서 나옴.
- 임계 구역 문제를 해결하기 위한 세 가지 원칙
- 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.
12-2 동기화 기법
- 뮤텍스 락(Mutex lock; MUTual EXclusion lock)
=> 자물쇠 기능을 코드로 구현한 동기화 기법.
- 전역 변수 lock: 프로세스들이 공유
- acquire (): 임계 구역을 잠그는 역할
- release (): 임계 구역의 잠금을 해제하는 역할
acquire()
{
while ( lock == 1 ); // lock 이 잠겨있는지 확인. lock이 nonzero 라면 잠겨있는 상태
lock = 1; // lock이 zero라면 while 문 실행 x. 임계 구역 잠금
}
release()
{
lock = 0; // 임계 구역 잠금 해제
}
< acquire()와 release()로 구현한 뮤텍스 락 >
acquire();
// 임계 구역
release();
→ 임계 구역 진입 불가능 => 계속 대기.
→ 임계 구역 진입 가능 => 임계 구역을 잠근 뒤 임계 구역에서 작업 진행.
→ 임계 구역에서 나올 시 => 임계 구역의 잠금 해제
* 바쁜 대기(busy wait): 프로세스가 임계 구역의 잠금 상태를 계속 확인하는 것과 같은 대기 방식. 뮤텍스 락에서는 while문을 계속 반복하는 행위.
- 세마포(semaphore)(세마포어)
: 공유 자원이 여러 개 있을 때의 상호 배제를 위한 동기화 기법.
* 뮤텍스 락은 공유 자원이 한 개 일 때의 동기화 기법.
- 전역변수 S: 임계 구역에 진입할 수 있는 프로세스의 개수
- wait(): 임계 구역에 들어가도 되는지 여부를 알리는 역할
- signal(): 임계 구역을 진입하려는 프로세스에게 신호를 보내는 역할
< wait()와 signal()로 구현한 세마포 >
wait();
// 임계 구역
signal();
* 임계 구역 전후로 wait()와 signal()을 호출.
wait()
{
while( s <= 0 ); // 임계 구역에 진입할 수 있는 프로세스의 개수 확인.
s--; // 임계 구역에 진입할 수 있는 프로세스가 0개 초과라면 s 감소 후 임계 구역 진입
}
signal()
{
s++; // 임계 구역의 작업을 끝내고 S 증가
}
* 세마포는 바쁜 대기를 해소한 방법을 사용.
→ 임계 구역에 진입할 수 있는 프로세스의 개수가 0 미만일 경우 PCB(프로세스 제어 블록)를 대기큐에 삽입. 다른 프로세스가 임계 구역에서 작업을 끝내고 signal()을 호출하면 대기 중이던 프로세스를 대기 큐에서 삭제하고 준비 큐로 이동.
- 세마포를 이용한 프로세스 순서 제어
→ 변수 S의 초기값을 0으로 설정. 먼저 실행할 프로세스 뒤에 signal(), 다음에 실행할 프로세스 앞에 wait()을 붙임.
- 프로세스 A가 먼저 실행될 시
=> 어떠한 함수도 통과하지 않은 채 바로 임계 구역 진입. - 프로세스 B가 먼저 실행될 시.
=> S값을 확인하는 wait() 함수를 만나 임계 구역 진입 불가능(S 초기값은 0이기 때문에). A가 임계 구역에 먼저 진입하게 된 후 signal() 호출된 후 B가 임계 구역 진입 가능.
* signal()과 wait()의 순서를 바꾸거나 각 함수를 중복해서 사용하는 것은 안됨!
- 모니터(monitor)
: 공유자원에 접근하는 프로세스들을 큐를 이용하여 상호 배제를 위한 동기화를 제공하고, 실행 순서 제어를 위한 동기화도 제공하는 동기화 도구.
* 조건 변수(condition variable): 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수. wait과 signal 연산 수행.
→ 상호 배제를 위한 큐와 실행 순서 제어를 위한 큐는 다른 큐이다.
- 조건 변수에 대한 큐는 이미 모니터 내에 진입 상태.
- 상호 배제를 위한 큐는 모니터에 진입하기 위한 큐.
어떤 프로세스가 x.wait()를 통해 조건 변수 x 에 대한 wait() 을 호출
=> 다른 프로세스가 모니터에 들어와 공유 자원 사용. x.signal()을 이용하여 조건 변수 x 에 대한 signal()을 호출하여 일시 중지된 프로세스가 재개될 수 있다.
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행 중단.
- 특정 프로세스가 실행될 조건이 되었을 때는 signal을 통해 실행 재개.
* 오류 지적은 환영입니다.^^ *
'컴퓨터 공학 > 운영체제' 카테고리의 다른 글
[혼공컴운] chapter.12~13 확인문제 (1) | 2023.08.13 |
---|---|
[혼공컴운] chapter.13 교착 상태 (0) | 2023.08.13 |
[혼공컴운] chapter.09~11 확인문제 (1) | 2023.07.30 |
[혼공컴운] chapter.11 CPU 스케줄링 (1) | 2023.07.29 |
[혼공컴운] chapter.10 프로세스와 스레드 (0) | 2023.07.29 |