운영체제

[OS/운영체제] 스레드 (Thread) - (1)

4Legs 2020. 11. 6. 02:11

스레드 (Thread)

웹 서버가 페이지, 이미지, 사운드 등의 클라이언트 요청을 처리하는 상황을 생각해 보자. 사용량이 많은 웹 서버는 수천, 수만 명의 사용자들의 수많은 요청을 연속적으로 받게 될 것이다. 하지만 만약 웹 서버가 한 번에 단 하나의 요청만 처리할 수 있다면, 사용자들은 간단한 요청 하나에도 많은 시간을 기다리며 불편을 토로할 것이다.

이러한 상황을 해결하는 방법으로는 각 요청마다 요청을 처리하는 프로세스를 두는 것을 들 수 있다. 서버가 요청을 받으면, 서버는 요청을 처리하는 프로세스를 생성하여 받은 요청에 대한 적절한 서비스를 제공한다.

하지만 수천, 수만 개의 요청에 대해 각각 프로세스를 생성하는 데에는 시간 자원의 낭비가 심해질 것이다.

 

그렇다면 프로세스 하나가 마치 여러 개의 프로세스처럼 동작한다면 어떨까?

우리는 이러한 동기를 통해 스레드라는 개념을 이해할 수 있다.

 

멀티스레드로 구현된 웹 서버가 사용자의 요청을 처리하는 과정

스레드(Thread)는 실행(Execution)의 가장 작은 단위로, 한 프로세스는 다수의 스레드들을 포함한다.

위의 웹 서버 예시를 멀티스레드(Multithreaded) 프로세스로 구현한다면, 프로세스의 추가적인 생성 없이 사용자들의 수많은 요청을 처리할 수 있을 것이다.

 

왜 스레드를 사용할까?

스레드를 사용하는 데에는 다음과 같은 이점이 있다.

1. 응답성(Responsiveness)

멀티스레드 환경으로 동작하는 프로그램은 프로그램이 block되거나, 긴 작업을 수행하는 동안에도 계속 돌아갈(running) 수 있다. 이로써 사용자에게 향상된 응답성을 제공할 수 있다.

웹 브라우저에서 웹 페이지의 이미지가 로딩되는 도중에도 웹 페이지의 기능을 사용할 수 있는 것을 예로 들 수 있다.

2. 자원의 공유(Resource Sharing)

프로세스들은 IPC 기술(Shared Memory/Message Passing)을 이용해야만 서로의 메모리를 공유할 수 있다. 이러한 기술들은 순전히 프로그래머들의 몫이다.

하지만 스레드들은 자신들이 포함된 프로세스의 자원을 기본적으로 공유할 수 있다. 코드와 데이터를 공유할 수 있다는 것은 한 프로그램이 서로 다른 활동의 스레드들을 동일한 주소 공간에 담을 수 있다는 것을 의미한다.

3. 경제성(Economy)

프로세스의 생성을 통해 메모리 및 자원을 할당하는 것은 비용이 든다.

하지만 스레드는 자신이 속한 프로세스의 자원을 공유하므로, context-switch 스레드를 생성하는 것은 훨씬 경제적이다.

4. 확장성(Scalability)

멀티스레딩의 이점은 멀티프로세서 구조에서 훨씬 확연히 나타난다.

멀티프로세서 구조에서는 스레드들이 각자 다른 프로세서 위에서 병렬적으로 실행되기 때문이다. 즉, 다중 CPU 환경에서 병렬성이 크게 증대된다.

 

멀티스레딩 모델 (Multithreading Models)

지금까진 스레드에 대한 일반적인 개념을 설명했지만, 스레드를 실제로 사용하기 위해서는 커널 수준 또는 사용자 수준에서 스레드를 사용할 수 있도록 지원이 필요하다.

커널 수준에서 사용하는 스레드를 커널 스레드(Kernel Thread)라 한다. 커널 스레드는 운영체제에 의해 직접 관리되는 스레드이다.

사용자 수준에서 사용하는 스레드를 유저 스레드(User Thread)라 한다. 유저 스레드는 커널의 지원 없이 관리된다.

커널 스레드와 유저 스레드는 흔히 다음과 같은 세 가지 형태의 관계를 갖는다.

 

1. 다대일 모델 (Many-to-One Model)

Many-to-One Model

다대일 모델은 다수의 유저 스레드가 하나의 커널 스레드에 매핑된 모습이다.

스레드의 관리는 사용자 공간의 스레드 라이브러리에 의해 이루어지며, 따라서 효율적이다. 하지만 하나의 스레드가 blocking 시스템 콜을 사용한다면, 전체 프로세스가 block된다는 단점이 있다. 또한, 한 번에 하나의 스레드만 커널에 접근 가능하기 때문에 멀티프로세서 환경에서 병렬 실행이 불가능하다.

2. 일대일 모델 (One-to-One Model)

One-to-One Model

일대일 모델은 각 유저 스레드마다 커널 스레드 하나가 매핑된 모습이다.

이는 다대일 모델에 비해 높은 동시성을 제공하지만, 생성되는 유저 스레드마다 커널 스레드를 생성해야 한다는 결점이 있다.  커널 스레드의 많은 생성은 프로그램 실행의 오버헤드가 될 수 있기 때문이다.

따라서 이 모델을 구현하는 경우, 생성하는 스레드의 수를 제한해야 한다.

3. 다대다 모델 (Many-to-Many Model)

Many-to-Many Model

다대다 모델에서 유저 스레드는 유저 스레드 수 이하의 커널 스레드에 매핑된다.

개발자는 원하는 만큼 커널 스레드를 생성할 수 있지만, 너무 많은 스레드를 생성하지 않도록 주의해야 한다.

가장 많이 사용되는 모델이다.

 

 

 

※ 본 게시글은 『Operating System Concepts』 를 참고하여 작성되었습니다.