개발자공부일기

크리티컬 섹션 본문

TIL(Today I Learned)

크리티컬 섹션

JavaCPP 2025. 3. 11. 21:16

크리티컬 섹션(Critical Section)이란?

크리티컬 섹션(Critical Section)은 멀티스레드 또는 멀티프로세스 환경에서 공유 자원에 접근하는 코드 영역을 의미한다.
멀티스레드 프로그래밍에서는 여러 개의 스레드가 동시에 동일한 공유 데이터를 수정하려고 할 때 경쟁 조건(Race Condition)이 발생할 수 있으며, 데이터 무결성이 손상될 위험이 있다.
따라서, 크리티컬 섹션은 한 번에 하나의 프로세스 또는 스레드만 실행할 수 있도록 제한하여 데이터 일관성을 유지해야 한다.

크리티컬 섹션이 필요한 이유

  • 여러 개의 프로세스 또는 스레드가 동시에 동일한 공유 데이터에 접근하면 예기치 않은 결과가 발생할 수 있다.
  • 동시에 두 개 이상의 스레드가 변수를 읽고 수정하면 데이터가 손상될 수 있다.
  • 크리티컬 섹션을 사용하면 데이터 무결성을 보장하고, 경쟁 조건을 방지하며, 동기화 문제를 해결할 수 있다.

크리티컬 섹션의 핵심 개념

  • 원자성(Atomicity): 크리티컬 섹션 내의 작업은 다른 프로세스나 스레드의 간섭 없이 하나의 단위로 실행되어야 한다.
  • 상호 배제(Mutual Exclusion): 크리티컬 섹션에 동시에 두 개 이상의 프로세스가 접근할 수 없다.
  • 동기화(Synchronization): 여러 개의 프로세스 또는 스레드가 크리티컬 섹션을 안전하게 사용할 수 있도록 제어해야 한다.
  • 교착 상태(Deadlock) 및 기아 상태(Starvation) 위험: 동기화가 잘못되면 교착 상태(Deadlock)나 기아 상태(Starvation)가 발생할 수 있다.

크리티컬 섹션의 특징

공유 리소스를 보호한다.

크리티컬 섹션은 여러 개의 스레드 또는 프로세스가 동시에 접근하는 공유 데이터, 파일, 메모리 또는 I/O 장치 등을 보호하는 역할을 한다.

상호 배제를 제공한다.

크리티컬 섹션을 통해 하나의 스레드만 실행되도록 제한하여 경쟁 조건(Race Condition)을 방지할 수 있다.

동기화 메커니즘을 활용한다.

크리티컬 섹션을 보호하기 위해 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor) 등의 동기화 기법을 활용한다.

진입점(Entry)과 출구점(Exit)을 관리한다.

  • 진입 지점: 공유 리소스에 접근하기 전에 크리티컬 섹션에 들어가기 위한 조건을 검사한다.
  • 출구 지점: 크리티컬 섹션을 벗어나면서 다른 스레드가 접근할 수 있도록 잠금을 해제한다.

데이터 일관성을 유지한다.

  • 여러 개의 스레드가 동시에 동일한 데이터를 수정할 경우, 데이터가 손상될 가능성이 높기 때문에 크리티컬 섹션을 사용하여 데이터의 무결성을 유지한다.

성능 영향 및 병목 현상이 발생할 수 있다.

  • 크리티컬 섹션을 설정하면 하나의 스레드만 실행될 수 있기 때문에 병목 현상(Bottleneck)이 발생할 수 있다.
  • 성능 최적화를 위해 최대한 짧은 시간 동안 크리티컬 섹션을 유지하는 것이 중요하다.

교착 상태(Deadlock) 및 기아 상태(Starvation) 문제가 발생할 수 있다.

  • 크리티컬 섹션을 잘못 구현하면 교착 상태가 발생하여 프로세스가 무기한 대기하는 문제가 발생할 수 있다.
  • 우선순위가 낮은 프로세스가 계속해서 크리티컬 섹션에 접근하지 못하는 기아 상태(Starvation) 문제도 발생할 수 있다.

크리티컬 섹션의 장점

경쟁 조건을 방지할 수 있다.

  • 크리티컬 섹션을 사용하면 한 번에 하나의 프로세스만 공유 데이터에 접근할 수 있도록 제한하여 경쟁 조건을 방지할 수 있다.

데이터 무결성을 보장할 수 있다.

  • 여러 개의 프로세스가 동시에 데이터를 수정하지 못하도록 제어하여 데이터 손상 및 일관성 문제를 방지할 수 있다.

성능 최적화가 가능하다.

  • 크리티컬 섹션을 효율적으로 설계하면 불필요한 데이터 경합을 줄여 시스템 성능을 향상시킬 수 있다.

코드 유지보수가 용이하다.

  • 크리티컬 섹션을 활용하면 멀티스레드 프로그램의 동작을 예측 가능하게 만들어 코드 유지보수가 쉬워진다.

 

크리티컬 섹션의 단점

병목 현상이 발생할 수 있다.

  • 한 번에 하나의 프로세스만 실행되기 때문에, 여러 개의 프로세스가 대기해야 하는 경우 성능 저하가 발생할 수 있다.

구현이 어렵고 복잡할 수 있다.

  • 크리티컬 섹션을 잘못 설계하면 데드락(Deadlock)이나 기아 상태(Starvation) 등의 문제가 발생할 수 있다.
  • 적절한 동기화 기법을 적용해야 한다.

운영체제의 관리 비용이 증가한다.

  • 운영체제는 어떤 프로세스가 크리티컬 섹션을 사용 중인지 추적해야 하며, 이로 인해 추가적인 시스템 자원이 필요할 수 있다.

 

크리티컬 섹션 문제 해결 방법 (동기화 기법)

소프트웨어 기반 해결 방법

  • 운영체제의 도움 없이 알고리즘을 활용하여 크리티컬 섹션 문제를 해결하는 방식이다.

Peterson’s Algorithm (피터슨 알고리즘)

  • 두 개의 프로세스만 동기화할 수 있는 방법으로, 공유 변수(flag, turn)를 사용하여 경쟁 조건을 방지한다.

Dekker’s Algorithm (데커 알고리즘)

  • 두 개의 프로세스가 순차적으로 크리티컬 섹션을 사용할 수 있도록 보장하는 방법이다.

하드웨어 기반 해결 방법

Test and Set (TS) 명령어

  • 원자적으로 실행되는 Test-and-Set Lock (TSL) 명령어를 사용하여 동기화 문제를 해결할 수 있다.

Swap 명령어

  • 두 개의 값을 원자적으로 교환하여 동기화 문제를 해결하는 방법이다.

동기화 기법을 활용한 해결 방법

Mutex (뮤텍스)

  • 하나의 프로세스(또는 스레드)가 공유 자원을 독점할 수 있도록 하는 동기화 도구이다.

Semaphore (세마포어)

  • 여러 개의 프로세스가 동시에 공유 자원에 접근할 수 있도록 허용하는 동기화 기법이다.

Monitor (모니터)

  • 뮤텍스와 조건 변수를 조합하여 사용하며, Java에서는 synchronized 키워드로 구현할 수 있다.

 

'TIL(Today I Learned)' 카테고리의 다른 글

Apache와 Nginx  (0) 2025.03.12
좋은 코드  (0) 2025.02.11
빅 엔디안 & 리틀 엔디안  (0) 2025.02.03
패킷에 헤더 붙여서 전송하기  (0) 2025.01.24
oneof  (0) 2025.01.22