[혼공컴운] WIL_#5

Oigu·2024년 2월 4일
0
post-thumbnail

12. 프로세스 동기화


🧐동기화는 왜 필요할까?

개념 먼저 살펴보자.

프로세스 동기화

특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나 프로세스를 올바른 순서대로 실행하게 하는 것

즉, 프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미

  1. 실행 순서 제어
    프로세스를 올바른 순서대로 실행
  2. 상호 배제
    동시에 접근하면 안 되는 자원에 하나만 접근하게 함
    ➡️ 공유가 불가능한 자원의 동시 사용을 피하기 위함

상호 배제를 위한 동기화

예를 들어 계좌에 돈을 입금할 때
계좌 10만원
5만원 입금 +5만원
8만원 입금 +8만원
해서 총잔액이 23만원이어야 함

만약 동기화가 제대로 이루어지지 않는다면??
계좌에 5만원을 입금한 내역이 전달이 되지 않아 8만원 입금이 될 때 23만원이 아닌 18만원이 되어버린다 o0o ➡️ 5만원을 입금하는 프로세스가 끝나지 않은 상태에서 8만원 입금 프로세스가 실행되었기 때문이다.........

5만원이 입금되었다는게 저장이 되고나서 (15만원) 8만원 입금에 대한 값을 저장해야 제대로 된 동기화가 이루어진 것임

-> 생산자와 소비자 문제 예시로 바꾸기


😶 동시에 접근하면 안 되는 자원?

공유 자원

  • 공동으로 사용하는 자원
    ➡️전역 변수, 파일, 입출력장치, 보조기억장치 같은 것들

아까 든 예시를 다시 한번 보면
내 잔액과 총합이 공유 자원인 것임

임계 구역

  • 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역

⭐ 만약 임계 구역에 진입한 A 프로세스가 있으면 다른 B 프로세스는 임계 구역 밖에서 A 프로세스가 작업을 마무리할 때까지 기다려야 함

레이스 컨디션

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

"고급 언어는 여러 줄의 저급 언어로 변환되어 실행된다"
저급 언어를 실행하는 과정에서 문맥 교환이 일어나면
상호 배제를 위한 동기화 예시처럼 해당 자원이 올바르게 업데이트되지 않을 수 있다.



✔️ 동기화 기법

뮤텍스 락(MUTual EXclusion lock)

  • 임계 구역을 잠금으로써 프로세스 간의 상호 배제를 이룸
  • 자원에 동시에 접근하지 않도록 하는 도구 (상호 배제를 위한 동기화 도구)

뮤텍스 락 구현

자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
Lock 역할: acquire 함수
Unlock 역할: release 함수

  1. 임계 구역 진입 전 acquire 함수 호출

  2. 임계 구역 잠김 여부 확인
    잠겨 있으면 열릴 때(lock == false)까지 반복 확인
    열려 있으면 임계 구역 잠금(lock == true)

  3. 임계 구역 작업이 끝나고 release 함수 호출

  4. 임계 구역 잠금 해제(lock == false)


세마포(semaphore)

  • 뮤텍스 락에서 좀 더 일반화된 방식의 동기화 도구
  • 공유 자원이 여러 개 있는 상황에서도 적용이 가능

세마포 구현

전역 변수 S: 사용 가능한 공유 자원 개수
wait 함수: 들어가면 되는지 안 되는지 알려줌
signal 함수: 가도 된다고 신호 줌

  • 바쁜 대기 없이 프로세스를 대기시킬 수 있음
  1. 사용할 수 없는 자원이 없을 경우 프로세스 상태를 대기 상태로 만듦
  2. 프로세스의 PCB를 대기 큐에 집어넣음 -> 대기 상태
  3. 다른 프로세스가 임계 구역에서 작업이 끝남
  4. signal 함수 호출
  5. signal 함수 대기 중인 프로세스를 대기 큐에서 제거
  6. 프로세스 상태를 준비 상태로 변경하고 준비 큐로 옮김

_*PCB: 프로세스 제어 블록


모니터

  • 일일이 wait와 signal 함수를 명시하기 번거로워서 등장한 동기화 도구
  • 세마포에 비해 사용자가 사용하기 편리한 동기화 도구로 조건 변수를 사용
  • 공유 자원과 인터페이스(통로)를 묶어서 관리
  • 프로세스는 인터페이스를 통해서만 공유 자원에 접근 가능
  • 조건 변수를 사용해 프로세스 실행 순서를 제어

*조건변수: 특정 조건이 발생해야 실행/중단




13. 교착 상태(deadlock)


  • 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상

해결하기 위해..

  1. 교착 상태가 발생했을 때의 상황 표현
  2. 교착 상태가 일어나는 근본적인 이유 숙지

✔️ 자원 할당 그래프

프로세스 - 원
자원 - 사각형
사용할 수 있는 자원의 개수 - 점
사용 중인 자원 -> 프로세스 - 화살표
자원 <- 기다리는 프로세스 - 화살표


✔️ 발생 조건

상호배제

한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때

점유와 대기

자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태

비선점

다른 프로세스의 자원을 강제로 빼앗지 못한 문제(자원을 이용하는 프로세스의 작업이 끝나야 이용 가능)

원형 대기

자원 할당 그래프가 원의 형태면 교착 상태가 발생할 수 있음





🚶🏻 기본 미션


p.363

뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것?

1. 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다. O
2. 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다. O
3. 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다. O
4. 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다. X

4. 세마포를 이용하면 대기 상태로 만들 수 있어서 바쁜 대기를 하지 않아도 됨



🏃🏻 선택 미션


12-1 임계 구역, 상호 배제

임계 구역

공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 생기는 코드 영역

상호 배제

임계 구역에서 작업 중인 프로세스가 있을 때, 작업이 끝날 때까지 다른 프로세스가 임계 구역에 접근하지 못하도록 제어


0개의 댓글