[혼공컴운] 5주차_Ch12~13

김정민·2024년 8월 11일
0

혼공컴운

목록 보기
5/6
post-thumbnail

Ch12. 프로세스 동기화

동기화

동기화: 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서로 실행하게 하는 것

  • 실행 순서 제어를 위한 동기화: 프로세스들이 특정 순서대로 실행되도록 조정함.
    ex) reader 프로세스는 writer 프로세스 실행이 끝나야 실행될 수 있음.
  • 상호 배제 (mutual exclusion)를 위한 동기화: 동시에 여러 프로세스가 공유 자원에 접근하는 것을 방지함.

공유 자원과 임계 구역

공유 자원 (shared resource): 여러 프로세스가 공동으로 사용하는 변수, 메모리, 파일 등의 자원
임계 구역 (critical section): 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 영역
레이스 컨디션 (race cindution): 여러 프로세스가 공유 자원에 동시에 접근하는 상황.
여러 프로세스가 동시에 임계구역의 코드를 실행하는 상황.

임계 구역 문제 해결 조건:

  • 상호 배제 (mutual exclusion): 한 프로세스가 임계 구역에 진입한 동안 다른 프로세스는 해당 구역에 진입할 수 없음.
  • 잔행 (progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함.
    자원을 필요로 하는 프로세스는 계속해서 진입할 수 있어야 함.
  • 유한 대기 (bounded waiting): 어떤 프로세스도 임계 구역에 들어오기 위해 무한 대기해서는 안 됨.

동기화 기법

  • 뮤텍스 락 (Mutex lock; MUTual EXclousion lock)
    • 상호 배제를 위한 동기화 도구로, 하나의 공유 자원에 하나의 프로세스만 접근할 수 있도록 보장함.
    • 형태:
      • 전역 변수 lock: 공유 자원을 보호하기 위해 사용되는 자물쇠 역할의 변수
      • acquire 함수: 임계 구역에 들어가기 전에 호출되며, lock이 잠겨 있는지 확인한 후, 잠겨 있지 않으면 lock을 잠그고 진입함.
      • release 함수: 임계 구역에서 작업이 끝난 후 호출되며, lock을 해제하여 다른 프로세스가 접근할 수 있도록 함.
    • 바쁜 대기 (busy waiting): acquire 함수가 반복적으로 lock의 상태를 확인하면서 대기하는 방식. CPU 자원을 지속적으로 소모하므로 비효율적임.
    acquire() {
    	while (S == true)
        	;	// 바쁜 대기			
        lock = true;
    }
    
    release() {
    	lock = false;
    }
    
    acquire();
    // 임계 구역
    release();
    
  • 세마포 (semaphore)
    • 공유 자원이 여러 개 있는 상황에서도 적용 가능한 동기화 도구
    • 형태:
      • 전역 변수 S: 현재 사용 가능한 자원의 수를 나타냄.
      • wait 함수 (P): 프로세스가 임계 구역에 진입하기 전에 호출되며, 자원이 있으면 S를 감소시키고 진입, 자원이 없으면 대기 큐에 프로세스를 추가하고 프로세스 상태를 대기 상태로 전환함.
      • signal 함수 (V): 임계 구역에서 작업이 끝난 후 호출되며, S를 증가시키고 대기 중인 프로세스를 준비 상태로 전환하여 준비 큐에 추가함.
    wait() {
    	while (S <= 0)
        	;			
        S--;
        if (S < 0) {
        	add this process to Queue;
            sleep;	// 바쁜 대기 없이 프로세스를 대기 상태로 전환
        }
    }
    
    signal() {
    	S++;
        if (S <= 0) {
        	remove a process p from Queue;
            wakeup(p);	// 대기 중인 프로세스를 깨움
        }
    }
    
    wait();
    // 임계 구역
    signal();
  • 모니터 (monitor)
    - 프로세스가 인터페이스를 통해서만 공유 자원에 접근 가능하도록 하여 자원을 보호하고 프로세스 간에 동기화 제공함. 이는 세마포의 잘못된 코드 사용으로 발생할 수 있는 문제를 개선함.
    - 작동 원리:
    1. 임계 구역에 접근하고자 하는 프로세스는 모니터에 작업을 요청함.
    2. 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고, 결과만 해당 프로세스에 알림.
    - 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수로, 모니터가 실행 순서 제어를 위한 동기화에 사용함.
    - wait와 signal 연산을 수행
    - 모니터 큐와는 별개로, 조건 변수에 대한 큐를 사용함. 이 큐는 모니터에 이미 진입한 프로세스의 실행 조건이 만족될 때까지 잠시 실행을 중단시키기 위한 큐임.
    - 작동 원리: 조건 변수에 대한 wait 연산이 호출되면 해당 프로세스는 조건 변수 큐에 삽입되며, signal 연산이 호출되면 큐에 대기 중이던 프로세스가 실행을 재개함.

Ch13. 교착 상태

교착 상태

교착 상태 (deadlock): 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상. 여러 프로세스가 작업을 진행하면서 발생하는 자연적인 현상임.

자원 할당 그래프

자원 할당 그래프 (resource-allocation graph): 프로세스가 어떤 자원을 사용 중이고, 어떤 자원을 기다리고 있는지 표현하는 방향성이 있는 그래프

  1. 프로세스는 원, 자원은 사각형으로 표현함.
  2. 자원 사각형 내에 사용할 수 있는 자원 개수를 점으로 표현함.
  3. 프로세스가 자원을 할당받은 경우, 자원에서 프로세스를 향해 화살표로 표시함.
  4. 프로세스가 자원을 기다리는 경우, 프로세스에서 자원을 향해 화살표로 표시함.

교착 상태 발생 필요 조건

  • 상호 배제 (mutual exclusion): 한 프로세스가 사용하는 자원을 다른 프로세스가 동시에 사용할 수 없는 경우, 즉 상호 배제 상황에서 교착 상태가 발생할 수 있음.
  • 점유와 대기 (hold and wait): 프로세스가 어떤 자원을 할당 받은 상태에서 다른 자원을 기다리는 경우 교착 상태가 발생할 수 있음.
  • 비선점 (nonpreemptive): 한 프로세스가 점유 중인 자원을 다른 프로세스가 강제로 빼앗을 수 없는 경우 교착 상태가 발생할 수 있음.
  • 원형 대기 (circular wait): 자원을 점유한 프로세스들이 서로 다른 자원을 기다리며 원형으로 대기하는 경우 교착 상태가 발생할 수 있음.

교착 상태 해결 방법

  • 교착 상태 예방: 교착 상태 발생 피료 조건 네 가지 중 하나를 충족하지 못하게 하는 방법. 현실적으로 여러 제약이 있어 사용이 어렵거나 부작용이 있을 수 있음.

    1. 상호 배제 예방: 모든 자원을 공유 가능하게 함
      -> 현실적으로 자원을 보호해야 하므로 대부분의 자원은 상호 배제가 필요
    2. 점유와 대기 예방: 특정 프로세스에 자원을 모두 할당하거나 아예 할당하지 않음
      -> 자원의 활용률이 낮아지고, 기아 현상이 발생할 수 있음.
    3. 비선점 예방: 모든 자원을 빼앗을 수 있도록 함
      -> 비선점 조건의 무력화 어려움.
    4. 원형 대기 예방: 모든 자원에 숫자를 부여하여 오름차순으로 자원 할당
      -> 자원에 번호를 부여하는 게 복잡하고, 특정 순서로만 자원을 요청할 수 있어 유연성이 떨어질 수 있음.
  • 교착 상태 회피: 프로세스에 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법.
    자원의 총수와 현재 할당된 자원의 수를 기준으로 시스템을 안정 상태불안정 상태로 나눔.
    - 안정 상태: 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태 (안전 순서열 존재)
    - 불안전 상태: 교착 상태가 발생할 수도 있는 상태 (안전 순서열 없음)
    - 안전 순서열: 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
    => 시스템이 안정 상태를 유지하도록 자원을 할당하는 방법

  • 교착 상태 검출 후 회복: 교착 상태 발생 여부를 주기적으로 검사하고, 교착 상태가 발생하면 이를 회복하는 방법

    1. 선점을 통한 회복: 교착 상태가 해결될 때까지 다른 프로세스의 자원을 빼앗아 한 프로세스에 자원을 몰아주는 방식
    2. 프로세스 강제 종료를 통한 회복: 교착 상태에 놓인 프로세스를 모두 강제 종료하거나, 교착 상태가 없어질 때까지 순차적으로 프로세스를 종료하는 방식

기본 문제

p.363 확인 문제 1번

  1. 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.

세마포는 대기 큐를 사용해 자원이 사용 가능해질 때까지 프로세스를 대기 상태로 전환하여 관리하기 때문에 바쁜 대기가 필수적이지 않음.

0개의 댓글