3.3.6 Threads and Multithreading
메모리: 스레드와 멀티스레딩
3.3.6 스레드와 멀티스레딩
스레드
스레드는 프로세스의 실행 가능한 가장 작은 단위입니다. 프로세스는 여러 스레드를 가질 수 있으며, 각각의 스레드는 프로세스의 코드, 데이터, 힙 영역을 공유합니다. 그러나 각 스레드는 독립적인 스택을 가지고 있습니다.
스레드의 구조
코드 영역: 모든 스레드가 공유하는 실행 코드.
데이터 영역: 전역 변수와 정적 변수가 저장되는 영역.
힙 영역: 동적 메모리가 할당되는 영역으로, 모든 스레드가 공유합니다.
스택 영역: 각 스레드가 독립적으로 가지고 있는 영역으로, 함수 호출과 관련된 정보(매개변수, 반환 주소, 지역 변수 등)를 저장합니다.
프로세스와 멀티스레드 기반 프로세스의 메모리 구조
lua코드 복사+------------------------+ +------------------------+
| 프로세스 상태 | | 프로세스 상태 |
+------------------------+ +------------------------+
| 코드 영역 | | 코드 영역 |
+------------------------+ +------------------------+
| 데이터 영역 | | 데이터 영역 |
+------------------------+ +------------------------+
| 힙 영역 | | 힙 영역 |
+------------------------+ |------------------------|
| 스택 영역 | | 스레드1 상태 |
+------------------------+ | 스택 영역 |
|------------------------|
| 스레드2 상태 |
| 스택 영역 |
+------------------------+
| 스레드3 상태 |
| 스택 영역 |
+------------------------+
멀티스레딩
멀티스레딩은 프로세스 내에서 여러 작업을 여러 스레드로 처리하는 기법입니다. 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높아집니다. 예를 들어, 웹 서버의 경우 클라이언트의 요청을 처리할 때 매번 새로운 프로세스를 생성하는 대신 스레드를 생성하여 처리함으로써 자원을 효율적으로 사용할 수 있습니다.
멀티스레딩의 주요 장점은 다음과 같습니다:
효율성: 자원을 공유하므로 메모리 사용이 효율적입니다.
응답성: 여러 작업을 동시에 수행할 수 있어 응답 시간이 단축됩니다.
자원 공유: 코드, 데이터, 힙 영역을 공유하여 메모리 사용량을 줄입니다.
그러나 멀티스레딩에는 동기화 문제가 발생할 수 있습니다. 여러 스레드가 동일한 자원에 접근할 때 경합이 발생하면, 데이터 불일치가 발생할 수 있습니다. 이를 방지하기 위해 다음과 같은 동기화 기법을 사용합니다:
뮤텍스(Mutex): 한 번에 하나의 스레드만 자원에 접근할 수 있도록 하는 락(Lock)입니다.
세마포어(Semaphore): 동시에 접근할 수 있는 스레드의 수를 제한하는 기법입니다.
모니터(Monitor): 뮤텍스와 조건 변수를 포함하여 상호 배제와 조건 동기화를 제공하는 기법입니다.
동시성(Concurrency)
동시성은 여러 독립적인 작업을 작은 단위로 나누어 동시에 실행되는 것처럼 보이게 하는 것을 의미합니다. 멀티스레딩을 통해 동시성을 구현할 수 있으며, 이는 시스템의 효율성과 응답성을 높이는 데 중요한 역할을 합니다. 예를 들어, 웹 브라우저의 렌더러 프로세스는 멀티스레딩을 활용하여 여러 작업을 동시에 처리합니다.
웹 브라우저의 렌더러 프로세스에는 다음과 같은 스레드가 포함될 수 있습니다:
메인 스레드: 주요 로직을 처리합니다.
워커 스레드: 백그라운드 작업을 처리합니다.
컴포지터 스레드: 화면을 구성합니다.
래스터 스레드: 이미지를 처리합니다.
웹 브라우저의 렌더러 프로세스를 예로 들어 멀티스레드 구조
+---------------+ +-------------+
| 메인 스레드 | | 워커 스레드 |
+---------------+ +-------------+
| |
v v
+---------------+ +-------------+
| 컴포지터 스레드 | | 래스터 스레드 |
+---------------+ +-------------+
결론
스레드와 멀티스레딩은 프로그램의 성능과 효율성을 높이는 중요한 기법입니다. 스레드는 프로세스 내에서 실행되는 독립적인 단위로, 멀티스레딩을 통해 여러 작업을 동시에 처리할 수 있습니다. 이를 통해 시스템의 응답성과 처리 속도를 향상시킬 수 있으며, 적절한 동기화 기법을 통해 동시성 문제를 해결할 수 있습니다.
Last updated