12. 프로세스 동기화

동기화란

  1. 프로세스 동기화

    → 프로세스들 사이의 수행 시기를 맞추는 것, 크게 두 가지를 의미한다.

    <aside> 👐🏻

    스레드도 동기화의 대상이다. 실행의 흐름을 갖는 모든 것은 전부 동기화의 대상이다.

    </aside>

    <aside> 💡 [생산자와 소비자 문제]

    Untitled

    → 생산자가 1증가 시키고, 소비자가 1감소시켜서 둘 다 10000번 진행하면 합이 그대로일 것 같지만, 동기화 문제로 인해 수가 왔다갔다하는 문제를 보인다.

    </aside>

  2. 공유 자원과 임계 구역

    이때 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 생기는 ‘레이스 컨디션’ 문제가 발생할 수 있다.

    이때 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 생기는 ‘레이스 컨디션’ 문제가 발생할 수 있다.

  3. 프로세스가 동기화를 위해 지켜야 하는 세 가지 원칙

동기화 기법

  1. 뮤텍스 락

    → 상호 배제를 위한 동기화 도구, 임계 구역에 동시에 접근하지 않도록 자물쇠 기능을 가진 도구

    → 프로세스의 코드 진행

    acquire();
    // 임계 구역
    release();
    

    <aside> 👐🏻 바쁜 대기(busy waiting) while (lock == true) ; 에서 보았듯이 계속 잠겼는지 일일이 살펴보는 것

    </aside>

  2. 세마포

    → 상호 배제와 실행 순서 제어를 위한 동기화 도구, 여러 개의 좌물쇠 역할이 존재하는 도구

    → 프로세스의 코드 진행

    wait()
    // 임계 구역
    signal()
    
  3. 모니터

    Untitled

    → 상호 배제와 실행 순서 제어를 위한 도구, 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리

    → 조건 변수는 실행 순서 제어를 위해 사용되는데, 특정 조건을 바탕으로 프로세스를 진행시킨다.

13. 교착 상태

교착 상태란

<aside> 👐🏻 [식사하는 철학자 문제]

  1. 일정 시간 생각을 한다.
  2. 왼쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
  3. 오른쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
  4. 양쪽의 포크를 잡으면 일정 시간만큼 식사를 한다.
  5. 오른쪽 포크를 내려놓는다.
  6. 왼쪽 포크를 내려놓는다.
  7. 다시 1번으로 돌아간다.

⇒ 모든 철학자는 밥을 못 먹는다. </aside>

Untitled

  1. 교착 상태

    → 일어나지 않을 시간을 기다리며 진행이 멈춰 버리는 현상

  2. 자원 할당 그래프

    → 프로세스의 자원 할당을 표현하는 간단한 그래프

    a. 프로세스는 원으로, 자원의 종류는 사각형으로 표시한다.

    b. 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현한다.

    c. 프로세스가 어떤 자원을 할당받고 있다면 화살표를 프로세스를 향해 화살표를 표시한다

    d. 프로세스가 어떤 자원을 기다리고 있다면 화살표를 자원을 향해 표시한다.

    Untitled

  3. 교착 상태 발생 조건

    a. 상호 배제

    → 자원과 프로세스가 일대일 대응으로 이용하는 상태

    b. 점유와 대기

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

    c. 비선점

    → 강제로 뺏을 수 없는 상태

    d. 원형 대기

    → 원의 형태로 자원을 대기하는 상태

    → 이 네 가지가 모두 조건이 충족되어야 교착 상태 가능성이 나타남!

교착 상태 해결 방법

  1. 교착 상태 예방

    → 교착 상태 발생 조건 중 한 가지를 제거해 교착 상태를 해결하는 것

  2. 교착 상태 회피

    → 교착 상태가 발생하지 않을 정도의 양만 자원을 배분하는 것