혼자 공부하는 컴퓨터 구조 + 운영체제 Section 12. 프로세스 동기화

jihyelee·2023년 8월 22일
1

achitecture-os

목록 보기
12/15
post-custom-banner

강의 링크

동기화란

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

동기화

  • 프로세스들의 수행 시기를 맞추는 것
  • 실행 순서 제어
    • 프로세스를 올바른 순서대로 실행
    • reader writer problem
      • writer: book.txt 파일에 값을 저장하는 프로세스
      • reader: book.txt 파일에 저장된 값을 읽어들이는 프로세스
      • reader 프로세스는 book.txt 안에 값이 존재한다는 특정 조건이 만족되어야만 실행 가능
  • 상호 배제
    • 동시에 접근해서는 안 되는 자원(=공유가 불가능한 자원)에 하나의 프로세스만 접근하게 함
    • bank account problem
      • 현재 계좌에 잔액 10만원, 프로세스 A는 현재 잔액에 2만원 추가, 프로세스 B는 현재 잔액에 5만원 추가
      • 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 함 (동시에 '잔액'에 접근해서는 안 됨)
        • 문맥 교환이 되어서도 기다려야 함
    • producer and consumer problem
      • 물건을 계속해서 생산하는 생산자, 물건을 계속해서 소비하는 소비자, '총합' 변수 공유

공유 자원과 임계 구역

  • 공유 자원
    • 여러 프로세스 혹은 스레드가 공유하는 자원
    • e.g. 전역 변수, 파일, 입출력장치, 보조기억장치, ...
  • 임계 구역
    • 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
    • e.g. 앞선 예시의 '총합' 변수, '잔액' 변수, ...
    • 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 함
    • 임계 구역에 동시에 접근하려고 하면 문제 발생
      • 자원의 일관성이 깨질 수 있음 = 레이스 컨디션 (race condition)

  • 고급 언어를 저급 언어로 변경할 시 한 줄 코드가 여러 줄로 바뀔 수 있음
  • 중간에서 문맥 교환이 발생하면 예상치 못한 결과 발생할 수 있음 (레이스 컨디션 발생 등)

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

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

동기화 기법

뮤텍스 락

  • 상호 배제를 위한 동기화 도구(자물쇠 역할)
  • 공유 자원이 하나인 경우를 상정
  • 뮤텍스 락의 단순한 형태 = 전역 변수 하나, 함수 두 개
    • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
    • 임계 구역을 잠그는 역할: acquire 함수
      • 프로세스가 임계 구역에 진입하기 전에 호출
      • 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인
      • 임계 구역이 열려 있다면 임계 구역을 잠금
    • 임계 구역의 잠금을 해제하는 역할: release 함수
      • 임계 구역에서의 작업이 끝나고 호출
      • 현재 잠긴 임계 구역을 열기
    • e.g. acquire() -> 임계 구역 -> release()
  • 바쁜 대기 (busy waiting)
    • 무한히 계속 반복하면서 임계 구역을 확인하는 방법

세마포

상호 배제를 위한 동기화

  • 좀 더 일반화된 방식의 동기화 도구
  • 공유 자원이 여러 개 있는 경우에도 적용 가능
  • 세마포의 종류 (이진 세마포, 카운팅 세마포) 중 카운팅 세마포를 다룸
  • 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
  • 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
  • 세마포의 단순한 형태 = 전역 변수 하나, 함수 두 개
    • 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유자원의 개수)를 나타내는 전역 변수 S
    • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
    • 임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수
  • wait 함수는 busy waiting (바쁜 대기)
    • 해결 방법
      • 사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에 삽입)
      • 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)

실행 순서 동기화

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

모니터

  • 세마포의 경우 여러 실수의 가능성 존재
    • 세마포를 누락한 경우
    • wait, signal 순서를 헷갈린 경우
    • wait와 signal을 중복해서 사용한 경우
  • 사용자(개발자가)가 다루기에 편한 동기화 도구

상호 배제를 위한 동기화

  • 인터페이스를 위한 큐 (그림 왼쪽)
  • 공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
  • 큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용

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

  • 조건 변수(condition variable) 이용
    • 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
    • 조건변수.wait(): 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
    • 조건변수.signal(): wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경
  • 모니터 안에는 하나의 프로세스만이 있을 수 있음
    • wait()을 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개
    • signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개
  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행을 중단
  • 특정 프로세스가 실행될 조건이 충적되었을 때에는 signal을 통해 실행을 재개
profile
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab
post-custom-banner

0개의 댓글