📗 BOOK/혼자 공부하는 컴퓨터구조+운영체제

혼자 공부하는 컴퓨터 구조+운영체제 12장 정리

미미누 2024. 7. 31. 01:11


프로세스 동기화

동기화란

  • 동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고 받음
    • 자원의 일관성을 보장해야 = 프로세스 동기화를 고려해야
  • 실행의 문맥을 갖는 모든 대상은 동기화 대상이기 때문에 스레드도 동기화 대상이다.

동기화

  • 프로세스들의 수행 시기를 맞추는 것이다.
  • 실행 순서 제어
    • 프로세스를 올바른 순서대로 실행
    • reader writer problem
      • writer: book.txt 파일에 값을 저장하는 프로세스
      • reader: book.txt 파일에 저장된 값을 읽어들이는 프로세스
      • reader 프로세스는 book.txt 안에 값이 존재한다는 특정 조건이 만족해야만 실행 가능
  • 상호 배제
    • 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 함.
    • band account problem

  • 현재 계좌에 잔액 10만원, 프로세스 A는 현재 잔액에 2만원 추가, 프로세스 B는 현재 잔액에 5만원 추가
  • 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 함(동시에 잔액에 접근해서는 안된다.)
    • context switch 후에도 기다려야 한다.
  • producer and consumer problem
    • 물건을 계속해서 생산하는 생산자, 물건을 계속해서 소비하는 소비자, 총합 변수 공유한다.

 

공유 자원과 임계 영역

공유 자원

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

임계 구역

  • 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • e.g. 총합 변수, 잔액 변수
  • 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.
  • 임계 구역에 동시에 접근하려고 하면 문제가 발생한다.
    • 자원의 일관성이 깨질 수 있음 = race condition

 

  • 고급 언어를 저급 언어로 변경 시 한 줄 코드가 여러 줄로 바뀔 수 있음
  • 중간에서 context swtich가 발생하면 예상치 못한 결과 발생 가능

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

= 상호 배제를 위한 동기화를 위한 세 가지 원칙

  • 상호 배제 (mutual exclusion)
    • 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어갈 수 없음
  • 진행 (progress)
    • 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있음
  • 유한 대기 (bounded waiting)
    • 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어가야 함
    • 임계 구역에 들어오기 위해 무한정 대기 x

동기화 기법

  • 뮤텍스 락
  • 상호 배제를 위한 동기화 도구
  • 공유 자원이 하나인 경우를 상정
  • 뮤텍스 락의 단순한 형태 = 전역 변수 하나, 함수 두개

  • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할: acquire 함수
    • 프로세스가 임계 구역에 진입하기 전에 호출
    • 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인
    • 임계 구역이 열려 있다면 임계 구역을 잠금
  • 임계 구역의 잠금을 해제하는 역할: release 함수
    • 임계 구역에서의 작업이 끝나고 호출
    • 현재 잠긴 임계 구역을 열기
  • e.g. acquire → 임계 구역 → release()
  • 바쁜 대기 (busy waiting)
    • 무한히 계속 반복되면서 임계 구역을 확인하는 방법

세마포어

    • 좀 더 일반화된 방식의 동기화 도구
    • 공유 자원이 여러 개 있는 경우에도 적용 가능
    • 카운팅 세마포
    • 임계 구역 앞에서 멈춤 신호를 받으면 기다리기
    • 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
    • 세마포의 단순한 형태 = 전역 변수 하나, 함수 두 개
      • 임계 구역에 진입할 수 있는 프로세스의 개수(공유 자원의 개수)를 나타내는 s
      • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait함수상호 배제를 위한 동기화

  • wait 함수는 busy waiting (바쁜 대기)

  • 사용할 수 있는 자원이 없을 경우 대기 상태로 만든다. (해당 프로세스의 PCB를 대기 큐에 삽입)
  • 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)

실행 순서 동기화

  • 세마포의 변수 S를 0으로 둔다
  • 먼저 실행할 프로세스 뒤에 signal 함수
  • 다음에 실행할 프로세스 앞에 wait() 함수

모니터

  • 세마포는 임계 구역에 앞뒤로 일일이 wait와 signal 함수를 명시하는 것은 번거로운 일이다.
  • 모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리한다.

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

  • 실행 순서 제어를 위한 동기화도 제공
  • 특정 조건을 바탕으로 프로세스를 실행하고, 일시 중단하기 위해 모니터는 조건 변수 사용

조건 변수(condition variable)

  • wait, signal 연산 수행 가능
  • wait는 호출한 프로세스의 상태를 대기 상태로 전환하고, 대기 큐에 삽입하는 연산

모니터는 조건 변수를 이용하여 프로세스 실행 순서 제어를 위한 동기화를 제공한다.

  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단한다.
  • 특정 프로세스가 실행될 조건이 충족되었을 때는 signal을 통해 실행을 재개한다.