프로세스 동기화
→ 프로세스들 사이의 수행 시기를 맞추는 것, 크게 두 가지를 의미한다.
실행 순서 제어: 프로세스를 올바른 순서대로 실행하기(Readers-Writers Problem)
특정 조건이 만족되어야만 read()할 수 있는 프로세스를 예시로 든다.
상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기(Bank-Account Problem)
한 프로세스가 이용하는 동안엔 다른 프로세스가 접근하지 못 하게 해서 총합의 오류를 내지 않게 한다.
<aside> 👐🏻
스레드도 동기화의 대상이다. 실행의 흐름을 갖는 모든 것은 전부 동기화의 대상이다.
</aside>
<aside> 💡 [생산자와 소비자 문제]
→ 생산자가 1증가 시키고, 소비자가 1감소시켜서 둘 다 10000번 진행하면 합이 그대로일 것 같지만, 동기화 문제로 인해 수가 왔다갔다하는 문제를 보인다.
</aside>
공유 자원과 임계 구역
공유 자원: 공동의 자원, 전역 변수를 통해 이룬다.
→ 두 개 이상의 프로세스가 이 자원에 접근할 시 동기화 문제가 생긴다.
임계 구역: 문제가 발생하는 자원에 접근하는 코드 영역
→ 동기화 문제를 방지하여 한 프로세스만 접근하게 한다.
이때 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 생기는 ‘레이스 컨디션’ 문제가 발생할 수 있다.
프로세스가 동기화를 위해 지켜야 하는 세 가지 원칙
뮤텍스 락
→ 상호 배제를 위한 동기화 도구, 임계 구역에 동시에 접근하지 않도록 자물쇠 기능을 가진 도구
좌물쇠 역할: 공유 자원/전역 변수 lock
임계 구역 잠금 역할: 함수 acquire()
acquire() {
while (lock == true)
;
lock = true;
}
임계 구역 잠금 해제 역할: 함수 release()
release() {
lock = false;
}
→ 프로세스의 코드 진행
acquire();
// 임계 구역
release();
<aside> 👐🏻 바쁜 대기(busy waiting) while (lock == true) ; 에서 보았듯이 계속 잠겼는지 일일이 살펴보는 것
</aside>
세마포
→ 상호 배제와 실행 순서 제어를 위한 동기화 도구, 여러 개의 좌물쇠 역할이 존재하는 도구
좌물쇠 개수: 전역 변수 S
임계 구역 진입 대기: 함수 wait()
#1 busy waiting ver.
wait() {
while( S <= 0 )
;
S--;
}
#2 using Queue ver.
wait() {
S--;
if ( S < 0 ) {
add this process to Queue;
sleep();
}
}
임계 구역 완료 및 이후 프로세스 진입 신호 전달: 함수 signal()
#1 busy waiting ver.
signal() {
S++
}
#2 using Queue ver.
signal() {
S++
if ( S <= 0 ) {
remove a process p from Queue;
wakeup(p);
}
}
→ 프로세스의 코드 진행
wait()
// 임계 구역
signal()
실행 순서 제어를 위한 세마포 동기화 기법
process P1 {
//임계 구역
signal()
}
process P2 {
wait()
//임계구역
}
→ 반드시 P1부터 실행된다.
모니터
→ 상호 배제와 실행 순서 제어를 위한 도구, 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
→ 조건 변수는 실행 순서 제어를 위해 사용되는데, 특정 조건을 바탕으로 프로세스를 진행시킨다.
<aside> 👐🏻 [식사하는 철학자 문제]
⇒ 모든 철학자는 밥을 못 먹는다. </aside>
교착 상태
→ 일어나지 않을 시간을 기다리며 진행이 멈춰 버리는 현상
자원 할당 그래프
→ 프로세스의 자원 할당을 표현하는 간단한 그래프
a. 프로세스는 원으로, 자원의 종류는 사각형으로 표시한다.
b. 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현한다.
c. 프로세스가 어떤 자원을 할당받고 있다면 화살표를 프로세스를 향해 화살표를 표시한다
d. 프로세스가 어떤 자원을 기다리고 있다면 화살표를 자원을 향해 표시한다.
교착 상태 발생 조건
a. 상호 배제
→ 자원과 프로세스가 일대일 대응으로 이용하는 상태
b. 점유와 대기
→ 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태
c. 비선점
→ 강제로 뺏을 수 없는 상태
d. 원형 대기
→ 원의 형태로 자원을 대기하는 상태
→ 이 네 가지가 모두 조건이 충족되어야 교착 상태 가능성이 나타남!
교착 상태 예방
→ 교착 상태 발생 조건 중 한 가지를 제거해 교착 상태를 해결하는 것
상호 배제 예방
→ 모든 자원을 공유 가능하게 하는 것
→ 모든 자원이 중복 사용하기가 쉽지 않음
점유와 대기 예방
→ 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 것
→ 자원의 활용률이 낮음
비선점 예방
→ 자원을 빼앗는 것
→ CPU 자원 외 많은 자원이 쉽지 않음. 범용성이 떨어짐
원형 대기 예방
→ 번호를 매겨 오름차순으로 자원을 할당하는 것
→ 번호 매기기가 쉽지 않고, 특정 자원의 활용률이 떨어질 수 있음
교착 상태 회피
→ 교착 상태가 발생하지 않을 정도의 양만 자원을 배분하는 것
안전 순서열: 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
→ 안전 상태: 안전 순서열이 존재하는 상태
→ 불안전 상태: 안전 순서열이 존재하지 않는 상태