6 - 프로세스 동기화

우하하·2024년 11월 21일

운영체제

목록 보기
6/7
post-thumbnail

1. 프로세스 동기화란?

프로세스들의 수행 시기를 맞추는 것!

크게 두 가지를 의미하는데,

1️⃣ 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기

  • reader writer problem
    • reader 와 writer 프로세스는 순서에 맞게 실행되어야 함
    • ex: reader 프로세스는 Book.txt 안에 값이 존재한다는 조건이 만족되어야 실행 가능함

2️⃣ 상호 배제: 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기

  • bank account problem
  • 생산자 & 소비자 problem

(스레드도 동기화의 대상임)

2. 공유 자원과 임계구역

2.1 용어 정리

💡 공유 자원(shared recource)
여러 프로세스 혹은 스레드가 공유하는 자원
💡 경쟁 조건(race condition)
2개 이상의 프로세스가 공유 자원을 병행해서 읽거나 쓰는 상황
💡 임계 구역(critical area)
공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역

2.2 임계구역 문제 해결 조건

✔️ 상호 배제(mutual exclusion) ⭐️ 중요! ⭐️

  • 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없음
  • 임계구역 내에는 한 번에 하나의 프로세스만 있어야함

✔️ 한정 대기(bounded waiting)

  • 어떤 프로세스도 임계구역에 진입하지 못하여 무한 대기 하지 않아야 함

✔️ 진행의 융통성(progress flexibility)

  • 임계구역에 어떤 프로세스도 진입하지 않았다면, 진입하고자 하는 프로세스는 들어갈 수 있어야 함

3. 동기화 기법

3.1 뮤텍스 락(자물쇠 역할!!)

  • 상호 배제를 위한 동기화 도구
acquire();		// 자물쇠가 잠겨 있는지 확인, 잠겨 있지 않다면 잠그고 들어가기
// 임계구역		  // 임계구역에서의 작업 진행
release();		// 자물쇠 반환
  • acquire()에서는 임계구역이 잠겨있는지를 반복적으로 확인함
    -> 바쁜 대기(busy waiting) 발생(CPU 사이클 낭비)

3.2 세마포어

3.2.1 카운팅 세마포어

  • 공유 자원이 여러 개 있는 경우에도 적용 가능한 방법
    세마포어 코드

  • Semaphore(n)

    • 전역 변수 RS를 n으로 초기화. RS에는 현재 사용 가능한 자원의 수가 저장됨
  • P(wait)

    • 잠금을 수행하는 코드
    • RS가 0보다 크면(사용 가능한 자원 있다는 뜻) 1만큼 감소시키고 임계구역에 진입함
    • 0보다 작으면(사용 가능한 자원 없다는 뜻) 0보다 커질 때까지 기다림(PCB 대기큐 삽입)
    • block()은 wake_up() 신호를 보낼 때까지 기다리는 함수
  • V(signal)

    • 잠금 해제와 동기화를 같이 수행하는 코드
    • RS 값을 1 증가 시키고 세마포어에서 기다리는 프로세스에 임계구역에 진입해도 좋다는 wake_up() 신호 보냄

💡 세마포어의 바쁜 대기 해결 방법

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

3.3 모니터

  • 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화하는 방법

1️⃣ 임계구역에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청을 함
2️⃣ 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려줌

참조
📚 쉽게 배우는 운영체제
🧑🏻‍🏫 개발자를 위한 컴퓨터공학1: 혼자 공부하는 컴퓨터구조 + 운영체제

profile
Hello World!

0개의 댓글