운영체제/동기화

운영체제) 프로세스 동기화와 경쟁 조건

Dev.Andy 2024. 5. 1. 20:11

머리말

공유 데이터와 데이터의 비일관성(data inconsistency)

멀티 스레드 / 멀티 프로세스의 환경에서는 여러 작업을 동시에 실행시키기 때문에, 효율성을 증가시킬 수 있지만, 공유하는 자원에 대한 접근에 주의를 기울여야 한다.

concurrent access to shared data may result in data inconsistency.
공유 데이터에 대한 비동기적인 접근은 데이터의 비일관성을 유발할 수 있다.

본문

동시성과 병렬성 (Concurreny & Parallelism)

1. 동시성에서의 실행(Concurrent Execution)

a process may be interrupted at any point in its instruction stream.
하나의 프로세스의 실행 흐름에서 어느 때에나 인터럽트가 발생할 수 있다.
→ 다른 프로세스가 공유 데이터에 접근하면 문제가 발생할 수 있다.

2. Parallel Execution (병렬성에서의 실행)

two or more instruction streams in different processes
여러 개의 프로세스에서 두 개 이상의 실행 흐름이 발생한다.
→ 서로 다른 코어(CPU)에서 공유 데이터를 접근할 수 있는 문제가 있다.

생산자-소비자 문제 (Producer-Consumer Problem)

생잔자와 소비자에 대한 코드

아래 코드 블럭을 보면, count에 대한 증감 코드가 있다.

`count++`로 아이템을 늘리는 생산자와, `count--`로 아이템을 줄이는 소비자가 있다.

생산자-소비자 문제와 증감 코드
생산자-소비자 문제와 증감 코드

Silbershatz, Abraham, Peter B. Galvin, and Greg Gagne. Operating System Concepts. 10th ed., (New Jersery: John Wiley & Sons, 2018), 258.

코드로 보면 아무 문제 없는 코드이지만, 여기서 문제가 있다.

레지스터 수준에서의 증감 코드 분석

CPU의 레지스터 수준으로 내려가면 `count++`와 `count--`의 코드는 아래와 같다.

CPU 수준의 증감 코드

Silbershatz, Abraham, Peter B. Galvin, and Greg Gagne. Operating System Concepts. 10th ed., (New Jersery: John Wiley & Sons, 2018), 259.

  1. 레지스터에 𝑐𝑜𝑢𝑛𝑡의 값을 할당한다.
  2. 레지스터의 값을 1 증가(또는 감소)시킨다.
  3. 𝑐𝑜𝑢𝑛𝑡에 레지스터의 값을 다시 할당한다.

레지스터의 증감 실행 중에 문맥 교환이 발생한다면? ⛔️

하지만, 여기서 레지스터가 공유 자원인 $count$ 값을 증감하기 위해 실행하는 동안, 문맥 교환(Context Switching)이 일어나게 되면, 실제 $count$의 값이 달라질 수 있다.

레지스터의 증감 이후 문맥 교환 발생과 공유 자원의 오류
레지스터의 증감 이후 문맥 교환 발생과 공유 자원의 오류

위처럼 레지스터의 증감 이후, 다시 공유 자원에 이를 할당하기 전에 문맥 교환이 일어난다면, 공유 자원의 실제 값은 달라지게 된다.

임계 영역과 상호 배제(Critical Section and Mutual Exclusion)

임계 영역(Critical Section)

임계 영역(Critical Section)이란, 서로 다른 프로세스가 공유 데이터에 접근하는 코드 블록을 의미한다.

임계영역에 대한 코드
임계영역에 대한 코드

Silbershatz, Abraham, Peter B. Galvin, and Greg Gagne. Operating System Concepts. 10th ed., (New Jersery: John Wiley & Sons, 2018), 260.

임계 영역의 조건 3가지 🌟

  1. 상호 배제(Mutual Exclusion): 어떠한 프로세스가 임계 영역에서 실행 중이면, 다른 어떠한 프로세스는 임계 영역이 이를 침범하여 실행할 수 없다.
  2. 진행(Progress): 임계 영역에 실행 중인 프로세스가 없고, 임계 영역에들어가 실행을 원하는 프로세스가 있다면, 이후에 선택되어 실행될 수 있다. 하지만 이러한 프로세스 선택은 무기한 연기되어서는 안된다.
  3. 제한된 대기(Bounded waiting): 어떠한 프로세스가 임계 영역에 들어가고자 하는 요청 이후와 해당 요청이 허용되기 이전에, 다른 프로세스가 임계 영역에 들어가는 것에 대한 횟수의 제한이 있다.

꼬리말

참고자료

  • Silbershatz, Abraham, Peter B. Galvin, and Greg Gagne. Operating System Concepts. 10th ed.