멀티스레드 프로그래밍이란?
하나의 프로세스 내에 여러 쓰레드가 동시에 작업을 수행하는 것
TIP: 프로세스의 성능이 단순히 스레드의 개수에 비례하는 것은 아니며, 하나의 스레드를 가진 프로세스 보다 두 개의 스레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있음
멀티 태스킹과 멀티스레드
멀티 태스킹이란 여러개의 프로세스가 동시에 작업을 수행하는 것이다.
여러 프로세스도 동시에 작업을 수행할 수 있지만 다음과 같은 단점을 가진다.
- 프로세스간 일어나는 컨텍스트 스위칭이 매우 복잡함
- 프로세스간 데이터 공유가 어려움(IPC와 같이 Kernel이 직접 개입해야하기 때문)
- 듀얼 코어 활용
이런 단점을 극복하고자 멀티 스레드 등장
- 같은 프로세스 내의 스레드 사이의 컨텍스트 스위칭은 비교적 가벼움
- 메모리를 공유
멀티스레드 프로그래밍
- 멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것이다.
- 장점
- 멀티 프로세스에 비해 메모리 자원소모가 줄어든다.
- Heap 영역을 통해서 스레드 간의 통신이 가능하기 때문에 프로세스 간의 통신이 간단해진다.
- 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 훨씬 빠르다.
- 단점
- 힙 영역에 있는 자원을 사용할 때 동기화를 해야한다.
- 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수도 있다.
- 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 영향을 받아 종료하게 될 수도 있다.
여기서 가장 큰 단점은 여러 스레드가 같은 데이터에 접근했을때 데이터의 일관성이 보장되지 않는다는 점이다.
이를 RaceCondition이라고 한다.
Thread Safe
Race Condition(경쟁 상태)
여러 프로세스들이 동시에 데이터에 접근하는 상황에서, 어떤 순서로 데이터에 접근하느냐에 따라 결과 값이 달라질 수 있는 상황
위 예시를 보면 A와 B가 Bank에 접근하는 순서가 달라지거나 동시에 접근하게 된다면 반환받는 값이 달라지게 된다. 이를 데이터 일관성이 없다 혹은 데이터 정합성이 지켜지지 않는다고 한다.
그리고 이 race condition이 일어날수 있는 구간을 Critical Section(임계구역)이라고 한다.
Race Condition을 예방하자
이런 Critical Section에서 Race Condition이 일어나는 것을 방지하기 위해 있는 작업이 프로세스 동기화이다.
프로세스 동기화(Process Synchronization)
프로세스 동기화란 여러 프로세스들이 동시에 데이터에 접근하는 상황, 즉 Race Condition에서 프로세스간의 실행 순서를 정해줌으로써 데이터 불일치 문제를 방지해주는 작업이다.
동기화 방식에는 대표적으로 두가지가 있다.
Mutex Lock
Critical Section에 진입하는 프로세스는 들어갈 때 Lock을 걸어 이미 하나의 프로세스가 Critical Section에서 작업중일 때는 다른 프로세스가 Critical Section에 들어갈 수 없도록 한다.
그리고 빠져나올 때 다시 lock을 해제하여 동시에 자원을 접근하는 것을 막는다. 단점으로는 Critical Section에 프로세스가 존재할 때, 다른 프로세스들이 계속해서 진입하려고 시도하기 때문에 CPU를 낭비하게 된다(Busy Waiting).
Semaphore
Semaphore는 카운터(Counter)를 이용하여 동시에 자원에 접근할 수 있는 프로세스를 제한한다. 주로 s라는 변수로 나타내며, 이는 사용 가능한 자원의 개수를 의미한다. 오직 두개의 atomic한 연산(wait, signal)을 통해서 접근할 수 있다.
출처: https://parkmuhyeun.github.io/etc/operating%20system/2022-07-29-Process-Synchronization/
'운영체제' 카테고리의 다른 글
"동기-비동기"와 "블로킹-넌블로킹"의 차이 (0) | 2025.01.31 |
---|---|
Context Switching이란 (0) | 2025.01.31 |
프로세스와 스레드의 차이 (0) | 2025.01.31 |