[혼공컴운]5주차_Chap12~13 정리

임지·2025년 2월 15일
0

혼공컴운

목록 보기
5/6

1. 프로세스 동기화

동기화란?

운영체제는 프로세스 동기화를 통해 프로세스를 관리한다. 동기화는 '실행 시기를 맞추는 것'이라는 뜻인데, 그 의미를 2가지로 나눠 생각하면 다음과 같다.

  • 실행 순서 제어 : 프로세스를 순서대로, 또는 특정 조건이 성립 되었을 때에만 실행
  • 상호 배제 : 하나의 자원에 하나의 프로세스만 접근 가능

특히, 상호 배제의 경우를 지키지 않으면 엉뚱한 결과가 나올 수 있다.

예를 들어 전역변수 T에 프로세스 A와 B가 접근한다고 해보자. 짧아보이는 명령어도 저급 언어로 변환되면 여러 줄의 명령어로 바뀐다. (ex: 1. 전역변수 가져오기, 2. 변수에 증감 연산하기 ) 이때 여러 줄의 명령어를 모두 실행하지 못 한 채 문맥교환이 일어나면 예상치 못한 결과가 발생한다.

  • 공유 자원 : 공동의 자원, 동시에 접근해서는 안되는 자원. (파일, 입출력장치, 전역 변수 등)
  • 임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역. 임계 구역에는 하나의 프로세스만이 실행되어야 한다. (다른 프로세스는 종료시까지 대기해야한다.)
  • 레이스 컨디션 : 프로세스가 동시다발적으로 임계 구역의 코드를 실행해서 문제가 생기는 상황

운영체제는 임계 구역 문제를 상호 배제, 진행, 유한 대기라는 3가지 원칙 하에서 해결한다.

  • 상호 배제 : 임계 구역에는 하나의 프로세스만이 존재할 수 있다.
  • 진행 : 임계 구역에 진입한 프로세스가 없다면, 해당 프로세스는 임계 구역에 진입 할 수 있다.
  • 유한 대기 : 프로세스는 무한정 임계 구역 진입을 대기하지 않고, 언젠가는 들어가야 한다.

뮤텍스 락

뮤텍스 락은 하나의 공유 자원이 존재할 때, 다른 프로세스가 접근하지 못 하도록 임계 구역을 잠금으로서 프로세스를 동기화한다.

  • lock : 프로세스들이 공유하는 전역 변수 (boolean)
  • acquire 함수 : 임계 구역을 잠그는(lock) 역할
  • release 함수 : 임계 구역의 잠금을 해제하는 역할
  • acquire()release()는 임계구역 코드 앞 뒤에 작성한다.
acquire(){
	while (lock == true)
    	;
    lock = true;
}

lock이 true면 (임계구역이 잠겨있다면) 계속 잠겨있는 지 여부를 확인한다.
while문을 나오면 (임계구역을 잠그는 lock 변수가 false가 되면) 다시 true로 바꿔서 임계구역을 잠근다.

release(){
	lock = false;
}

임계 구역 내의 코드를 모두 실행했다면, 임계 구역의 잠금을 해제하기 위해 lock을 false로 설정한다.

	while (lock == true)
    	;

acquire() 함수의 while문은 쉴 새 없이 임계 구역이 잠겨있는 지를 확인하는데, 이를 바쁜 대기라고 한다.
바쁜 대기는 CPU 사이클 관리에 비효율적으로 작용할 수 있다.

세마포

뮤텍스 락이 하나의 공유 자원을 대상으로 했다면, 세마포는 여러 개의 공유 자원을 대상으로 하는 동기화 기법이다.
( 세마포는 엄밀히 따지자면 이진 세마포와 카운팅 세마포로 나눌 수 있으나, 이진 세마포는 뮤텍스 락과 비슷한 개념이므로 여기서는 카운팅 세마포의 경우를 설명한다. )

  • 전역 변수 S : 사용 가능한 공유 자원의 개수
  • wait 함수 : 임계구역에 진입가능한 상태인지 아닌지를 알려주는 함수, 대기 큐를 사용
  • signal 함수 : 프로세스에 진입 가능하다는 신호를 주는 함수, 준비 큐를 사용
    -wait()signal()는 임계구역 코드 앞 뒤에 작성한다
wait(){
	S--;
    if ( S < 0 ){
    	add this process to Queue;
        sleep();
    }
}

임계 구역에 진입하기 전 변수 S의 개수를 줄인다.
S의 값이 0보다 작다면 모든 공유 자원이 사용되고 있다는 뜻이므로, 대기 큐에 프로세스를 추가하고 ( 이 방법으로 뮤텍스 락 바쁜 대기의 단점을 보완할 수 있다. ) 다른 프로세스가 종료되기를 기다린다.

signal(){
	S++;
    if ( S <= 0 ) {
    	remove a process p from Queue;
        wakeup(p);
    }
}

임계 구역에서 나오면 변수 S의 개수를 증가시킨다.
S의 값이 0보다 작거나 같으면 ( 자리가 생기면 ) 대기 큐에서 프로세스를 제거한 뒤 준비 상태로 만든다.

