[CS] Thread란?

Hyunjun Kim·2025년 7월 21일
0

Computer_Science

목록 보기
18/19

스레드란 무엇인가

스레드는 프로세스 내에서 실행 흐름의 최소 단위이다. 하나의 프로세스는 여러 스레드를 가질 수 있으며, 이들은 메모리와 자원을 공유한다. 데이터 엔지니어링 관점에서 스레드는 대량의 데이터 처리나 병렬 작업을 효율적으로 수행하는 데 중요한 역할을 한다. 예를 들어, 데이터 파이프라인에서 여러 데이터 스트림을 동시에 처리하거나, 대규모 데이터셋을 병렬로 변환할 때 스레드를 활용하면 성능을 크게 향상시킬 수 있다.

스레드 관리 방식: 사용자 수준 스레드와 커널 수준 스레드

스레드는 관리 방식에 따라 사용자 수준 스레드(ULT, User-Level Thread)와 커널 수준 스레드(KLT, Kernel-Level Thread)로 나뉜다. 각각의 특성은 다음과 같다.

  • 사용자 수준 스레드 (ULT)
    사용자 수준 스레드는 사용자 공간의 라이브러리(예: POSIX Pthreads)에서 관리된다. 운영체제 커널의 관여 없이 스레드 전환이 이루어지므로 속도가 빠르다. 데이터 엔지니어링에서는, 예를 들어, Apache Spark의 워커 노드에서 로컬 데이터 처리 작업을 최적화할 때 사용자 수준 스레드를 활용하면 문맥 전환 비용을 줄일 수 있다. 그러나 하나의 스레드가 시스템 호출로 블로킹되면 전체 프로세스가 멈출 수 있으며, 멀티코어 CPU를 효율적으로 활용하지 못하는 단점이 있다.

  • 커널 수준 스레드 (KLT)
    커널 수준 스레드는 운영체제 커널에서 직접 관리된다. 스레드 전환 시 커널 모드로 전환해야 하므로 사용자 수준 스레드에 비해 오버헤드가 크다. 하지만 커널이 스레드를 개별적으로 관리하므로 멀티코어 환경에서 병렬 처리가 가능하다. 데이터 엔지니어링에서는 대규모 분산 시스템, 예를 들어 Hadoop 클러스터에서 여러 노드 간 작업 분배를 최적화할 때 커널 수준 스레드가 유리하다.

비교 표

구분사용자 수준 스레드 (ULT)커널 수준 스레드 (KLT)
관리 주체사용자 공간의 라이브러리운영체제 커널
문맥 전환사용자 모드에서 수행커널 모드로 전환 필요
속도빠름 (경량)느림 (무거움)
커널 관여없음있음
예시Python의 threading 모듈 일부Linux Native Threads

문맥 전환(Context Switching)이란

문맥 전환은 스레드 A에서 스레드 B로 전환할 때 현재 상태를 저장하고 새로운 상태를 불러오는 과정이다. 데이터 엔지니어링에서 문맥 전환은 데이터 처리 작업의 성능에 직접적인 영향을 미친다. 예를 들어, ETL(Extract, Transform, Load) 파이프라인에서 여러 스레드가 동시에 데이터를 변환한다면, 문맥 전환 비용이 낮을수록 처리 속도가 빨라진다.

  • 사용자 수준 스레드의 문맥 전환: 커널 모드로의 전환이 필요 없으므로 빠르다. 이는 데이터 엔지니어가 로컬 환경에서 소규모 데이터셋을 빠르게 처리할 때 유리하다. 예를 들어, Pandas 데이터프레임을 여러 스레드로 병렬 처리할 때 사용자 수준 스레드를 사용하면 오버헤드가 줄어든다.
  • 커널 수준 스레드의 문맥 전환: 커널 모드로 전환하고 스케줄링을 거쳐 다시 사용자 모드로 돌아오므로 오버헤드가 크다. 하지만 대규모 데이터 웨어하우스에서 복잡한 쿼리를 병렬로 실행할 때, 커널 수준 스레드는 멀티코어 CPU를 효율적으로 활용한다.

사용자 수준 스레드의 장점과 단점

장점

사용자 수준 스레드는 커널 개입 없이 스레드 전환이 가능하다. 이는 문맥 전환 비용을 줄이고, CPU 오버헤드를 낮춘다. 데이터 엔지니어링에서는 소규모 데이터 처리 작업이나 로컬 테스트 환경에서 유용하다. 예를 들어, Python 스크립트로 CSV 파일을 병렬로 파싱할 때 사용자 수준 스레드를 사용하면 빠른 처리 속도를 얻을 수 있다.

단점

  • 블로킹 문제: 하나의 스레드가 시스템 호출(예: I/O 작업)로 블로킹되면 전체 프로세스가 멈춘다. 이는 데이터 파이프라인에서 파일 입출력이 빈번한 경우 문제가 될 수 있다.
  • 멀티코어 활용 제한: 커널이 스레드를 인식하지 못하므로 멀티코어 CPU를 효율적으로 활용하지 못한다. 대규모 데이터셋을 처리하는 분산 시스템에서는 한계가 있다.

활용 예시

스레드 관리 방식은 작업의 성격에 따라 선택된다.

데이터 엔지니어링에서 예를 들어보자면:

  • 소규모 데이터 처리: 로컬에서 소규모 데이터셋을 처리할 때는 사용자 수준 스레드가 적합하다. Python의 threading 모듈을 사용해 CSV 파일을 병렬로 읽고 변환하는 작업은 빠른 문맥 전환으로 효율적이다.
  • 대규모 분산 처리: Apache Spark나 Hadoop 같은 분산 시스템에서는 커널 수준 스레드가 유리하다. 여러 노드에서 데이터를 병렬로 처리하고, 멀티코어 CPU를 활용해 복잡한 연산을 수행할 수 있다.
  • 하이브리드 모델: 실무에서는 사용자 수준 스레드와 커널 수준 스레드를 결합한 하이브리드 모델(M:N 모델)을 사용하기도 한다. 예를 들어, Spark의 실행 엔진은 사용자 수준 스레드로 로컬 작업을 최적화하고, 커널 수준 스레드로 클러스터 간 작업을 분배한다.

결론

스레드는 병렬 처리를 가능하게 하는 핵심 개념이다. 사용자 수준 스레드는 커널 개입 없이 빠른 문맥 전환으로 오버헤드를 줄이고, 소규모 작업에서 효율적이다. 반면, 커널 수준 스레드는 멀티코어 활용과 복잡한 스케줄링에 적합하다. 데이터 엔지니어는 작업의 규모와 요구사항에 따라 적절한 스레드 관리 방식을 선택해야 한다. 예를 들어, 로컬 데이터 전처리에는 사용자 수준 스레드를, 대규모 데이터 웨어하우스 쿼리에는 커널 수준 스레드를 사용하는 것이 효과적이다.

profile
Data Analytics Engineer 가 되

0개의 댓글