08. [혼공컴운]5주차_chapter 12. 프로세스 동기화

hyewoon·2024년 1월 29일
0

5주차 ((1/29 ~ 2/4)
chapter. 12 : 프로세스 동기화
chapter. 13 : 교착 상태

chapter. 12 : 프로세스 동기화

✅ 동기화란?
✅ 공유자원 및 임계구역
✅ 임계구역 문제 해결을 위한 기법


동기화

동기화란(Synchronization)?

여러 프로세스들이 동시에 실행 중인 상황에서 프로세스들 사이의 수행 시기를 맞추는 것

수행시기를 맞춘다
1. 프로세스를 올바른 순서대로 실행하기 ➡️ 실행 순서 제어
2. 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기 ➡️ 상호 배제

  • 실행 순서 제어를 위한 동기화
  • 상호 배제를 위한 동기화
    (with 🎁 선택미션)
    : 동시에 사용하면 안되는 자원에 프로세스가 동시에 접근하지 않도록 하는 것

📌 공유자원 (shared resource)
프로세스들이 공동으로 사용하는 자원을 공유자원이라 하고, 이 공유 자원에 두 개이상의 프로세스들이 동시에 실행되면 문제가 발생한다.

📌 임계구역 (critical section)

  • 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • 임계구역에 두 개이상의 프로세스가 동시에 실행되면 안됨 -> 둘 중 하나는 대기해야함.
    : 먼저 임계구역에 진입한 프로세스가 수행을 다 마치면 비로서 기다렸던 프로세스가 임계 구역에 진입할 수 있다.
  • 레이스 컨디션(race condition) : 잘못된 실행으로 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 발생되는 문제

상호배제를 위한 동기화 원칙

  • 상호 배제
    : 한 프로세스가 임계 구역에 진입하면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행(progress)
    : 임계구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있다.
  • 유한 대기(bounded waiting) : 한 프로세스가 임계구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수있어야 한다.(무한대기는 안된다)

동기화 기법

🔗 개인적으로 '동기화가 어떤 순서로 이루어 질까'에 대해 생각해 보았다.
1. 임계구역 진입 전에 임계구역 사용중인지 확인
2. 비어있으면 -> 진입해서 프로세스 실행
3. 사용중이면 -> 대기 후 진입

이때
✔️임계구역 사용중인지 비었는지 어떻게 알 수 있나?
이 부분이 중요하지 않을까 생각했다.

🔐 뮤텍스 락

  • 동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
  • 하나의 공유자원을 상정
  • 동기화 방식 : 상호배제

✔️ 임계구역 사용중인지 비었는지 어떻게 알 수 있나? ➡️ 자물쇠(lock) 이용
자물쇠 열림 -> 진입
자물쇠 잠긴 -> 대기

뮤텍스락은 하나의 전역변수두개의 함수로 구현할 수 있음

  • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할: aquire함수
  • 임계 구역의 잠금을 해제하는 역할 : release 함수

acquire(); // 자물쇠 잠겨있는지 확인, 잠겨 있지 않다면 잠그고 들어가기
//임계 구역 진입 (공유자원인 lock 변수에 접근)
release(); //자물쇠 반환

  • 임계구역이 잠겨 있을 경우 프로세스는 반복적으로 lock확인하는데 이러한 대기 방식을 바쁜 대기(busy wait)라고 한다.

🏴🏳️ 세마포

  • 공유자원이 여러개 있는 경우 상정 ex) 여러개의 탈의실 있는 경우
  • 여러 개의 프로세스가 각각 공유자원에 접근 가능해야 한다.
  • 동기화 방식 : 상호배제 + 실행 순서 제어

✔️ 임계구역 사용중인지 비었는지 어떻게 알 수 있나? ➡️ 신호(세마포) 이용
'가도 좋다' 신호 -> 진입
'멈춤' 신호 -> 대기

세마포는 하나의 변수두 개의 함수로 구현할 수 있음

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

wait() ;
//임계구역
signal()

👨‍👩‍👧‍👦 모니터

  • 동기화 방식 : 상호 배제 + 실행 순서 제어

세마포도 그 자체로 훌륭한 프로세스 동기화 도구이지만, 조금 불편한 점이 있다.
매번 임계 구역에 앞뒤로 일일이 wiat와 signal함수를 명시하는 것이 번거롭다.

그래서 등장한 것이 모니터

  • 공유자원과 공유자원에 접근하기 위한 인터페이스(통로)를 묶어서 관리하여 프로세스는 반드시 인터페이스를 통해 공유자원에 접근

  • 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고
    모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공합

  • 실행 순서 제어를 위한 동기화위해 조건변수 사용한다.

✔️ 임계구역 사용중인지 비었는지 어떻게 알 수 있나?
대기큐에 프로세스 대기 시켜서 하나씩 임계구역에 진입할 수 있도록 한다.

🏅 기본미션

p. 363의 확인 문제 1번 풀고 인증하기

정답 : 4
세마포를 이용하면 바쁜대기를 보완해서 대기 상태 접어들게 할 수도 있다.

🎁 선택미션

Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기

본문에서 정리함

profile
오늘도 달리는

0개의 댓글