cs study/운영체제

2.운영체제 : 프로세스 동기화 과정

지그농 2026. 4. 8. 18:20

해당 내용은 이것이 컴퓨터 과학이다 with CS 기술면접을 학습을 기반으로 한 CS 스터디 기록입니다.

 

목차
1. 동기화란?
2. 동기화 기법
3. 교착 상태 (Deadlock)

 

 

 

멀티프로세스와 멀티 스레드 환경에서는 여러 실행 흐름이 동시에 동작한다.

이때 하나의 공유 자원을 여러 실행 흐름이 동시에 접근하게 되면 예상하지 못한 문제가 발생할 수 있다.

 

이러한 문제를 해결하기 위한 개념이 바로 동기화(Synchronization)이다.


1. 동기화란?

동기화란 여러 프로세스 또는 여러 스레드가 공유 자원에 접근할 때 실행 순서를 제어하며 데이터의 일관성을 유지하는 것을 의미한다.

 

동기화는 다음의 2가지 조건을 준수하며 실행하게 된다. 

  1. 실행 순서 제어 : 프로세스 및 스레드를 올바른 순서로 실행하기
  2. 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스 및 스레드만 접근하기

1-1. 임계구역 (Critical Section)

실행 순서에 따른 프로세스의 임계 구역 접근

출처 : 이것이 취업을 위한 컴퓨터 과학이다

 

임계 구역은 동시에 둘 이상의 실행 흐름(프로세스 또는 스레드)이 공유 자원에 접근할 경우 문제가 발생할 수 있는 코드 영역을 의미한다. 즉, 한 번에 하나의 실행 흐름만 접근해야 하는 구간이다.

 

멀티 프로세스 또는 멀티 스레드 환경에서는 여러 실행 흐름이 동시에 동작하기 때문에, 임계 구역에 대한 제어가 없다면 동일한 자원에 동시에 접근하게 된다. 이 경우 프로그램의 실행 결과가 의도와 다르게 동작하는 레이스 컨디션 문제 상황이 발생할 수 있다.


1-2. 레이스 컨디션 (Race Condition)

레이스 컨디션은 두 개 이상의 실행 흐름이 임계 구역에 동시에 접근하여 실행 순서에 따라 결과가 달라지는 상황을 의미한다.

 

 

레이스 컨디션이 발생하면 자원의 일관성이 손상될 수 있고,실행 결과를 예측할 수 없는 문제가 발생하게 된다.

이러한 문제를 방지하기 위해서는, 임계 구역에는 반드시 한 번에 하나의 실행 흐름만 접근하도록 제어해야 한다.

 

즉, 하나의 스레드가 작업을 수행하는 동안 다른 스레드는 대기해야한다.

이러한 제어 방식이 바로 동기화이다.


1-3. 동기화가 필요한 이유

동기화는 여러 프로세스 또는 스레드가 동시에 실행되는 환경에서 공유 자원의 일관성과 프로그램의 올바른 동작을 보장하기 위해 필요하다.

  • 데이터 일관성 유지
  • 예측 가능한 프로그램 실행
  • 버그 발생 가능성 감소

동기화는 단순한 성능 문제가 아니라, 프로그램의 정확성을 보장하기 위한 필수 요소이다.

동기화는 목적에 따라 구분되며, 실행 순서 제어를 위한 동기화와 상호 배제를 위한 동기화가 있다.

 

  1. 실행 순서 제어 (Synchronization) : 특정 작업이 정해진 순서대로 실행되도록 보장하는 것
  2. 상호 배제 (Mutual Exclusion) : 임계 구역에 동시에 하나의 실행 흐름만 접근하도록 제한하는 것. 레이스 컨디션 방지의 핵심 개념

2. 동기화 기법

2-1. 뮤텍스 락 (Mutex Lock)

뮤텍스 락은 상호 배제를 보장하는 가장 기본적인 방법이며 (MUTual EXclusion), 기본 원리는 다음과 같다.

Mutex 도식화

이미지 출처 : https://www.geeksforgeeks.org/linux-unix/mutex-lock-for-linux-thread-synchronization

 

  1. 임계 구역에 접근하고자 한다면 반드시 락(lock)을 획득(acquire)해야 한다.
  2. 임계 구역에서의 작업이 끝났다면 락을 해제(release)해야 한다.

 

프로세스와 스레드가 공유하는 변수(lock)와 2 개의 함수(acquire, releas)로 구현되기 때문에 구현이 단순하며, lock을 획득할 때 까지 접근할 수 없기 때문에 강력한 제어가 가능하다. 

 

하지만 그만큼 대기 시간이 길어져 성능이 저하되는 단점이 발생하기도 한다.


2-2. 세마포어 (Semaphore)

뮤텍스 락은 하나의 공유 자원을 고려하는 동기화 도구이다.

여러 개의 공유 자원에 접근해야 하는 경우 사용되는 동기화 기법은 세마포어라고 하며, 뮤테스락과 유사하게 다음과 같이 구성된다.

 

공유 자원이 2개일 때 세마포어 동기화 실행 과정

