동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게
수행하기 위해 서로 협력하며 영향을 주고 받는다.
협력하여 실행되는 프로세스들은 싱행 순서와 자원의 일관성을 보장해야 하기 때문에 반드시 '동기화'해야 한다.
📌 동기화가 필요한 이유
멀티프로세스 / 멀티스레드 환경에서는 여러 개의 프로세스나 스레드가 동시에 공유 데이터에 접근할 경우
문제가 발생할 수 있다.
이러한 문제를 해결하기 위해 동기화 기법이 필요하다.
- 경쟁 조건( 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 |