Skip to content

Latest commit

 

History

History
45 lines (34 loc) · 3.07 KB

concurrency.md

File metadata and controls

45 lines (34 loc) · 3.07 KB

동시성 문제에 대하여

동시성 문제란?
"여러 프로세스나 스레드가 동시에 동일한 리소스에 접근하거나 작업을 수행할 때 발생할 수 있는 문제"

동시성 문제의 종류

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

레이스 컨디션은 여러 스레드가 공유 자원에 접근할 때 발생하며, 어떤 스레드가 먼저 실행되는지에 따라 결과가 달라지는 현상이다.
예를 들어, 여러 스레드가 동시에 특정 변수에 접근해 값을 읽고 변경한다면 예상치 못한 값이 저장될 수 있다.

2. 데드락(Deadlock)

데드락은 두 개 이상의 스레드가 서로 자원을 점유한 상태에서 상대방의 자원을 기다리며 무한 대기에 빠지는 상태이다.
이는 시스템의 일부가 영구적으로 멈추는 문제를 일으킬 수 있다.

3. 라이브락(Livelock)

라이브락은 데드락과 유사하게 스레드가 필요한 자원을 확보하지 못해 작업을 진행하지 못하는 상태이지만,
각 스레드가 계속해서 상태를 변경하려고 시도하여 진행되지 못하는 현상이다.

4. 기아(Starvation)

기아는 특정 스레드가 다른 스레드에 의해 무한정 대기하는 상태를 말한다.
우선순위가 낮은 스레드가 우선순위가 높은 스레드에 밀려 계속해서 실행되지 못하는 경우가 해당된다.

동시성 문제 해결 방법

1. 락(Lock) 사용

락은 하나의 스레드만 특정 코드 블록을 실행하도록 보장한다.
락을 통해 여러 스레드가 동시에 동일 자원에 접근하는 것을 제어할 수 있다.
대표적인 락에는 synchronized 키워드(Java), Mutex(Python), Semaphore 등이 있다.

2. 원자성 보장 (Atomic Operations)

원자성은 작업이 중간에 중단되지 않고 한 번에 완료되는 것을 의미한다.
원자성을 보장하는 연산을 사용하면 여러 스레드가 동시에 변수에 접근하더라도 안전하게 처리할 수 있다.
예를 들어, Java의 AtomicInteger 클래스는 원자성을 보장해 동시성 문제를 예방한다.

3. 세마포어(Semaphore)

세마포어는 동시에 접근할 수 있는 스레드의 수를 제한하는 동기화 기법이다.
지정된 수만큼의 스레드가 자원에 접근할 수 있으며, 이를 통해 자원 경합을 제어할 수 있다.

4. 모니터(Monitor)와 조건 변수(Condition Variable)

모니터는 특정 코드 블록에 한 번에 하나의 스레드만 접근하도록 제어한다.
조건 변수는 스레드가 특정 조건을 만족할 때까지 대기하다가 조건이 충족되면 실행을 재개할 수 있도록 한다.

5. 비동기 및 이벤트 기반 프로그래밍

비동기 프로그래밍은 스레드 간의 상호작용을 최소화하여 동시성 문제를 줄이는 방법이다.
이벤트 기반 모델을 사용하면 스레드 간의 직접적인 상호작용을 줄이고, 특정 이벤트가 발생했을 때만 작업을 수행하도록 할 수 있다.