[혼공단] 5주차_컴퓨터구조 + 운영체제

Algo rhythm·2024년 1월 29일
0

혼공단

목록 보기
9/13

1. 프로세스 동기화

1.1. 동기화

  • 프로세스들의 실행 순소와 자원의 일관성을 보장하기 위한 필수요소
  • 특정 자원에 접근할 때 한개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것
  • 프로세스 동기화 : 프로세스 등 사이의 수행 시기를 맞추는 것
  • 스레드도 동기화를 적용해야한다.

1.1.1. 실행 순서 제어 & 상호 배제

  • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행
  • 상호 배제 : 공유가 불가능한 자원에 하나의 프로세스만을 접근하도록 동시 접근 차단
    • 상호 배제가 필요한 예시
      1. 프로세스A(10만원이 있는 계좌에 2만원을 추가 입금)
      2. 프로세스B(동일한 계좌에 5만원을 추가 입금)
        프로세스A의 작업이 끝나기 전에 프로세스B가 현재 계좌의 잔액을 읽으면 최종적으로 계좌의 현재 잔액은 15만원으로 기록된다.

1.1.2. 생산자와 소비자 문제

  • 생산자와 소비자는 동시에 실행되는 스레드가 될 수도 있다.
  • 예시
    1. 생산자(버퍼에 데이터를 입력하고 '총합'에 1을 추가), 소비자(버퍼의 데이터를 빼내고 '총합'에 1을 감소)
    2. 생산자와 소비자가 지정된 행위를 반복하다보면 '총합'의 동기화가 되지 않아 '총합'이 초기값을 유지하지 않거나 오류가 발생한다.

1.1.3. 공유 자원과 임계 구역

  • 1.1.1.과 1.1.2.에서의 '잔액'과 '총합'은 전역 변수가된다. 즉, 전역 변수는 프로세스(또는 스레드)들의 공유 자원이다. 전역 변수 외에도 파일, 입출력장치, 보조기억장치 등이 프로세스와 스레드들이 동시에 접근해야하는 곳은 공유자원이다.
  • 임계 구역 : 공유 자원 중에서 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • 레이스 컨디션 : 임계 구역에 동시 다발적으로 접근하여 오류가 발생했을 때
  • 상호 배제 동기화 : 임계 구역에 한번에 하나씩 프로세스(또는 스레드)가 접근하도록 관리하는 것
  • 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 이에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기 : 한 프로세스가 임계 구역에 진입하려 할 때, 그 프로세는 언젠가 임계 구역에 진입할 수 있어야 한다.

1.2. 동기화 기법

1.2.1. 뮤테스 락

  • 옷가게 탈의실로 비유
  • 한 프로세스가 임계 구역에 진입했으면 다른 프로세스가 임계 구역에 접근하는 걸 막는 방식(상호 배제)
  • 구성
    1. lock : 프로세스들이 공유하는 전역 변수
    2. acquire 함수 : 임계 구역을 봉인
    3. release 함수 : 임계 구역 봉인 해제 역할
  • 바쁜 대기 : 임계 구역이 잠겨있는지 지속적으로 확인하는 방식

1.2.2. 세마포

  • 여러 공유자원에서 적용하는 뮤테스 락이라고 생각하자
  • 탈의실이 여럿 존재하는 것
  • 멈춤 신호와 진입 시도, 두 신호를 가지고 프로세스의 진입을 관리
  • 전역 변수 S : 임계 구역에 진입 가능한 프로세스의 개수(가용 공유 자원의 개수)
  • wait 함수 : 임계 구역에 진입/대기 여부를 나타내는 함수
  • signal 함수 : 임계 구역에 진입 신호를 주는 함수
  • 임계 구역 진입을 위해 지속적으로 확인해야함 -> CPU 주기의 낭비
    • 보완방안 : 가용 공유 자원이 없을 때, wait 함수는 프로세스의 PCB를 세마포를 위한 대기 큐에 집어 넣는다. 그리고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 이동시킴

