운영체제(OS) - Thread & Synchronization
1. Thread란?
스레드(Thread)는 경량 프로세스(Light Weight Process)라고도 불리며, 프로세스 내에서 실행되는 작은 단위입니다.
- 하나의 프로세스 내에서 여러 스레드를 생성할 수 있으며, 각 스레드는 독립적으로 실행됩니다.
- 스레드들은 프로세스의 자원(메모리 등)을 공유하기 때문에, 서로의 데이터에 접근이 가능합니다.
- 멀티 스레드 프로그래밍은 시스템의 성능을 향상시키기 위해 많이 사용되며, 현대의 대부분의 프로그래밍 언어에서 필수적인 기술로 다루어집니다.

1.1 스레드와 프로세스의 차이
- 프로세스는 서로 독립적이며, 각자 고유의 메모리 영역을 가집니다. 프로세스 간 데이터 공유가 어려우므로 IPC(Inter-Process Communication)를 통해 데이터를 주고받아야 합니다.
- 스레드는 프로세스 내에서 실행되는 작업 단위로, 같은 프로세스 내에서 메모리와 자원을 공유합니다. 따라서 스레드 간 통신이 용이하며, 별도의 IPC 없이 데이터에 접근할 수 있습니다.

| 구분 | 프로세스(Process) | 스레드(Thread) |
|---|
| 독립성 | 프로세스 간 독립적 | 프로세스 내에서 실행, 자원 공유 |
| 자원 | 각 프로세스가 별도의 자원 할당 | 자원을 공유하여 효율적 사용 |
| 통신 | IPC 기법 필요 | IPC 필요 없이 직접 데이터 접근 가능 |
| 오류 | 프로세스가 중단되어도 다른 프로세스에 영향 없음 | 하나의 스레드 오류가 전체에 영향 미침 |
1.2 멀티 스레딩(Multi-Threading)
멀티 스레드 프로그래밍은 하나의 프로그램 내에서 여러 스레드를 생성하여 병행 작업을 수행하는 방식입니다.
- 멀티 스레딩의 장점:
- 응답성 향상: 하나의 스레드가 대기 상태에 있을 때, 다른 스레드가 작업을 계속 수행하여 프로그램의 응답성을 유지할 수 있습니다.
- 자원 효율성: 스레드는 메모리와 자원을 공유하므로, 프로세스에 비해 자원 소모가 적고 오버헤드가 낮습니다.
- 병렬 처리: 멀티 코어 CPU를 활용하여 여러 스레드가 동시에 실행될 수 있습니다.
- 멀티 스레딩의 단점:
- 동기화 문제: 여러 스레드가 공유 자원에 접근하면서 데이터 일관성 문제가 발생할 수 있습니다.
- 디버깅 어려움: 스레드 간 상호작용이 복잡해져 디버깅과 문제 해결이 어려워질 수 있습니다.
- 하나의 스레드 오류 영향: 하나의 스레드가 오류로 종료되면, 전체 프로세스에 영향을 미칠 수 있습니다.
2. 스레드 동기화(Synchronization)
동기화(Synchronization)는 여러 스레드가 공유 자원에 접근할 때 발생할 수 있는 충돌을 방지하고, 작업의 실행 순서를 제어하는 기법입니다.
- 여러 스레드가 동일한 데이터에 접근하거나 수정할 때 데이터 불일치나 경쟁 조건(Race Condition)이 발생할 수 있습니다.
- 이러한 문제를 해결하기 위해 동기화 기법이 필요하며, 특히 임계 구역(Critical Section)을 설정하여 한 번에 하나의 스레드만 접근할 수 있도록 제어합니다.

동기화 문제 해결 방안: 상호 배제(Mutual Exclusion)
- 상호 배제는 여러 스레드가 동시에 공유 자원에 접근하지 못하도록 하는 기법입니다.
- 동기화 기법으로는 뮤텍스(Mutex)와 세마포어(Semaphore)가 주로 사용됩니다.
뮤텍스(Mutex)
- Mutex는
하나의 스레드만 임계 구역에 들어갈 수 있도록 잠금을 설정하여, 동시 접근을 방지합니다.
- 일반적으로 Binary Semaphore라고도 불리며, 임계 구역에서 하나의 스레드만 작업할 수 있습니다.
- 즉, 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막는 방식입니다.
세마포어(Semaphore)
- Semaphore는 여러 스레드가 특정 자원에 접근할 수 있는 최대 허용 수를 설정하여 제어합니다.
- 예를 들어, 자원 접근을
동시에 두 개의 스레드에 허용하려면 세마포어 값이 2로 설정됩니다.
- 다만, 간혹 동기화 문제가 발생할 수는 있습니다.
3. 교착 상태(Deadlock)와 기아 상태(Starvation)
3.1 교착 상태(Deadlock)
- 교착 상태는 두 개 이상의 작업이 서로 상대방의 작업이 끝나기를 기다리며 무한 대기에 빠지는 상태입니다.
- 교착 상태가 발생하면, 시스템은 더 이상 진행되지 않으며 자원 할당이 불가능해집니다.

3.2 기아 상태(Starvation)
- 기아 상태는 특정 프로세스가 자원 할당 우선순위가 낮아 계속 자원을 할당받지 못하고 대기하는 상태입니다.
- 오래 대기한 프로세스의 우선순위를 점진적으로 높이는 에이징(Aging) 기법을 통해 해결할 수 있습니다.
마무리
이번 포스팅에서는 스레드와 멀티스레딩, 동기화의 필요성, 그리고 교착 상태와 기아 상태에 대해 살펴보았습니다.
- 스레드는 현대 운영체제에서 자원을 효율적으로 사용하고 응답성을 향상시키기 위해 필수적인 요소이며, 동기화와 상호 배제 기법을 통해 안정성을 보장할 수 있습니다.
다음 포스팅에서는 가상 메모리와 페이징 시스템에 대해서 다루어 보도록 하겠습니다.