[OS] 스레드(Thread)

Minsoo, Kim·2022년 12월 15일
0

OS

목록 보기
1/1

개요

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 일반적으로 프로그램은 하나의 스레드를 가지지만, 프로그램에 따라서 둘 이상의 스레드를 동시에 실행할 수도 있습니다. 이러한 방식을 멀티스레드(Multithread) 라고 합니다.

웹서버의 멀티스레드 예시

  • Dispatcher 스레드가 네트워크를 통해 외부에서 전송된 리퀘스트(request)를 읽어옵니다.
  • 리퀘스트를 읽어온 후에, Worker 스레드를 깨워 리퀘스트를 처리하도록 합니다.
  • Worker 스레드가 깨어나면 리퀘스트가 웹 페이지 캐시로 처리가 가능한지 확인합니다. 만약 캐시로 처리할 수 없는 리퀘스트라면 디스크에서 필요한 데이터를 로드하게 되는데, 디스크 작업이 완료될 때까지 Worker 스레드는 block 됩니다.
  • Worker 스레드가 block 되면 다른 Worker 스레드를 실행합니다.

스레드의 종류

스레드는 사용자의 애플리케이션에서 관리하는 유저 레벨 스레드와 OS의 커널에서 관리하는 커널 레벨 스레드가 있습니다.

User-Level Threads (ULTs)

유저 레벨 스레드는 라이브러리(런타임 시스템)를 통해 스레드를 이용하는 것을 의미합니다. 일반적으로 #include 혹은 import 구문을 이용하여 라이브러리를 로드한 후 활용하는 방식입니다. 유저 레벨 스레드는 메모리의 사용자 영역(User space)에서 연산을 수행합니다.

장점
  • 커널의 개입없이 스레드 생성, 스레드 간 전환, 스레드 간 동기화가 수행됩니다. 즉, 스케쥴링과 동기화를 위해 커널을 호출(System Call)하지 않기 때문에 오버헤드가 적습니다.
  • 스케쥴링, 동기화를 위한 System Call이 호출되지 않으므로 유저모드와 커널모드 간의 전환이 발생하지 않습니다.
단점
  • 커널에 의해 관리되지 않기 때문에 시스템 전반에 걸친 스케쥴링 우선순위를 지원하지 않습니다.
  • 디스크 I/O 작업과 같이 System Call(커널 호출)이 필요한 작업이 발생하면 커널은 유저 레벨 스레드의 존재를 모르기 때문에 모든 다른 스레드가 중단됩니다.

Kernel-Level Threads (KLTs)

커널 레벨 스레드는 운영체제가 지원하는 스레드 기능으로 구현됩니다. 커널에 의해 스레드 생성과 스케쥴링이 관리됩니다. 커널 레벨 스레드는 메모리의 커널 영역(Kernel space)에서 연산을 수행합니다. 하나의 프로세스는 적어도 하나의 커널 스레드를 가집니다.

장점
  • 커널이 직접 스레드 관리에 관여하기 때문에 시스템 전반에 걸친 스케쥴링에 있어 유리합니다.
  • 동작중인 커널 스레드가 I/O 작업을 위해 System Call을 호출해도 다른 스레드에 영향을 주지 않습니다.
단점
  • 스케쥴링과 동기화를 위해 System Call을 호출하게 되는데 이 때의 처리 비용이 많이 소요됩니다.
  • System Call이 호출되면 메모리의 유저 모드에서 커널 모드로의 전환이 빈번히 발생되고 성능 저하가 발생됩니다.

0개의 댓글