1.2.3. 모니터

  • 세마포를 보완한 방식
  • 공유 자원과 공유자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리
  • 공유 자원에 접근하기 위한 인터페이스를 만들고, 프로세스를 큐에 삽입하고 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 함.
  • 실행 순서 제어를 위한 동기화 제공
    • 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위한 조건 변수 사용
  • 조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위한 변수, wait/signal
    • wait : 호출한 프로세스의 상태를 대기로 전환, 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
      • wait의 대기 큐와 모니터의 큐의 차이 : wait는 모니터에 진입한 프로세스를 대기 상태로 만듦(조건 변수에 대한 큐), 모니터는 프로세스가 하나씩 진입하기 위한 큐(상호 배제 큐)
    • signal : 진입 가능함을 알리는 신호

1.3. 확인문제

1.3.1. 뮤텍스 락과 세마포의 설명

  • 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로 써 상호 배제를 위한 동기화를 이룬다.
  • 세마포는 공유 자원이 여러 개 있는 상황에서도 이용 가능
  • 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화를 이룰 수 있다.

2. 교착 상태

  • 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 대기하는 상태
  • 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상
  • 상대방이 가진 자원을 기다리기만 하다 실행을 못하는 상황

2.1. 예시

  • 게임 프로세스는 자원A를 점유한 채 웹 브라우저 프로세스가 점유하고 있는 자원B의 사용이 끝나길 기다리고, 웹 프로세스는 자원B를 점유한 채 게임 프로세스가 점유하고 있는 자원A의 사용이 끝나길 기다린다.

2.2. 해결 방안 탐색

2.2.1. 교착 상태 발생 상황을 정확히 표현

  • 자원 할당 그래프 : 프로세스가 사용중인 자원을 간단하게 표현한 그래프

2.2.2. 교착 상태의 근본 원인

  1. 상호 배제
  2. 점유와 대기 : 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다림
  3. 비선점 : 한 프로세스가 다른 프로세스가 점유한 자원을 빼앗지 않음
  4. 원형 대기 : 프로세스들과 프로세스가 요청 및 할당 받은 자원이 원의 형태를 띔

2.3. 해결 방안

2.3.1. 교착 상태 예방

  • 상호 배제, 점유와 대기, 비선점, 원형 대기 중 하나의 조건을 발생되지 않도록 함
  • 상호 배제 제거 : 비현실적
  • 점유와 대기 제거 : 비효율적 자원 활용, 자원을 많이 요구하는 프로세스의 기아현상
  • 비선점 제거 : CPU에 관해선 효과적이나 범용성이 떨어짐
  • 원형 대기 제거 : 오름 차순으로 자원을 할당, 비교적 현실적, 컴퓨터 시스템 내의 모든 자원에 번호 부여가 어렵고 특정 자원의 활용률 급감

2.3.2. 교착 상태 회피

  • 교착 상태가 발생하지 않을 만큼의 자원을 배분하는 방법
  • 안전 상태 : 모든 프로세스가 정상적으로 자원을 할당 받고 종료될 수 있는 상태
    • 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
    • 안전 순서열 대로 프로세스에 자원을 배분하여 교착 상태가 발생하지 않으면 안전 상태
  • 불안전 상태 : 교착 상태가 발생할 수도 있는 상태
    • 안전 순서열이 없는 상황

2.3.3. 교착 상태 검출 후 회복

  • 교착 상태 발생을 인전하고 사후 조치하는 방식
  • 선점을 통한 회복 : 교착 상태가 회복될 때까지 한 프로세스씩 자원을 몰아주는 방식 -> 교착 상태에 놓은 모든 프로세스의 작업 내역을 잃는다.
  • 프로세스강제 종료를 통한 회복 : 교착 상테에 놓인 프로세스를 모두 강제 종료 또는 한 프로세스씩 강제 종료하여 교착 상태를 회복 - 일부의 작업 내역만 잃으나 교착 상태 파악을 과정에서 오퍼헤드 야기

2.3.4. 교착 상태 무시

  • 드물게 발생하는 잠재적 문제를 무시로 대처
  • 타조 알고리즘
profile
배운 건 써 먹자

0개의 댓글