스터디/CS 스터디

운영체제 - 동기화와 교착상태

xladmt 2025. 3. 14. 16:47

들어가며


운영체제(OS)에서 동기화(Synchronization)교착상태(Deadlock)는 멀티태스킹 환경에서 중요한 개념이다. 특히, 여러 프로세스나 스레드가 한정된 자원을 공유할 때 발생할 수 있는 문제들을 해결하기 위해 필수적으로 고려해야 한다. 이번 글에서는 동기화의 개념과 필요성, 교착상태의 원인과 해결 방안을 살펴보겠다.



1. 동기화(Synchronization)


동기화란?
동기화(Synchronization)란 여러 개의 프로세스 또는 스레드가 동시에 실행될 때, 공유 자원에 대한 접근을 조정하여 일관성을 유지하는 기법을 의미한다. 이를 통해 데이터의 무결성을 보장하고 경쟁 상태(Race Condition)로 인한 오류를 방지할 수 있다.

동기화가 필요한 이유
운영체제에서 여러 개의 프로세스나 스레드가 동시에 실행되면서 동일한 자원을 사용할 경우, 아래와 같은 문제가 발생할 수 있다.
- 데이터 불일치(Data Inconsistency): 두 개 이상의 스레드가 동일한 데이터를 수정하면, 예기치 않은 결과가 발생할 수 있다.
- 경쟁 상태(Race Condition): 여러 스레드가 동시에 실행되면서 실행 순서에 따라 결과가 달라지는 현상이다.
- 원자성(Atomicity) 문제: 작업이 부분적으로만 수행되고 중단될 경우, 데이터가 손상될 위험이 있다.

동기화 기법
동기화를 구현하는 주요 방법들은 다음과 같다.

(1) 뮤텍스(Mutex)

자원의 동시 사용을 피하는 기법

  • 임계 구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되도록 하는 기술
  • 한 프로세스/스레드에 의해 소유될 수 있는 Key를 기반으로 한 상호배제기법
  • Locking 메커니즘으로 락을 걸은 스레드만이 임계 영역을 나갈 때 락을 해제할 수 있다.
  • 동기화 대상이 1개일 때만 사용한다.

 

(2) 세마포어(Semaphore)

 

공유 자원에 대한 접근을 제한하는 기법

  • 공유 자원에 접근할 수 있는 프로세스/스레드 수를 나타내는 값(=자원의 개수)을 두어 상호배제를 달성한다.
  • Signaling 메커니즘으로 락을 걸지 않은 스레드도 signal로 락을 해제할 수 있다. (뮤텍스와의 차이)
  • 동기화 대상이 1개 이상일 때 사용한다.
  • Counting Semaphore, Binary Semaphore 두 종류가 있는데 이진 세마포어는 세마포어의 카운트가 1이라서 뮤텍스와 같은 기능을 한다.
  • Wait 호출 : 세마포어의 카운트 1 감소(사용 가능한 자원이 1 줄어든다.), 카운트가 0보다 작거나 같아질 경우 락이 실행
  • Signal 호출 : 세마포어의 카운트 1 증가, 락이 걸린 상태일 경우 락에서 나올 수 있다. (자리가 없었다면 기다리던 스레드가 자원을 사용할 수 있다.)


2. 교착상태(Deadlock)

교착상태란?
교착상태(Deadlock)란 둘 이상의 프로세스가 서로 자원을 점유한 상태에서, 추가적인 자원을 요청하지만 다른 프로세스가 점유하고 있어 무한히 대기하는 상태를 의미한다.

교착상태 발생 조건
교착상태가 발생하려면 다음 네 가지 조건이 동시에 만족해야 한다.

1. 상호 배제(Mutual Exclusion): 한 번에 한 개의 프로세스만 특정 자원을 사용할 수 있다.
2. 점유와 대기(Hold and Wait): 자원을 점유한 프로세스가 추가 자원을 요청하면서 대기하는 상태이다.
3. 비선점(No Preemption): 다른 프로세스가 점유한 자원을 강제로 회수할 수 없다.
4. 순환 대기(Circular Wait): 프로세스들이 자원을 점유하고 서로 다음 자원을 기다리는 형태의 순환 관계가 존재한다.

교착상태 해결 방법
교착상태를 예방하거나 해결하는 방법은 다음과 같다.

(1) 예방(Prevention)
Coffman의 네 가지 조건 중 하나 이상을 제거하여 교착상태가 발생하지 않도록 한다.
- 상호 배제 제거: 공유 가능한 자원을 사용
- 점유와 대기 방지: 자원을 할당받기 전에 모든 자원을 미리 요청하도록 함
- 비선점 허용: 다른 프로세스가 자원을 회수할 수 있도록 설정
- 순환 대기 방지: 자원에 우선순위를 부여하여 순환을 방지

(2) 회피(Avoidance)
교착상태가 발생할 가능성이 있는지 실시간으로 검사하고, 안전한 경우에만 자원을 할당한다.
- 은행원 알고리즘(Banker's Algorithm): 프로세스의 최대 필요 자원을 미리 정의하고, 안전한 상태에서만 자원을 할당하는 기법

(3) 탐지(Detection) 및 복구(Recovery)
교착상태가 발생한 후 이를 탐지하고 해결하는 방법이다.
- 탐지(Detection): 주기적으로 시스템 상태를 검사하여 교착상태 여부를 확인
- 복구(Recovery): 교착상태를 해결하기 위해 프로세스를 종료하거나, 점유한 자원을 회수하는 방법을 사용



3. 정리

운영체제에서 동기화는 여러 프로세스나 스레드가 자원을 공유할 때 발생하는 문제를 방지하기 위한 기법이다. 반면, 교착상태는 여러 프로세스가 서로 자원을 기다리면서 영원히 실행되지 않는 문제이다.


멀티태스킹 환경에서는 동기화 기법을 적절히 사용하여 데이터의 무결성을 보장하고, 교착상태를 방지하는 것이 중요하다. 특히, 실시간 시스템이나 데이터베이스 환경에서는 동기화와 교착상태 관리가 성능과 안정성에 큰 영향을 미치므로, 적절한 해결 방법을 고려해야 한다.

 

 

[참고]

https://velog.io/@yun8565/%EB%8F%99%EA%B8%B0%ED%99%94%EC%99%80-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9CDeadlock