컴퓨터 과학(CS)

멀티 쓰레딩 (Multi-threading)

마달랭 2024. 8. 28. 00:32

개요

하나의 프로세스 안에서 여러 개의 쓰레드를 동시에 실행시키는 기법

이를 통해 CPU의 자원을 보다 효율적으로 사용할 수 있으며, 특히 여러 작업을 병렬로 처리해야 하는 경우에 성능 향상을 기대할 수 있다.

멀티 쓰레딩은 주로 응용 프로그램에서 응답성을 높이거나 동시에 여러 작업을 수행해야 할 때 사용한다.

 

1. 쓰레드(Thread)란?

쓰레드는 프로세스 내에서 실행되는 가장 작은 단위이다.

하나의 프로세스는 여러 개의 쓰레드를 가질 수 있으며, 각 쓰레드는 독립적으로 실행될 수 있다.

동일한 프로세스 내의 쓰레드들은 메모리 공간을 공유하며, 이 공유된 메모리에는 힙 영역과 전역 변수 등이 포함된다.

 

2. 멀티 쓰레딩의 장점

 

  • 병렬 처리: 여러 작업을 동시에 실행할 수 있어 CPU 자원을 더 효율적으로 사용할 수 있다.
  • 응답성 향상: 사용자 인터페이스(UI)에서 시간이 오래 걸리는 작업을 백그라운드 쓰레드에서 처리함으로써 응용 프로그램의 응답성을 유지할 수 있다.
  • 자원 공유: 동일한 프로세스 내의 쓰레드들은 메모리 공간을 공유하므로, 데이터를 공유하는 것이 간단하고 빠르다.

3. 멀티 쓰레딩의 단점

  • 동기화 문제: 여러 쓰레드가 동일한 자원에 접근할 때, 동기화를 제대로 처리하지 않으면 *경합 상태, *데드락, *라이브락 등의 문제가 발생할 수 있다.
  • 디버깅 어려움: 여러 쓰레드가 동시에 실행되므로 프로그램의 상태를 추적하고 디버깅하는 것이 복잡할 수 있다.
  • 컨텍스트 스위칭 오버헤드: CPU가 여러 쓰레드를 번갈아 가며 실행할 때 *컨텍스트 스위칭이 발생하는데, 이는 오버헤드를 유발할 수 있다.

 

* 경합 상태 : 두 개 이상의 쓰레드가 동시에 동일한 자원에 접근하여, 그 자원의 상태가 예측할 수 없게 변하는 상황, 프로그램의 실행 순서가 의도하지 않은 결과를 초래할 수 있기 때문에 매우 위험하다.

이 문제를 해결하려면 동기화 메커니즘을 사용하여 동시에 하나의 쓰레드만 자원에 접근할 수 있도록 해야 한다.

 

* 데드락 : 두 개 이상의 쓰레드가 서로 자원을 점유한 채로 다른 쓰레드가 점유하고 있는 자원을 기다리면서 무한히 대기하는 상태, 자원을 요청하는 순서를 고정하거나, 타임아웃을 설정하여 일정 시간 내에 자원을 획득하지 못하면 다시 시도하도록 하는 방법으로 해결할 수 있다.

 

* 라이브락 : 두 개 이상의 쓰레드가 서로의 작업을 방해하면서, 실제로는 아무런 진전도 이루지 못하는 상태, 데드락과는 달리 쓰레드들이 실행되고 있는 것처럼 보이지만, 실질적으로 작업은 전혀 진전되지 않는다.

라이브락을 방지하기 위해선 난수를 사용하여 불필요한 반복을 피할 수 있다.

 

* 컨텍스트 스위칭 : 운영체제가 현재 실행 중인 프로세스 또는 쓰레드의 상태를 저장하고, 다른 프로세스 또는 쓰레드의 상태를 복원하여 실행하는 과정, 이는 멀티태스킹 환경에서 여러 프로세스 또는 쓰레드가 CPU를 공유해야 하기 때문에 발생

이 과정은 매우 짧은 시간에 일어나지만, 그럼에도 불구하고 시스템 자원을 소비한다.

 

* 오버 헤드 : 컨텍스트 스위칭은 필수적이지만, 이 과정에서 시스템 자원(특히 CPU 시간)이 사용되므로 오버헤드가 발생

 

  • CPU 레지스터 저장 및 복원: 현재 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하는 과정은 CPU의 레지스터를 읽고 쓰는 작업을 필요로 하며, 이는 시간과 자원을 소비한다.
  • 캐시 무효화: 프로세스가 전환되면, 이전 프로세스가 사용하던 데이터가 CPU 캐시에 남아 있을 수 있습니다. 새로운 프로세스는 그 데이터를 사용할 수 없으므로, 캐시가 무효화되며, 다시 데이터가 로드되어야 합니다. 이는 메모리 접근 시간의 증가로 이어진다.
  • 메모리 관리 오버헤드: 컨텍스트 스위칭 시 운영체제는 가상 메모리 페이지 테이블이나 다른 메모리 관리 구조를 갱신해야 할 수도 있어, 이 또한 성능에 부정적인 영향을 미칠 수 있다.

