커리큘럼 🫠


📃 기본 미션

p.363, 확인 문제 1번 ) 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.

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

 

🖍 ) ④, 프로세스를 대기 상태로 변경하여 CPU 사이클에서 제외하는 방법도 존재한다.

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

 

🖍 )

임계 구역 : 레이스 컨디션이 발생할 수 있는 코드 영역

상호 배제 : 특정 프로세스가 공유자원을 사용하고 있을 경우, 다른 프로세스가 해당 공유자원을 사용하지 못하게 배제하는 기법,

프로세스들이 번갈아가며 자원을 사용하게끔 임계 구역에 한 프로세스의 입장을 허락하게 함

자세한 내용 확인하러 가기🧚‍♀️


1️⃣2️⃣ 프로세스 동기화

12-1 동기화란

동기화의 의미

  • 공동의 목적을 위해 동시에 수행되는 프로세스는 서로 데이터를 주고받으며 협력하며 실행될 수 있다.
  • 자원의 일관성을 보장하기 위해서 (프로세스) 동기화가 필수적이다.
  • 프로세스들의 수행 시기를 맞추는 것을 동기화라고 한다.
    • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
    • 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
  • 실행의 문맥을 갖는 모든 대상은 동기화 대상이기에 스레드도 동기화 대상이다.

 

실행 순서 제어를 위한 동기화 : reader writer problem

  • Writer : Book.txt 파일에 값을 저장하는 프로세스
  • Reader : Book.txt 파일에 저장된 값을 읽어들이는 프로세스
  • Wirter 프로세스와 Reader 프로세스가 무작정 실행되면? ➡️ 😱
  • 실행의 순서를 지켜 실행 될 경우 의도성을 가진채로 실행 가능 (예외적인 상황 발생을 억제할 수 있다)
  • ex) Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행 가능

 

상호 배제를 위한 동기화 : Bank account problem

  • 공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
  • 한번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화
  • 하나의 프로세스에서 자원에 접근 중일때 같은 자원을 접근하는 나머지 프로세스는 대기하여야 한다.
  • ex) 은행 계좌의 조작 프로세스 (계좌의 값을 읽어들여서 계산 후 저장하는 과정에서 동기화가 이루어지지 않으면 예상치 못한 값이 저장될 수 있다.)

 

상호 배제를 위한 동기화 : Producer & Consumer problem

  • 물건을 계속해서 생산하는 생산자 (producer, 프로세스 혹은 스레드)
  • 물건을 계속해서 소비하는 소비자 (consumer, 프로세스 혹은 스레드)
  • ‘총합’ 변수를 공유
  • 생산자와 소비자를 무작정 100,000번 실행하면 총합의 변수 값이 10이 아닌 예상 밖의 값이 된다.
  • 동기화가 되지 않았기 때문에 발생한 문제로 동시에 접근해서는 안되는 자원(총합)에 동시에 접근해서 발생한 문제

 

공유 자원(shared resource)과 임계 구역 (critical section)

  • 공유 자원 : 여러 프로세스 혹은 스레드가 공유하는 자원 (ex : 전역 변수, 파일, 입출력장치, 보조기억장치, …)
  • 임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 (ex : 예시의 ‘총합’ 변수, ‘잔액’ 변수,…)
  • 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다. (동기화를 위해)

아주 중요함... 🫢

 

  • 레이스 컨디션(race condition) : 임계 구역에 동시에 접근하여 자원의 일관성이 깨지는 상태
  • 즉 레이스 컨디션이 발생할 수 있는 코드 영역을 임계 구역이라고 한다.

 

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

(’상호 배제를 위한 동기화’를 지키기 위한 세 가지 원칙)

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

 

12-2 동기화 기법

뮤텍스 락 (Mutex lock)

  • 상호 배제를 위한 동기화 도구(자물쇠 역할)
  • 뮤텍스 락의 단순한 형태 : 전역 변수 하나, 함수 두 개
    • 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 Lock
    • 임계 구역을 잠그는 역할 : acquire 함수
    • 임계 구역의 잠금을 해제하는 역할 : release 함수
  • acquire 함수
    • 프로세스가 임계 구역에 진입하기 전에 호출
    • 임계 구역이 잠겨 있다면 ➡️ 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인한다.
    • 임계 구역이 열려 있다면 ➡️ 임계 구역을 잠근다 (lock을 true로 바꾸기)
  • release 함수
    • 임계 구역에서의 작업이 끝나고 호출
    • 현재 잠긴 임계 구역을 열기 (lock을 false로 바꾸기)
✅ 바쁜 대기 (busy waiting) : lock이 잠겨있는지 계속 확인해보는 것 ➡️ 좋은 방식은 아님

스도 코드 형태로 나타낸 뮤텍스 락 🔒

 

세마포 (Semaphore)

  • 좀 더 일반화된 방식의 동기화 도구
  • 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식 ↔️ 세마포는 공유 자원이 여러 개 있는 경우에도 적용 가능한 방식
  • 세마포의 종류로 이진 세마포 (binary semaphore), 카운팅 세마포 (counting semaphore)가 있지만, 이진 세마포는 뮤텍스 락과 비슷한 개념이고 일반화된 개념인 카운팅 세마포를 중점으로 본다.
  • 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
  • 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
  • 세마포의 단순한 형태 : 전역 변수 하나, 함수 두 개
    • 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
    • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
    • 임계구역 앞에서 기다리는 프로세스에 ‘이제 가도 좋다’고 신호를 주는 signal 함수
  • 허용된 S의 값으로 프로세스 실행이 결정 된다.

스도 코드 형태로 나타낸 세마포 ⚒️