지금까지는 세마포를 통한 상호 배제를 구현하는 방법을 설명했고, 세마포로 이전 말했던 실행 순서 제어까지 가능하다.
변수 S를 0으로 두고, 먼저 실행할 프로세스 뒤에 signal()을, 후에 실행할 프로세스 앞에 wait()를 붙인다.

P1P2
wait()
/ 임계구역 코드 // 임계구역 코드 /
signal()

이렇게 작성하면 wait() 함수의 if문 조건에 걸려서 ( S--; 연산 이후, if문의 S < 0 조건에 걸린다. ) 무조건 P2는 먼저 실행되지 않고 대기 큐에 삽입된다.

따라서, 무조건 P1이 먼저 실행된다.

단, 세마포는 일일히 프로세스마다 wait()와 signal()를 적어주어야한다는 단점이 있다. 또한, 여기서 코드 작성에 실수가 생기면 (wait()와 signal()의 순서를 헷갈린다거나 등) 디버깅에 어려움이 있다.

모니터

모니터는 공유 자원과 공유 자원에 접근하기 위한 통로인 인터페이스를 묶어서 관리한다. 또한 프로세스는 인터페이스를 통해서만 공유 자원에 접근 가능 하고, 모니터 내에서는 하나의 프로세스만이 존재할 수 있다. (상호 배제)


사진 출처 : https://michaelkona.blogspot.com/2015/08/monitors.html#google_vignette

모니터의 구성요소는 다음과 같다.

  • 공유 자원에 접근할 수 있는 인터페이스
  • 공유 자원
  • 모니터에 들어가기 위한(인터페이스에 접근하기 위한) 큐
  • 실행 순서를 제어하기 위한 조건 변수
    • wait() : 프로세스의 상태를 대기 상태로 전환, 대기 큐에 삽입
    • signal() : 프로세스의 상태를 준비 상태로 전환

예를 들어 x.wait() 라는 코드가 실행되면, 해당 프로세스는 조건 변수 x에 대한 대기 큐에 삽입되고, x.signal() 코드가 실행되기까지 대기한다.

2. 교착 상태

교착 상태란?

  • 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상 (ex : 특정 자원을 기다리기 등 )

교착 상태는 다음 4가지 조건이 모두 충족될 때 발생한다.

  1. 상호 배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때
  2. 점유와 대기 : 프로세스가 어떤 자원 A을 할당 받은 상태에서 다른 자원 B을 대기하는 중일 때, 다른 프로세스가 B를 할당 받은 상태에서 A를 대기하는 중일 때
  3. 비선점 : 프로세스가 자원을 강제로 빼앗을 수 없을 때
  4. 원형 대기 : 자원 할당 그래프에서 원형 그래프가 그려졌을 때

참고로, 자원 할당 그래프가 원형이라고 해서 무조건 교착상태가 일어나는 것은 아니다. 단, 교착상태가 일어난 자원 할당 그래프는 원형이다.

교착 상태 예방

교착 상태 발생 조건 4가지 중 하나를 발생하지 않도록 사전에 막는 방법이다.

  • 상호 배제 :
    현실적으로 모든 자원의 상호 배제를 없애는 건 불가능하다.

  • 점유와 대기 :
    프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방법이 있다. 단, 자원의 활용률이 떨어진다.

  • 비선점 :
    선점하여 사용할 수 있는 (ex : CPU) 자원에는 효과적이나, 그렇지 않은 (ex : 프린터기) 자원에는 적용 불가능하다.

  • 원형 대기 :
    모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당한다. 단, 모든 자원에 번호를 붙이는 건 현실적으로 불가능하고, 오름차순으로 자원을 할당하면 자원을 효율적으로 사용할 수 없다.

교착 상태 회피

교착 상태가 발생하지 않을 정도로만 조심히 자원을 할당하는 방법이다.
교착 상태 회피 방식은 자원을 무분별하게 할당해서 교착 상태가 일어난다고 간주한다.

  • 안전 상태 : 안전 순서열이 존재하는 상태
  • 불안전 상태 : 안전 순서열이 존재하지 않는 상태
  • 안전 순서열 : 자원을 안전하게 프로세스들에게 할당할 수 있는 순서

은행원 알고리즘이 교착 상태 회피 방법을 잘 설명한다.

분량상 알고리즘 자체에 대한 설명은 생략한다.

교착 상태 검출 후 회복

  1. 선점을 통한 회복
    : 교착 상태가 해결 될 때까지 한 프로세스 씩 자원을 몰아준다.

  2. 프로세스 강제 종료를 통한 회복
    : 교착 상태를 일으킨 모든 프로세스 강제 종료
    : 교착 상태를 일으킨 프로세스를 하나씩 강제 종료


숙제 인증

기본 숙제

363p 1번
뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것?
4번 : 세마포를 이용하면 반드시 바쁜 대기를 해야한다.
-> 세마포는 대기큐를 사용하기 때문에 바쁜 대기를 하지 않아도 된다.

추가 숙제

임계 구역, 상호 배제 개념 정리하기

본문의 1-1 목차에서 정리했으므로 생략합니다~

0개의 댓글

관련 채용 정보