02
07

프로세스 동기화

 

동기화

프로세스 사이의 수행시기를 맞추는 것. 

  • 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기 -> book.text에 reader와 writer 프로세스가 있다면 reader프로세스는 writer프로세스가 끝난 뒤에 실행할 수 있다.
  • 상호 배제:동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기 ->현재 잔액+2와 현재 잔액 +5가 동시에 이루어질 수 없다.

      *공유자원 : 전역변수, 파일, 입출력 장치 등이 될 수 있다. 동시에 실행되는 프로세스가 공유하는 자원

       임계구역: 동시에 실행하면 문제가 발생하는 자원. 두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야한다. 한 프로세스의 실행이 끝나야 비로소 다른 프로세스가 임계 구역에 진입할 수 있다.

 

레이스 컨디션 : 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 것.

고급언어는 실행 과정에서 저급 언어 여러줄로 변환되는데 여러 줄의 저급 언어로 한 줄의 고급 언어를 실행하는 과정에서 문맥 교환이 일어날 수 있다. 

 

동기화 기법

뮤텍스 락

동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구. 송호 배제를 위한 동기화 도구.

임계 구경게 진입하는 프로세스가 뮤텍스 락을 이용해 임계 구역에 자물쇠를 건다. 다른 프로세스는 임계구역이 잠겨있다면 기다리고, 잠겨있지 않다면 임계 구역에 진입한다.

 

뮤텍스 락 = 전역변수 1개+ 함수 2개

  • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
  • 임계구역을 잠그는 역할 :acquire 함수 
  • 임계 구역의 잠금을 해제하는 역할 :release함수

acquire함수

임계구역에 진입하기 전에 호출하는 함수. 임계구역이 잠겨있다면 임계 구역이 열릴 때까지 (lock이 false가 될 때 까지) 임계 구역을 반복적으로 호가인하고, 임계구역이 열려있다면 임계구역을 잠그는(lock을 true로 바꾸는 )함수

release함수 

임계 구역에서의 작업이 끝나고 호출하는 함수. 현재 잠긴 임계 구역을 열어주는 함수

 

acquire(){
	while(lock == true)
    ;
    lock = true;
}

release(){
	lock = false;
}

acquire();
//임계구역
release();

바쁜 대기 : 쉴 새 없이 반복해서 상태를 확인해보는 상태

 

세마포 

뮤텍스 락과 비슷하나 조금 더 일반화 된 방식이다. 공유 자원이 여러개인 상황에도 적용 가능하다

받는 신호에 따라 임계 구역 앞에서 기다리거나 임계 구역에 들어간다.

세마포 = 1개의 변수 + 2개의 함수

  • 전역변수S : 임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)
  • wait 함수 : 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
  • signal함수 : 임계 구역 앞에서 기다리는 프로세스에게 가도 좋다고 신호를 주는 함수.
wait() {
	while( S<=0 ) 
    ;
    S--;
}

signal() {
	S++
}

wait();
//임계구역
signal();

 

모니터

최근에 등장한 동기화 도구. 

공유자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리한다. 

프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근할 수 있다.

모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다. 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고 모니터 안에 항상 하나의 프로세스만 들어오도록 상호배제를 위한 동기화를 제공한다.

 

 

교착 상태

프로세스를 실행하기 위해서는 자언이 필요한데, 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다린다면 그 어떤 프로세스도 더이상 진행할 수 없게 된다.

일어나지 않을 사건을 기다리며 진행이 멈춰버리는 현상.

 

식사하는 철학자 문제

원탁에 다섯 명의 철학자가 앉아있다. 철학자들 앞에는 식사가 있고 철학자들 사이에는 필요한 포크가 있다. 식사는 두 개의 포크로 먹을 수 있다.

1. 계속 생각하다가 왼쪽 포크가 사용 가능하면 집는다

2. 계속 생각하다가 오른쪽 포크가 사용 가능하면 집는다

3. 왼쪽과 오른쪽 포크를 모두 집어들면 정해진 시간동안 식사를 한다.

4. 식사 시간이 끝나면 오른쪽 포크를 내려놓는다

5. 오른쪽 포크를 내려놓은 뒤 왼쪽 포크를 내려놓는다

6. 반복한다.

 

=> 결과: 모두가 식사를 하기 위해 모든 철학자는 다르 철학자가 포크를 내려놓을 때 까지 기다린다. 교착상태가 발생한다.

 

교착 상태를 해결하기 위한 방법

  1. 교착 상태가 발생했을 때의 상황을 정확하게 표현
  2. 교착 상태가 발생하는 근본적인 이유 파악

교착 상태의 상황을 정확하게 표현하는 방법 : 자원 할당 그래프

