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