[혼공학습단 9기] 혼공컴운 5주차 챕터12 : 프로세스 동기화

낙원·2023년 2월 10일
0
post-thumbnail

🔨동기화란

  • 동시다발적으로 실행되는 프로세스는 서로 데이터를 주고받으며 협력적으로 실행될 수 있다.
    프로세스들은 아무렇게나 실행되서는 안되고 올바른 실행을 위해 동기화가 필수적이다.

🌅프로세스 동기화

  • 프로세스들 사이의 수행 시기를 맞추는 것
    스레드 등 실행의 흐름을 갖는 모든 것은 동기화의 대상이다.
  1. 실행 순서 제어를 위한 동기화
  2. 상호 배제를 위한 동기화
    공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화

💒공유 자원과 임계 구역

  • 공유 자원
    여러 프로세스 혹은 스레드가 공유하는 자원
    전역 변수, 파일, 입출력장치, 보조기억장치 등

  • 임계 구역
    동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
    임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 함

레이스 컨디션

여러 프로세스가 동시다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우

운영체제가 임계구역 문제를 해결하는 세 가지 원칙

  1. 상호 배제
    한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  2. 진행
    임계 구역에 어떤 프로세스도 진입하지 않았따면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  3. 유한 대기
    한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가 임계 구역에 들어올 수 있어야 한다.

🔎동기화 기법

📣뮤텍스 락

  • 상호 배제를 위한 동기화 도구
    즉 자원에 동시 접근하지 않도록 만드는 도구다.
  • 뮤텍스 락의 단순한 형태
    - 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
    • 임계 구역을 잠그는 역할 : acquire 함수
    • 임계 구역의 잠금을 해제하는 역할 : release 함수

acquire 함수

  • 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
  • 반복적으로 lock을 확인하는 대기 방식을 바쁜 대기라고 한다.

release 함수

  • 임계 구역에서 작업이 끝나고 호출하는 함수

  • 임계 구역 전후로 함수를 호출하면 된다.

🔔세마포

  • 뮤텍스 락과 비슷하지만, 더 일반화된 방식의 동기화 도구
  • 공유 자원이 여러 개 있는 경우에도 적용이 가능한 도구

세마포의 구현 방법

  • 임계 구역에 진입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
  • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
  • 임계 구역 앞에서 기다리는 프로세스에 가도 좋다고 신호 주는 signal 함수

문제점과 해결 방법

  • 바쁜 대기를 반복하며 확인하는 것은 CPU 주기를 낭비하는 것이다.

  • 해결 방법

    • 사용 가능한 자원이 없으면 해당 프로세스를 대기 상태로 만듦
      해당 프로세스의 PCB를 대기 큐에 삽입
    • 사용 가능한 자원 생기면 대기 큐의 프로세스를 준비 상태로 만듦
      해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입

프로세스의 순서 제어 방법

  • 세마포의 변수 S를 0으로 두고
  • 먼저 실행할 프로세스 뒤에 signal 함수,
  • 다음에 실행할 프로세스 앞에 wait 함수를 붙인다.

📚모니터

  • 사용자가 사용하기 편리한 도구
  • 상호 배제를 위한 동기화, 실행 순서 제어를 위한 동기화 모두 가능
  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단
  • 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행 재개

상호 배제를 위한 동기화

  • 인터페이스를 위한 큐
  • 공유 자원에 접근하려는 프로세스를 (인터페이스를 위한) 큐에 삽입
  • 큐에 삽입된 순서대로 (한 번에 하나씩) 공유 자원 이용

실행 순서 제어를 위한 동기화

  • 조건 변수 이용
    프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수

  • 조건 변수로는 wait과 signal 연산 수행 가능

  • 조건 변수.wait()
    대기 상태로 변경, 조건 변수에 대한 큐에 삽입

  • 조건 변수.signal()
    wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경

0개의 댓글