출처 : 이것이 취업을 위한 컴퓨터 과학이다

 

  1. 변수 S : 사용 가능한 공유 자원의 개수를 나타내는 변수 (임계 구역에 진입할 수 있는 프로세스 개수와 같다.)
  2. wait() 함수 : 임계 구역 진입 전 호출하는 함수
  3. signal() 함수 : 임계 구역 진입 후 호출하는 함수

 

세마포어는 크게 두 가지 종류가 있다. 

 

  1. 이진 세마포 (Binary Semaphore) : S가 0과 1의 값을 가지는 세마포어, 뮤텍스와 유사하게 동작
  2. 카운팅 세마포어 (Counting Semaphore) : 여러 개 자원 관리 가능 (일반적 세마포어)

2-3. 조건 변수와 모니터 (Condition Value & Monitor)

조건 변수실행 순서 제어를 위한 동기화 도구로, 특정 조건 하에 프로세스를 실행/중단하여 프로세스나 스레드의 실행 순서를 제어할 수 있다.

 

조건 변수에 대해 wait() 함수와 signal() 함수를 호출할 수 있으며, 각 함수는 다음과 같은 동작을 한다.

 

조건 변수 함수 호출을 통한 실행 순서 제어

출처 : 이것이 취업을 위한 컴퓨터 과학이다

 

 

  • wait() : 호출한 프로세스 및 스레드의 상태를 조건을 만족할 때 까지 대기 상태로 전환
  • signal() : 조건 만족 시 깨움, 일시 중지된 프로세스 및 스레드의 실행을 재개

 

 

모니터는 공유 자원과 이를 다루는 함수들을 하나의 단위로 묶어 관리하는 동기화 도구이다.

 

즉, 전역 변수와 같은 공유 자원과 해당 자원을 다루는 연산을 캡슐화하여 외부에서 직접 접근하지 못하도록 하고, 정해진 방식으로만 접근하도록 강제한다.  따라서 모니터는 상호 배제 뿐만 아니라, 실행 순서 제어까지 동시에 지원할 수 있다.

 

모니터는 다음과 같은 방식으로 동작한다.

모니터 동기화 작동 원리

출처 : 이것이 취업을 위한 컴퓨터 과학이다

 

  1. 프로세스 및 스레는 공유 자원에 접근하기 위해 반드시 정해진 공유 자원 연산을 통해 모니터에 내로 진입해야 한다.
  2. 모니터 내부에서 실행되는 프로세스 및 스레드는 항상 하나여야 한다.
  3. 이미 모니터 내부에 실행 중인 다른 프로세스 및 스레드가 있다면 큐에서 대기해야 한다.
  4. 모니터 내 실행중인 프로세스가 종료되면 큐에서 대기하고 있던 프로세스가 모니터 내에 진입하여 실행된다.
  5. 조건변수는 모니터에 함께 사용되어 실행 순서를 제어하게 된다.
    • wait() 함수 : 대기 큐 이동, 3번 과정에 해당
    • signal() 함수 : 대기 중인 스레드 하나를 깨움

2-4. 스레드 안전 (Thread Safety)

스레드 안전이란 멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태를 의미한다.

 

 


3. 교착 상태 (Deadlock)

3-1. 교착 상태란

Dealock

이미지 출처 : https://www.geeksforgeeks.org/operating-systems/introduction-of-deadlock-in-operating-system/

 

교착 상태란 두 개 이상의 프로세스가 서로 자원을 기다리며, 영원이 실행되지 못하는 상태를 의미한다.


3-2. 교착 상태의 발생 조건

교착 상태가 발생하는 상황에는 4가지 필요 조건이 있다.

이 중 하나라도 만족하지 않는다면 교착 상태는 발생하지 않고, 모두 만족할 경우 교착 상태가 발생할 가능성이 생긴다.

 

  1. 상호 배제 (Mutual Exclusion) : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없다.
  2. 점유와 대기 (Hold and Wait) : 어떤 자원을 할당받을 상태에서 다른 자원을 기다린다.
  3. 비선점 (No Preemption) : 해당 자원을 이용하는 프로세스의 작업이 끝나야 자원을 이용할 수 있다. (강제로 빼앗지 못한다)
  4. 순환 대기 (Circular Wait) : 프로세스가 요청하는 자원이 원의 형태를 이룬다. (서로의 자원을 요청, 대기하는 상태)

3-3. 교착 상태 해결 방법

교착 상태를 해결하는 방법에는 예방, 회피, 그리고 검출 후 회복이 있다. 

  1. 교착 상태 예방 (Prevention) : 교착 상태 발생 조건 4가지 중 하나를 제거하여 예방
  2. 교착 상태 회피 (Avoidance) : 한정된 자원의 무분별한 할당으로 발생하는 문제로 정의, 할당 전 발생하지 않을 정도로 안정 상태 검사 후 할당, 은행원 알고리즘
  3. 검출 후 회복 (Detection & Recovery) : 교착 상태 발생을 인정하고 사후 조치, 자원 선점 또는 강제 종료하여 회복