[OS] 스레드(Thread)란?

Austin·2025년 4월 5일

OS

목록 보기
3/4

스레드(Thread)란?

스레드 정의

프로세스 내부에서 실행 흐름을 분할한 단위를 말한다.

같은 프로세스 내부에서 여러 스레드가 실행되므로, 코드, 데이터, 힙(Heap) 등은 공유하지만 스택(Stack)은 스레드마다 별도로 유지된다.
각 스레드는 정확히 하나의 프로세스에 속하며, 프로세스 외부에 스레드가 존재할 수 없다.
각 스레드는 별도의 제어 흐름을 나타낸다.
하나의 프로세스가 다수의 스레드를 가질 수 있으며, 이를 ‘멀티스레딩(Multi-threading)’이라고 한다.
아래 이미지는 단일 스레드 및 멀티스레드 프로세스의 작동을 보여준다.

스레드의 장점

  • 스레드는 컨텍스트 전환 시간을 최소화한다.
  • 스레드를 사용하면 프로세스 내에서 동시성을 제공할 수 있다.
  • 스레드를 생성하고 컨텍스트를 전환하는 것이 더 경제적이다.
  • 스레드를 사용하면 멀티프로세서 아키텍처를 더 큰 규모와 효율성으로 활용할 수 있다.

프로세스와 스레드의 차이점

프로세스스레드
프로세스가 무겁거나 리소스를 많이 소모한다.스레드는 가벼워서 프로세스보다 리소스를 덜 사용한다.
프로세스 전환에는 운영 체제와의 상호 작용이 필요하다.스레드 전환은 운영 체제와 상호 작용할 필요가 없다.
여러 처리 환경에서 각 프로세스는 동일한 코드를 실행하지만 각자의 메모리와 파일 리소스를 갖는다.모든 스레드는 동일한 열린 파일 집합과 자식 프로세스를 공유할 수 있다.
한 프로세스가 차단되면 첫 번째 프로세스의 차단이 해제될 때까지 다른 프로세스는 실행될 수 없다.한 스레드가 차단되어 대기하는 동안 동일한 작업에 있는 두 번째 스레드가 실행될 수 있다.
스레드를 사용하지 않는 멀티 프로세스는 더 많은 리소스를 사용한다.멀티 스레드 프로세스는 더 적은 리소스를 사용한다.
멀티 프로세스에서 각 프로세스는 다른 프로세스와 독립적으로 작동한다.한 스레드는 다른 스레드의 데이터를 읽고, 쓰고, 변경할 수 있다.

스레드의 종류

스레드는 다음 두 가지 방법으로 구현된다.

  • 사용자 수준 스레드 − 사용자가 관리하는 스레드
  • 커널 수준 스레드 − 운영 체제가 관리하는 스레드로, 운영 체제 코어인 커널에서 작동한다.

사용자 수준 스레드

정의

사용자 수준 스레드는 커널이 아닌, 사용자 공간(Application 영역)의 라이브러리나 런타임에서 직접 스레드를 생성·관리하는 방식이다.
사용자 수준 스레드는 스레드 관리 커널에서 스레드의 존재를 인식하지 못한다.

구조

  • 스케줄링과 컨텍스트 스위칭(문맥 전환)은 애플리케이션 라이브러리 안에서 이루어진다.
  • 스레드를 만들거나 전환할 때 시스템 콜을 사용하지 않아도 되므로, 매우 빠른 스레드 생성·삭제, 전환이 가능하다.

장점

  • 오버헤드가 적음: 커널 모드로 들어가는 비용(시스템 콜)이 줄어들어 스레드 관련 연산이 빠름.
  • 상황에 맞는 스케줄링: 애플리케이션 특성에 맞춰 스레드를 스케줄링할 수 있어, 커널 스케줄러와 달리 좀 더 세밀한 제어가 가능.

단점

  • 블로킹 문제: 한 스레드가 블로킹(예: I/O 대기)에 빠지면, 사용자 라이브러리 전체가 대기 상태가 될 수도 있음. 커널은 단일 스레드 프로세스로 인식하기 때문.
  • 다중 CPU 활용 한계: 사용자 수준 스레드는 커널이 한 개 스레드로만 보기 때문에, 여러 코어(CPU)에서 병렬 실행이 제한되는 경우가 있음(운영체제나 특정 라이브러리 구현에 따라 달라짐).

커널 수준 스레드

정의

커널 수준 스레드는 운영체제 커널이 직접 스레드를 생성하고 스케줄링(관리)하는 방식이다.
각 스레드는 커널의 스케줄러에서 개별적인 실행 단위로 인식된다. 따라서 운영체제는 여러 코어(멀티코어 CPU)를 사용할 때, 스레드를 병렬로 실행할 수 있다.

구조

  • 스레드를 생성·제어하는 과정에서 시스템 콜을 사용한다.
  • 커널은 각 스레드별로 ‘TCB(Thread Control Block)’에 해당하는 데이터를 관리한다.
  • 커널이 스레드를 인식하므로, 한 스레드가 I/O로 블로킹되더라도 다른 스레드는 계속 실행될 수 있다.

장점

  • 블로킹 I/O 시에도 다른 스레드 실행 가능 : 사용자 수준 스레드 방식에서 문제되는 “한 스레드의 블로킹이 전체 스레드를 멈추게 함”이 커널 수준 스레드에는 해당되지 않는다.
  • 병렬 처리(멀티코어 활용)가 가능 : 커널이 각 스레드를 별도로 인식하므로, 여러 CPU 코어가 있을 경우 여러 스레드를 동시에 배정할 수 있다.
  • 운영체제 자원과 직접 연동 : OS 차원에서 우선순위 스케줄링, 스레드 간 자원 분배 등을 세밀하게 관리할 수 있다.

단점

  • 높은 오버헤드 : 스레드 생성·종료, 문맥 전환(Context Switching)에 시스템 콜이 개입한다.
  • 복잡한 커널 구조 : 널이 스레드를 직접 관리해야 하므로, 운영체제 구현이 복잡해진다.
  • 스레드 간 자원 충돌 : 병렬처리 시점이 커널에 의해 제어되므로, 동기화(뮤텍스, 세마포어 등)를 잘못 사용하면 데드락이나 레이스 컨디션 문제 발생.

사용자 수준 스레드와 커널 수준 스레드의 차이점

사용자 수준 스레드커널 수준 스레드
사용자 수준 스레드는 만들고 관리하는 것이 더 빠르다.커널 수준 스레드는 생성하고 관리하는 데 시간이 더 걸린다.
구현은 사용자 수준의 스레드 라이브러리를 통해 이루어진다.운영체제는 커널 스레드 생성을 지원한다.
사용자 수준 스레드는 일반적이며 모든 운영 체제에서 실행될 수 있다.커널 수준 스레드는 운영 체제에 따라 다르다.
멀티스레드 애플리케이션은 멀티프로세싱의 이점을 활용할 수 없다.커널 루틴 자체도 멀티스레드가 될 수 있다.

참고자료
tutorialspoint

0개의 댓글