스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 일반적으로 프로그램은 하나의 스레드를 가지지만, 프로그램에 따라서 둘 이상의 스레드를 동시에 실행할 수도 있습니다. 이러한 방식을 멀티스레드(Multithread) 라고 합니다.
웹서버의 멀티스레드 예시
- Dispatcher 스레드가 네트워크를 통해 외부에서 전송된 리퀘스트(request)를 읽어옵니다.
- 리퀘스트를 읽어온 후에, Worker 스레드를 깨워 리퀘스트를 처리하도록 합니다.
- Worker 스레드가 깨어나면 리퀘스트가 웹 페이지 캐시로 처리가 가능한지 확인합니다. 만약 캐시로 처리할 수 없는 리퀘스트라면 디스크에서 필요한 데이터를 로드하게 되는데, 디스크 작업이 완료될 때까지 Worker 스레드는 block 됩니다.
- Worker 스레드가 block 되면 다른 Worker 스레드를 실행합니다.
스레드는 사용자의 애플리케이션에서 관리하는 유저 레벨 스레드와 OS의 커널에서 관리하는 커널 레벨 스레드가 있습니다.
유저 레벨 스레드는 라이브러리(런타임 시스템)를 통해 스레드를 이용하는 것을 의미합니다. 일반적으로 #include 혹은 import 구문을 이용하여 라이브러리를 로드한 후 활용하는 방식입니다. 유저 레벨 스레드는 메모리의 사용자 영역(User space)에서 연산을 수행합니다.
커널 레벨 스레드는 운영체제가 지원하는 스레드 기능으로 구현됩니다. 커널에 의해 스레드 생성과 스케쥴링이 관리됩니다. 커널 레벨 스레드는 메모리의 커널 영역(Kernel space)에서 연산을 수행합니다. 하나의 프로세스는 적어도 하나의 커널 스레드를 가집니다.