어떤 프로세스가 어떤 자원을 사용하고 있고, 어떤 프로세스가 어떤 자원을 기다리고 있는지를 표현한다.

프로세스 A : 자원 C 사용중

프로세스 B : 자원 D 사용중

프로세스 C : 자원 C 사용중

프로세스 D : 자원 C 할당 기다리는 중

 

교착상태 발생 조건 

  • 상호배제 :해당 자원을 한 번에 하나의 프로세스만 이용 가능하기 때문에 발생함.
  • 점유와 대기 : 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리기 때문에 발생함
  • 비선점 : 자원을 빼앗지 못하고 프로세스의 작업이 끝나야만 이용 가능하기 때문에 발생함
  • 원형대기 : 프로세스들과 프로세스가 요청 및 할당 받은 자원이 원의 형태를 이루었기 때문에 발생함

교착상태 해결방법

  • 예방
  • 회피
  • 검출 후 회복

교착상태 예방

교착 상태 발생 필요 조건 네 가지 중 하나를 충족하지 못하게 한다. 

 

상호배제를 없앤 경우 : 모든 자원을 공유하는 것은 현실적으로 힘들다.

점유와 대기를 없앤 경우 : 이론적으로 교착상태를 해결할 수 있으나 자원의 활용률이 낮아진다. 

비선점 조건을 없앤 경우 :  이용중인 프로세스로부터 자원을 빼앗을 수 있어 일부 자원에 대해서는 효과적이나 도중에 자원을 빼앗을 수 없는 경우(ex.프린터)에는 교착을 해결하기 어려워진다

원형 대기 조건을 없앤 경우 : 자원에 번호를 붙이고 오름차순으로 자원을 할당한다. 비교적 현실적이나 모든 시스템에 번호를 붙이는 일이 어렵고 특정 자원의 활용률이 떨어질 수 있다.

 

교착상태 회피

교착 상태가 발생하지 않을 정도로만 자원을 할당하는 방식 

  • 안전상태 : 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태
  • 불안전상태 : 교착상태가 발생할 수도 있는 상황 (안전 순서열이 없는 상황)
  • 안전 순서열 : 교착상태 없이 안전하게 프로세스에 자원을 할당할 수 있는 순서

 

더보기

 

프로세스 요구량 현재 사용량
P1 10 5
P2 4 2
P3 9 2

할당 가능 자원 : 12

할당한 자원 : 9

남은 자원: 3 

P2 > P1 > P3 (안전상태)

 

프로세스 요구량 현재 사용량
P1 10 5
P2 4 2 + 2 
P3 9 2

할당 가능 자원 : 12

할당한 자원 : 9 + 2 = 11

남은 자원: 3 - 2 = 1

 

프로세스 요구량 현재 사용량
P1 10 5
P2 4 2 + 2 
P3 9 2

할당 가능 자원 : 12

할당한 자원 : 11 - 4 = 7

남은 자원: 1 + 4 = 5

P2가 자원을 반환

 

프로세스 요구량 현재 사용량
P1 10 5 + 5
P2 4 2 + 2 
P3 9 2

할당 가능 자원 : 12

할당한 자원 : 7 + 5 = 12

남은 자원: 5 - 5 = 0

 

프로세스 요구량 현재 사용량
P1 10 5 + 5
P2 4 2 + 2 
P3 9 2

할당 가능 자원 : 12

할당한 자원 : 12 -10 = 2

남은 자원: 0 + 10 = 10

P1이 자원을 반환

 

 

동일한 상황에서 운영체제가 P3에 먼저 자원을 내준 경우 불안전 상태가 되어 교착상태가 발생할 위험이 있다.

운영체제가 교착 상태를 회피하기 위해 시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당한다.

 

교착 상태 검출 후 회복

  • 선점을 통한 회복 " 교착 상태가 해결될 때 까지 한 프로세스씩 자원을 몰아주는 방식. 다른 프로세스로부터 자원을 강제로 빼앗고 한 프로세스에 할당한다.
  • 프로세스 강제 종료를 통한 회복 : 교착상태에 놓인 프로세스를 모두 강제 종료하거나 교착 상태가 없어질때까지 한 프로세스씩 강제 종료할 수 있다. 

*타조 알고리즘 : 교착 상태를 아예 무시하는 방법

 

363p 1번
세마포를 이용하면 반드시 바쁜 대기를 해야한다

반드시(x) 대기 상태가 될 수도 있다.

선택미션
상호 배제:동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기 ->현재 잔액+2와 현재 잔액 +5가 동시에 이루어질 수 없다.

       임계구역: 동시에 실행하면 문제가 발생하는 자원. 두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나

 

COMMENT