요약하면, 컨텍스트 스위칭은 CPU가 여러 프로세스나 쓰레드를 관리하는 데 필수적인 과정이지만, 오버헤드로 인해 시스템 성능이 저하될 수 있어 이를 최소화하기 위해 효율적인 스케줄링과 하드웨어 최적화가 중요하다.

 

 

4. 멀티 쓰레딩과 병렬 처리의 차이점

멀티 쓰레딩은 병렬 처리를 가능하게 하는 방법 중 하나지만, 멀티 쓰레딩이 항상 병렬 처리를 의미하지는 않는다.

멀티 쓰레딩은 논리적 동시성을 제공하지만, 실제 물리적 병렬성은 CPU 코어 수에 의해 제한된다.

반면, 병렬 처리는 여러 CPU 코어에서 작업을 동시에 수행하는 것을 의미한다.

멀티 쓰레딩은 주로 응답성을 높이고, *I/O 작업을 비동기적으로 처리하는 데 유용하며, 병렬 처리는 대량의 계산 작업을 동시에 처리할 때 유리하다.

 

* I/O 작업 : 컴퓨터 시스템에서 데이터를 입력하거나 출력하는 작업을 의미, 입력 장치에서 데이터를 받거나 출력 장치로 데이터를 보내는 과정이 모두 포함 예를 들어, 데이터베이스에서 데이터를 검색하거나, 사용자 입력을 처리하는 것, 파일 시스템과 상호작용하는 모든 작업이 I/O 작업에 해당

 

5. 멀티 쓰레딩의 구현 방법

멀티 쓰레딩을 구현하는 방법은 프로그래밍 언어와 환경에 따라 다양하지만, 기본적인 원칙과 개념은 대부분의 언어에서 유사하다.

Thread 클래스를 이용한 구현을 통해 프로그래머가 쉽게 쓰레드를 생성, 시작, 일시 중지, 종료할 수 있도록 한다.

 

  • 쓰레드 생성: Thread 클래스를 상속받아 해당 클래스 내에 쓰레드가 실행할 작업(코드 블록)을 정의
  • 쓰레드 시작: 쓰레드가 생성된 후, start() 메서드를 호출하여 쓰레드 실행, 이 시점에서 쓰레드는 독립적인 실행 흐름을 가지게 된다.

 

6. 멀티 쓰레딩과 동기화

멀티 쓰레딩 환경에서 가장 큰 도전 과제 중 하나는 동기화다. 여러 쓰레드가 동시에 동일한 자원(예: 변수, 데이터 구조)에 접근할 때, 일관성을 유지하기 위해 동기화 메커니즘이 필요하다.

 

  • 뮤텍스: 한 번에 하나의 쓰레드만이 특정 자원에 접근할 수 있도록 하는 동기화 객체, 뮤텍스는 *임계 구역으로 정의된 코드 블록을 보호하며, 한 쓰레드가 뮤텍스를 잠그면(락) 다른 쓰레드는 해당 뮤텍스가 해제될 때까지 기다린다.
  • 세마포어: 일반적으로 카운터로 구현되며, 특정 자원에 접근할 수 있는 쓰레드의 수를 제한 한다. 예를 들어, 세마포어의 카운트가 3이라면, 동시에 최대 3개의 쓰레드만 해당 자원에 접근할 수 있다.

 

동기화의 장단점

  • 장점: 멀티 쓰레딩 환경에서 데이터의 일관성을 보장하여 안정성을 높인다.
  • 단점: 불가피하게 성능 저하를 초래할 수 있다. 동기화 메커니즘은 쓰레드가 자원을 획득하고 해제하는 데 시간이 걸리며, 이는 프로그램의 응답성을 떨어뜨릴 수 있다.

* 임계 구역 : 멀티쓰레딩 환경에서 여러 쓰레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드의 특정 부분을 의미, 임계 구역 내의 코드 블록은 한 번에 하나의 쓰레드만 실행할 수 있어야 한다.

728x90

'컴퓨터 과학(CS)' 카테고리의 다른 글

네트워크 대역폭  (3) 2024.09.30
메모리 관리 페이징  (0) 2024.09.12
프로세스 (process)  (0) 2024.08.28
메모리  (0) 2024.08.16
운영체제(OS)  (0) 2024.08.16