동시에 프로그램을 실행할 때 반드시 고려해야 할 동기화와
해결해야 하는 문제인 교착 상태에 대해 알아가는 시간이다.
프로세스는 서로 데이터를 주고 받으며 협력하며 실행될 수도 있다.
프로세스의 협력에는 반드시 동기화 synhronization 가 중요하다.
(물론 스레드 또한 동기화가 중요하다.)
협력하는 프로세스가 공동으로 사용하는 자원을 공유 자원 shared resource 라고 하며
공유 자원에 대한 동시 접근이 동기화 문제를 야기할 수 있다.
이러한 공유 자원에 접근하는 구간은 동시 실행 시 문제가 되는 구역으로
임계 구역 critical section 이라고 한다.
둘 이상의 프로세스가 임계 구역에 접근하여 공유 자원을 조작하면 동기화 이슈가 발생하는데
이와 같은 공유 자원에 대한 경쟁을 레이스 컨디션 race condition 이라고 한다.
고급 언어로 보면 문제되지 않을 것 같은 공유 자원 접근도
저급 언어로 변환하여 실행하다보면 여러 줄의 코드로 실행되어
실행 도중 문맥 교환으로 인한 레이스 컨디션이 발생할 수 있는 임계 구역이 된다.
운영체제는 임계 구역 문제를 다음과 같은 세 가지 원칙 하에 해결한다.
더 알아보기
【↗[컴퓨터 공학 기초 강의] 33강. 프로세스 동기화란?】
【↗[저자 GitHub] producer consumer 문제】
프로세스의 동기화를 위한 대표적인 도구로는 다음과 같은 것들이 있다.
뮤텍스 락 MUTual EXclusion lock 은 상호 배제를 위한 동기화 도구로,
하나의 전역 변수와 두 개의 함수로 구현할 수 있다.
lock
acquire
함수lock==false
가 될 때까지 반복적으로 확인.lock=true
하고 임계 구역 접근.acquire() {
while (lock == true); // 잠겨 있는 동안 잠김 여부 계속 확인
lock = true; // 열려 있으면 잠그고 함수를 빠져 나감
}
release
함수lock=false
하고 임계 구역을 벗어남.release() {
lock = false; // 잠금 해제
}
세마포 semaphore 는 공유 자원이 여러 개 있는 상황에서도 적용 가능한 동기화 도구로,
하나의 전역 변수와 두 개의 함수로 구현할 수 있다.
S
wait
함수S > 0
가 될 때까지 반복적으로 확인.S--
으로 진입 가능한 프로세스 수를 하나 줄이고 임계 구역 접근.wait() {
while (S <= 0); // 진입 가능한 프로세스가 없는 동안 진입 가능 여부 계속 확인
S--; // 진입 가능하다면 진입 가능 프로세스 수를 1 줄이고 함수를 빠져 나감
}
바쁜 대기로 인한 CPU 주기 낭비를 방지하기 위해 세마포를 위한 대기큐 사용 가능wait() {
S--;
if (S < 0) {
enQueue(); // 해당 프로세스의 PCB를 대기 큐에 삽입하는 가상의 함수
sleep(); // 대기 상태 진입
}
}
signal
함수S--
으로 진입 가능한 프로세스 수를 늘리고 임계 구역을 벗어남.signal() {
S++; // 진입 가능 프로세스 1 증가
}
바쁜 대기로 인한 CPU 주기 낭비를 방지하기 위해 세마포를 위한 대기큐 사용 가능signal() {
S++;
if (S <= 0) { // S > 0일 때는 대기 큐에서 기다리지 않고 다 잘 사용 중.
p = deQueue(); // 대기 큐에서 프로세스 p를 제거하는 가상의 함수
wakeup(p); // 프로세스 p를 대기 상태에서 준비 상태로 변경
}
}
세마포를 이용하면 변수 S
를 0으로 두고
먼저 실행할 프로세스 뒤에 signal
함수, 다음에 실행할 프로세스 앞에 wait
함수를 두어
실행 순서 제어를 위한 동기화도 수행할 수 있다는 건 여담.
모니터 monitor 는 함수를 잘못 사용하는 것을 방지하여 세마포에 비해 사용하기 편리한 도구로,
공유 자원과 이에 접근하기 위한 인터페이스를 묶어서 관리한다.
모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고
큐에 삽입된 순서대로 하나씩 공유 자원 이용.
프로세스의 실행 순서를 제어하기 위한 특별한 변수 조건 변수 condition valiable 이용 시
특정 조건을 바탕으로 프로세스를 실행 및 일시 중단하여 실행 순서 제어 가능.
모니터에 진입한 어떤 프로세스가 어떤 조건 변수에 대한 wait
함수 호출 시
해당 프로세스는 진행되지 않고 해당 조건 변수를 위한 대기 큐에 삽입되고
다른 프로세스가 모니터 접근 가능.
(나중에 실행해야 하는 프로세스에서 호출)
이보다 먼저 실행되어야 하는 프로세스가 작업을 마치고 해당 조건 변수에 대한 signal
함수 호출 시
해당 조건 변수를 위한 대기 큐에서 기다리고 있던 프로세스가 다시 모니터 접근 가능.
(먼저 실행해야 하는 프로세스에서 호출)
wait
함수를 통해 실행 중단signal
함수를 통해 실행 재개더 알아보기
【↗[컴퓨터 공학 기초 강의] 34강. 프로세스 동기화 기법】
【↗[저자 GitHub] 코드로 보는 동기화】
일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 교착 상태 deadlock 는
둘 이상의 프로세스가 서로가 독점하고 있는 자원을 기다릴 때 발생하곤 한다.
교착 상태는 자원 할당 그래프 resource-allocation graph 를 통해 단순하게 표현할 수 있다.
이 그래프는 어떤 프로세스가 어떤 자원을 사용하고 있으며 어떤 자원을 기다리고 있는지 나타낸다.
교착 상태가 발생하는 조건에는 네 가지가 있으며
그 중 하나라도 만족하지 않으면 발생하지 않는다.
따라서 이 중 하나라도 피하면 교착 상태를 피할 수 있다.
더 알아보기
교착 상태 발생 조건 중 하나를 충족하지 못하게 한다
어떠한 방법이든 완벽하지 않아 부작용 존재.
교착 상태가 발생하지 않을 정도로만 조심히 할당한다
교착 상태를 한정된 자원에 대한 무분별한 할당으로 인한 문제로 간주
프로세스에 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 정도의 양만큼만 자원 분배.
시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원 할당 시
교착 상태를 회피할 수 있다
교착 상태 발생을 인정하고 사후에 조치하는 방식
더 알아보기
이번 주 미션
- 기본 미션 | p. 363의 확인 문제 1번 풀고 인증하기
- 선택 미션 | Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
미션은 P.363의 1번 문제뿐이지만, 이왕 학습하고 확인 문제를 푸는 거 다 풀어보자.
P.349 [12-1 | 동기화란] 확인 문제
- 동기화의 의미에 대한 옳은 설명을 다음 보기에서 찾아 쓰세요.
[보기| 상호 배제, 실행 순서 제어, 임계 구역]
- [① 실행 순서 제어 ]를 위한 동기화: 프로세스를 올바른 순서대로 실행하기
- [② 상호 배제 ]를 위한 동기화: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
- 임계 구역에 대한 설명으로 옳지 않은 것을 고르세요.
① 임계 구역에서 여러 개의 프로세스가 동시에 실행해도 무방합니다. → 동시 실행 시 레이스 컨디션 발생.
② 임계 구역에서 여러 프로세스가 동시에 실행할 경우 레이스 컨디션이 발생합니다.
③ 임계 구역에서 실행되는 프로세스가 있다면 다른 프로세스는 기다려야 합니다.
④ 운영체제는 임계 구역을 관리합니다.
P.363 [12-2 | 동기화 기법] 확인 문제
- 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
④ 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다. → 대기 큐를 이용할 수 있다.(요것이 이번주 기본 미션!!)
- 조건 변수
x
와y
가 있다고 가정해 보겠습니다. 스레드 A는 실행 과정에서x.wait
를 호출하였고, 스레드 B는y.wait
을 호출했습니다. 스레드 C가y.signal
을 호출했을 때 스레드 A와 Bㅈ 중 실행이 재개되는 스레드는 무엇일까요?
스레드 B
- 빈칸에 들어갈 알맞은 말을 보기에서 골라 써 보세요.
[보기| 실행 순서 제어, 상호 배제, 입출력장치]
"세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드 간에 [① 실행 순서 제어 ]를 위한 동기화와 [② 상호 배제 ]를 위한 동기화를 할 수 있습니다."
P.374~375 [13-1 | 교착 상태란] 확인 문제
- 교착 상태에 대한 설명으로 옳지 않은 것을 고르세요.
① 교착 상태는 다양한 상황에서 발생할 수 있습니다.
② 교착 상태는 자원 할당 그래프로 표현할 수 있습니다.
③ 교착 상태는 일어나지 않을 사건을 기다리며 무한히 대기하는 현상을 의미합니다.
④ 식사하는 철학자 문제에서 단 한 명의 철학자가 식사를 해도 교착 상태가 발생합니다. → 모두가 동시에 식사하려 할 때 발생.옳은 것을 고르라는데 아무리 봐도 옳은 것 세 개, 옳지 않은 것 한 개라서 제보.
- 교착 상태가 발생할 수 있는 네 가지 조건을 모두 써 보세요.
[ 상호 배제, 점유와 대기, 비선점, 원형 대기]
- 다음 자원 할당 그래프 중 교착 상태가 발생할 위험이 있는 그래프는 ①과 ② 중 무엇인가요?
②
P.386~387 [13-2 | 교착 상태 해결 방법] 확인 문제
- 교착 상태를 회복하는 방법에 대해 옳지 않은 것을 고르세요.
① 교착 상태가 발생하는 조건 중 하나를 충족하지 않게 하면 교착 상태를 예방할 수 있다.
② 교착 상태가 발생했다면 이를 회복할 수 없습니다. → 선점 또는 프로세스 강제 종료를 통해 회복 가능.
③ 안전 상태를 유지할 수 있는 경우에만 자원을 할당하면 교착 상태를 회피할 수 있습니다.
④ 교착 상태의 검출 및 회피 방식에서 운영체제는 주기적으로 교착 상태의 발생 여부를 검사합니다.
- 아래와 같은 상황에서 프로세스 P2에 자원 두 개를 나누어 줬다고 가정해 보겠습니다. 프로세스 P2가 실행을 올바르게 종료한 뒤 자원을 반납하면 남은 자원은 몇 개가 될까요?
프로세스 요구량 현재 사용량 P1 10 5 P2 4 2 P3 9 2
- 할당 가능 자원: 12
- 할당한 자원(P1, P2, P3 현재 사용량의 총합): 9
- 남은 자원(할당 가능 자원 - 할당한 자원): 3
남은 자원은 5개
- 교착 상태에 대한 대처 방법 중 타조 알고리즘에 대한 설명으로 옳은 것을 고르세요.
① 교착 상태를 회피하는 방법입니다.
② 교착 상태를 무시하는 방법입니다.
③ 교착 상태를 검출하고 회복하는 방법입니다.
④ 교착 상태를 예방하는 방법입니다.
- 교착 상태 예방에 대한 설명으로 옳지 않은 것을 고르세요.
① 상호 배제 조건을 없앰으로써 교착 상태를 예방할 수 있습니다.
② 점유와 대기 조건을 없앰으로써 교착 상태를 예방할 수 있습니다.
③ 비선점 조건을 없앰으로써 교착 상태를 예방할 수 있습니다.
④ 원형 대기 조건을 추가함으로써 교착 상태를 예방할 수 있습니다. → 없앰으로써.
동시 접근 시 동기화 문제를 일으킬 수 있는 자원을 공유 자원이라고 하는데,
이러한 공유 자원에 접근하는 구간을 동시 실행 시 문제가 되는 임계 구역이라고 한다.
동기화 문제 예방을 위해 임계 구역에 대한 동시 접근을 방지하고자
한 프로세스가 임계 구역 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없도록 할 수 있는데
이러한 기법을 상호 배제라고 한다.