레츠고✨

[OS] 경쟁 조건과 프로세스 동기화, 임계 구역 문제 해결 본문

Computer Science/Operating System

[OS] 경쟁 조건과 프로세스 동기화, 임계 구역 문제 해결

소냐. 2025. 1. 15. 13:32

 

🌱 들어가기 전

프로세스와 스레드는 병행 또는 병렬로 실행이 가능합니다.

또한 프로세스 간 데이터 공유가 필요할 때에는 IPC를 사용할 수 있고,

스레드 간 데이터 공유도 가능합니다.

이런 배경에서 만약 여러 프로세스와 스레드가 같은 데이터에 접근하여 조작하려고 하는 상황이 발생한다면 어떨까요?

그런 상황에서 데이터의 일관성과 무결성이 무너질 수 있는데, 이런 상황을 경쟁 조건이라고 합니다.

경쟁 조건을 해결하기 위해서 프로세스와 스레드 간 동기화 작업이 필요합니다

 

경쟁 조건과 동기화 개념

✅ 경쟁 조건(Race Condition)

여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황

Process P1과 P2가 공유 데이터인 count에 동시에 접근하려고 할 때에 각 프로세스의 명령어 처리 순서에 띠라서 결과가 달라지게 된다.

 

✅ 동기화(Synchronization)

여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것

 

동기화의 필요성

: 어떠한 데이터에 동시 작업이 일어났을 경우, 처리순서에 상관없이 원하는 결과값을 얻기 위해서 동기화가 필요하다

 

 

어떻게 동기화를 시킬 수 있을까?

“공유 데이터에 접근하는 부분(코드 영역)”한 번에 하나의 프로세스/스레드만 진입”할 수 있게 하자 = 동기화

  • 공유 데이터에 접근하는 부분(코드 영역) = 임계 구역 (critical section)
  • 한 번에 하나의 프로세스/스레드만 집입해서 실행 가능 = 상호 배제 (mutual exclusion)

 

 

임계 구역 (critical section)

공유 데이터의 일관성을 보장하기 위해서 하나의 프로세스/스레드만 진입해서 실행 가능한 영역

 

임계 구역 문제 = 동기화 문제

다중 스레드 또는 다중 프로세스 환경에서 공유 자원에 대해 동시 접근이 이루어질 때,
자원의 일관성과 무결성을 유지하기 위해 상호 배제(mutual exclusion)를 보장해야 하는 문제
즉, 임계 구역 문제(동기화 문제)를 해결함으로써 '동기화'를 시킬 수 있다.

 

 

  • entry section
    : critical section에 진입할 요건이 되는지 확인하고,
    임계 구역 진입을 요구 (임계 구역 락을 요구)
  • critical section (임계 구역)
    : 데이터 일관성이 중요하기 때문에 하나의 프로세스만 접근해야 하는 영역
  • exit section
    : critical section 코드를 실행을 마쳤음을 알림 (임계 구역을 락을 놓음)

 

 

예시) Bank Account Problem 

 

  • 공통 변수 balance에 대한 동시 업데이트
  • 임계 구역
    : balance를 업데이트하는 부분의 코드
  • 위 그림에서의 임계 구역
    → balance를 업데이트하는 부분의 코드
  • 각각의 스레드가 임계 구역을 가지는 코드를 가지고 있기에 잘못된 결과가 출력된다

 

 

 

임계 구역 문제 해결을 위한 조건

  1. 상호 배제 (mutual exclusion)
    : 한 번에 하나의 프로세스/스레드만 임계 구역에서 실행가능
  2. 진행 (progress)
    : 임계구역이 비어있고 어떤 프로세스/스레드가 진입하기를 원한다면 그 중 하나는 임계구역에서 실행되도록 해야 한다 (진행이 계속 되게끔 해야 함)
  3. 한정된 대기 (bounded waiting)
    : 어떤 프로세스/스레드가 임계구역에 들어가기 위해 무한정 기다리게 되어서는 안된다

임계 구역 문제 해결 방법

가장 중요한 것은, 상호 배제 (mutual exclusion)를 보장해야 한다

⇒ 즉, 한 번에 하나의 스레드만 임계 구역을 실행할 수 있게 해야 한다

 

▶️ 피터슨 알고리즘 (Peterson’s Solution)

두 개의 프로세스 동기화 문제를 해결하는 고전적인 알고리즘
현대 버전에 적용되는 것이 보장되지 않지만 알고리즘 자체가 동기화 문제 해결 방법들의 기반이 된다.

 

📍 변수

int turn;
boolean flag[2];
  • turn
    : critical section에 들어갈 수 있는 프로세스를 나타냄(임계구역으로 진입할 순번)
    turn == i 이면 프로세스 Pi가 임계구역에서 실행될 수 있다는 뜻
  • flag
    : critical section에 들어갈 준비 상태를 나타내는 변수
    flag[i]가 참이라면 Pi가 임계구역으로 진입할 준비가 되었다는 뜻

 

📍 알고리즘

// P_i 프로세스 의 알고리즘
while (true) {
  flag[i] = true;
  turn = j;		// 또 다른 프로세스를 j라고 가정.
	
  while(flag[j] && turn == j);  
  
  /* critical section */
    
  flag[i] = false;
    
  /* remainder section */

}
  1. entry section
    • 임계 구역에 진입하는 프로세스 인덱스의 flag를 true로 설정
    • turn은 상대 프로세스에게 넘김
    • 임계 구역에 진입하기 직전, 상대 프로세스의 진입 요청 여부를 확인 (while(flag[j] && turn == j);)
  2. critical section
    • 임계 구역에 진입하여 코드 실행
  3. exit section
    • 임계 구역에 나갈 때에 자신의 프로세스 flag를 false로 설정

🚫 한계점

  • 두 개의 프로세스 간의 동기화만 처리할 수 있다.
  • 현대 운영체제 시스템에서는 신뢰할 수 없는 고전적인 알고리즘이다.

▶️ 그렇다면 현대 OS 에서는 어떻게 해결할까? -> "락(lock)"을 사용

  • 스핀락
  • 뮤텍스 락
  • 세마포
  • 모니터

👉 to be continue ...

 

 

 

728x90