✅ Mutex lock 과 동일하게 busy waiting 이다. ➡️ CPU 사이클 낭비

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

 

세마포를 활용한 실행 순서 동기화

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

 

모니터

  • 사용자(개발자)가 다루기 편리한 동기화 도구
  • 상호 배제를 위한 동기화
    • 인터페이스를 위한 큐
    • 공유자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
    • 큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용

공유 자원의 연산은 큐에서 인터페이스를 통해 하나씩 이용한다. 😲

  • 실행 순서 제어를 위한 동기화
    • 조건 변수 (condition variable) 이용
    • 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
    • 조건변수.wait() : 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
    • 조건변수.signal() : wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경

상호 배제를 위한 큐와 조건 변수에 대한 큐가 다름을 인지할 것 😚

  • 모니터 안에는 하나의 프로세스만이 있을 수 있다.
    • wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개하는 방법
    • signal()을 호출했던 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개하는 방법
  1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
  2. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

 


1️⃣3️⃣ 교착 상태

13-1 교착 상태란

결혼식장에서 본 풍경... (수저가 없어진건 옆사람이 범인 🕵️)

 

교착상태

  • 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상
  • 프로세스들이 서로가 점유한 자원을 기다리고 멈춰 ✋!!! 하고 있음

 

교착 상태를 해결하기 위해서는?

  1. 교착 상태가 발생했을 때의 상황을 정확히 표현해보기
  2. 교착 상태가 일어나는 근본적인 이유를 이해하기

 

자원 할당 그래프

  • 교착 상태 발생 조건 파악 가능
  • 어떤 프로세스가 어떤 자원을 할당 받아 사용 중인지 확인 가능
  • 어떤 프로세스가 어떤 자원을 기다리고 있는지 확인 가능
  • 자원 할당 그래프 그리는 방법
    1. 프로세스는 원으로, 자원의 종류는 사각형으로 표현
    2. 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현
    3. 프로세스가 어떤 자원을 할당 받아 사용 중이라면 자원에서 프로세스를 향해 화살표를 표시
    4. 프로세스가 어떤 자원을 기다리고 있다면 프로세스에서 자원으로 화살표를 표시
  • 교착 상태가 일어난 그래프의 특징
    • 자원 할당 그래프가 원의 형태를 띄고 있다.

 

교착 상태 발생할 조건

  1. 상호 배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태
  2. 점유와 대기 : 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태
  3. 비선점 : 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태
  4. 원형 대기 : 프로세스들이 원의 형태로 자원을 대기하는 상태
  • 네 가지 조건 중 하나라도 만족하지 않으면 교착 상태가 발생하지 않음
  • 네 가지 조건을 모두 만족하면 교착 상태가 발생할 수 있음

 

13-2 교착 상태 해결 방법

교착 상태 해결

  • 예방
  • 회피
  • 검출 후 회복

 

교착 상태 예방

  • 애초에 교착 상태가 발생하지 않도록 한다.
  • 교착 상태 발생 조건(상호 배제, 점유와 대기, 비선점, 원영 대기) 중 하나를 없애버리기
  • 상호 배제를 없애면… : 모든 자원을 공유하게 만든다? ➡️ 현실적으로 불가능
  • 점유와 대기를 없애면… : 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분 ➡️ 자원의 활용률이 떨어질 수 있음
  • 비선점 조건을 없애면… : 선점이 가능한 자원 (CPU)에 한해서 효과적 ➡️ 모든 자원이 선점 가능한 것은 아니다.
  • 원형 대기 조건을 없애면… : 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하는 방식 ➡️ 모든 자원에 번호를 붙이는 것이 어려움, 어떤 자원에 어떤 번호를 붙이느냐에 따라 자원 활용률이 달라짐
  • 교착 상태 해결을 위한 예방은 교착 상태가 발생하지 않음은 보장할 수 있으나 부작용이 따라온다.

 

교착 상태 회피

  • 교착 상태를 무분별한 자원 할당으로 인해 발생했다고 간주 (포크가 무제한이라면 교착 상태가 발생하지 않는다)
  • 교착 상태가 발생하지 않을 만큼 조심스럽게 할당하기
  • 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 만큼만 자원 배분
  • 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
  • 안전 상태 : 교착 상태 없이 모든 프로세스가 자원을 할당 받고 종료될 수 있는 상태 (안전 순서열이 있는 상태)
  • 불안전 상태 : 교착 상태가 발생할 수도 있는 상태 (안전 순서열이 없는 상태)
  • 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하는 방식
  • 항시 안전 상태를 유지하도록 자원을 할당하는 방식
  • 추가 학습 : 은행원 알고리즘

 

교착 상태 검출 후 회복

  • 교착 상태의 발생을 인정하고 사후에 조치하는 방식
  • 프로세스가 자원을 요구하면 일단 할당, 교착 상태가 검출되면 회복
  • 검출 후 회복 방식 2가지
    1. 선점을 통한 회복
      • 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
    2. 프로세스 강제 종료를 통한 회복
      • 교착 상태에 놓인 프로세스 모두 강제 종료 (작업 내역을 잃을 위험이 존재한다)
      • 교착 상태가 해결될 때까지 한 프로세스씩 강제 종료 (교착 상태가 없어졌는지 확인하는 과정에서 오버헤드 발생)

 

교착 상태 무시

  • 타조 알고리즘 : 드물게 발생하는 잠재적 문제를 무시로 대처하는 방식
  • 문제 발생의 빈도나 심각성에 따라 때때로 적합한 방식일 수도 있다.

 


 

 

주절주절 : 📖 ➡️ 👀 ➡️ 🤯 ➡️ ☠️ ➡️ 👻 ➡️ 📖

+ Recent posts