동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게
수행하기 위해 서로 협력하며 영향을 주고 받는다.
협력하여 실행되는 프로세스들은 싱행 순서와 자원의 일관성을 보장해야 하기 때문에 반드시 '동기화'해야 한다.

 

📌 동기화가 필요한 이유

멀티프로세스 / 멀티스레드 환경에서는 여러 개의 프로세스나 스레드가 동시에 공유 데이터에 접근할 경우
문제가 발생할 수 있다.
이러한 문제를 해결하기 위해 동기화 기법이 필요하다.
  • 경쟁 조건( Race Condition ) 방지
    • 여러 스레드가 동시에 공유 자원에 접근하여 값이 꼬이는 문제를 방지한다.
    • 경쟁 조건이 발생하는 근본적인 이유를 확인하자면 다음과 같다.
      • 간단히 특정 값을 증가시키는 ++ 이라고 하더라도 저급언어로 변환되면 실제 실행되는 코드는 다르게 나타난다.
a++; // 1 증가

// 실제 저급언어
r1 = a // a를 레지스터에 저장
r1 = r1 + 1 // 레지스터 값 1 감소
a = r1 // 레지스터 값을 총합 a에 저장

여기에서 r1은 레지스터를 의미함

 

위와 같이 1을 증가시키는 것도 저급 언어로 변환되면 3줄이나 되기 때문에 한줄 한줄 실행하는 과정에서 문맥 교환이 일어나면 데이터가 꼬일 수 있다.

 

  • 데이터 일관성 유지( Consistency )
    • 한 프로세스가 데이터를 변경하는 동안 다른 프로세스가 변경된 데이터를 올바르게 읽도록 보장한다.
  • 교착 상태( Deadlock ) 방지
    • 여러 프로세스가 서로의 자원을 기다리면서 무한 대기 상태에 빠지는 문제를 방지한다.
운영체제는 임계 구역 문제를 아래 세가지 원칙 하에 해결한다.

 

1️⃣ 상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
2️⃣ 진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야함
3️⃣ 유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함 ( 임계 구역에 들어오기 위해 무한정 대기하면 안됨 )


📌 동기화 기법

🔹 뮤텍스 락

  • 특징 : 한 번에 하나의 스레드만 공유 자원에 접근할 수 있도록 보장해준다. ( 상호 배제 해결을 위한 도구 )
  • 사용 : pthread_mutext_lock() / pthread_mutex_unlock()
  • pthread_mutext_lock는 임계 구역에 진입하기 전에 호출해서 다른 스레드의 진입을 막는다.
  • pthread_mutext_unlock는 임계 구역에서의 작업이 끝나고 호출해서 다른 스레드가 접근할 수 있도록 한다.

예제

pthread_mutex_t lock;
pthread_mutex_lock(&lock);
shared_data++;
pthread_mutex_unlock(&lock);

 

 

🔹 세마포어

  • 특징 : 여러 개의 프로세스가 자원을 제한적으로 사용할 수 있도록 관리
  • 사용 : sem_wait() / sem_post()

예제

#include <semaphore.h>
sem_t sem;
sem_wait(&sem); // 자원 사용 시작
// 공유 자원 접근
sem_post(&sem); // 자원 해제

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 페이징  (0) 2025.02.13
[CS] 가상 메모리  (0) 2025.02.13
[CS] CPU 스케줄링  (0) 2025.02.11
[CS] 스레드  (0) 2025.02.11
[CS] 프로세스 계층 구조  (0) 2025.02.11

+ Recent posts