본문 바로가기
IT 및 프로그래밍

프로세스와 스레드 중 스레드의 구현에 대하여

by 데이터 석사 2024. 10. 22.

스레드는 운영체제에 따라 다양하게 재현할 수 있는데, 대다수 다음 세 가지 형태로 재현한다. 사용자 수준 스레드는 스레드 라이브러리를 사용하여 동작하는 형태이다. 커널 수준 스레드는 운영체제에서 지원하는 상황이다. 또 이 둘을 혼합한 형태가 혼합형 스레드이다.

프로세스와 스레드 중 스레드의 구현에 대하여

사용자 수준 스레드

사용자 수준 스레드에서는 스레드 교환에 커널이 끼어들지 않아 커널에서 사용자 영역으로 바꿀 필요가 없다. 또 커널은 스레드가 아닌 프로세스를 한 단위로 인지하고 프로세서를 할당한다. 곧, 다수의 사용자 수준 스레드가 커널 수준 스레드 한 개에 매핑되므로 다대일 스레드 매핑이라고 한다.

 

사용자 영역에서 스레드를 재현하면 커널에서 스레드를 보조할 필요가 없어 다음 장점이 있다.

 

- 이식성이 높다. 커널에 독립적으로 스케줄링으로 할 수 있어 모든 운영체제에 적용할 수 있다.

 

- 유연한 스케줄링이 가능하다. 커널이 아닌 스레드 라이브러리에서 스레드 스케줄링을 통제하므로 응용 프로그램에 맞게 스케줄링을 할 수 있다.

 

- 오버헤드가 적다. 스케줄링이나 동기화를 하려고 커널을 부르지 않으므로 커널 영역으로 바꾸는 오버헤드가 줄어든다.

 

반대로 사용자 수준 스레드를 활용하면 다음 단점이 있다.

 

- 시스템의 동시성을 지원하지 않는다. 스레드가 아닌 프로세스 단위로 프로세스를 나눠주어 다중 처리 환경을 갖춰도 스레드 단위로 다중 처리가 불가능하게 된다. 같은 프로세스의 스레드 한 개가 대기 상태가 되면 이 중 어떤 스레드도 수행하지 못한다.

 

- 스레드 간 보호가 불가능하다. 스레드 간 보호에 커널의 보호 방법을 활용할 수 없다. 스레드 라이브러리에서 스레드 간 보호를 제공해야 프로세스 수준에서 보호할 수 있다.

 

- 확장에 제약이 따른다. 커널이 한 프로세스에 속한 여러 스레드에 프로세스를 같은 순간에 나눠줄 수 없어 다중 처리 시스템에서 규모를 확장하기가 까다롭다.

 

사용자 수준 스레드는 사용자 영역의 스레드 라이브러리로 재현하고, 스레드와 관련된 모든 행위를 사용자 영역에서 하므로 커널이 스레드의 존재를 모른다. 여기서 스레드 라이브러리는 스레드의 생성과 종료, 스레드 간의 메시지 전파, 스레드의 스케줄링과 문맥 등 정보를 보관한다. 스레드 라이브러리로는 POSIX 표준안이 스레드 확장판인 Pthread, Win32 스레드, 자바 스레드 API 등을 주로 이용한다.

커널 수준 스레드

 

커널 수준 스레드는 커널이 직접 스케줄링하고 수행하기에 사용자 수준 스레드의 커널 지원이 부족한 문제를 해결할 수 있지만, 커널이 전체 프로세스와 스레드 정보를 유지하여 오버헤드가 커진다. 대신 커널이 각 스레드를 따로 관리할 수 있어 같은 프로세스의 스레드들을 병행으로 실행할 수 있다. 같은 프로세스에 있는 스레드 중 한 개가 대기 상태가 되더라도 다른 스레드를 수행할 수 있다는 장점이 있다. 그러나 이 과정에서도 커널 영역으로 바꾸는 오버헤드가 생겨나고 스케줄링과 동기화를 하려면 더 많은 자원이 필수이다. 윈도우 NT와 XP와 2000, 리눅스, 솔라리스 9 이상 버전의 운영체제가 커널 수준 스레드를 구현한다.

 

커널 수준 스레드는 사용자 수준 스레드의 임계점을 돌파하는 방법으로 커널이 스레드와 연관된 모든 작업을 관리한다. 한 프로세스에서 다수의 스레드가 프로세서를 할당받아 병행으로 실행하고, 스레드 한 개가 대기 상태가 되면 같은 프로세스에 속한 다른 스레드로 바꾸는 것이 가능하다. 이때도 커널이 끼어들기 때문에 사용자 영역에서 커널 영역으로 전환이 필수이다. 커널 수준 스레드에서는 사용자 수준 스레드와 커널 수준 스레드가 일대일로 매핑된다. 그래서 사용자 수준 스레드를 만들면 이에 반응하는 커널 스레드를 자동으로 만든다.

혼합형 스레드

프로세스 하나에는 경량 프로세스가 하나 이상 있고, 경량 프로세스에는 이에 반응하는 커널 스레드가 한 개 있다. 또 자원과 입출력 대기를 하려고 경량 프로세스 단위로 기다리므로 프로세스는 입출력을 완수할 때까지 기다릴 필요가 없다. 어떤 경량 프로세스가 입출력 완료를 기다리더라도 같은 프로세스에서 다른 경량 프로세스를 수행할 수 있기 때문이다.

 

이처럼 혼합형 스레드는 스레드 라이브러리가 최고의 성능을 보조하도록 커널이 경량 프로세스 수를 동적으로 조정하여 사용자 수준 스레드와 커널 수준 스레드가 다대다로 매핑된다. 그리고 커널 영역에서 병렬 처리 정도를 이 매핑이 선택할 수 있어 병행 실행이 무의미할 때는 다대일 매핑도 활용할 수 있다. 또 스레드 풀링을 사용하여 일대일 매핑으로 오버헤드를 줄일 수 있다. 솔라리스 9 이전 버전과 ThreadFiber 패키지가 있는 윈도우 NT와 2000 등 운영체제가 혼합형 스레드를 구현한다.

 

혼합형 스레드는 사용자 수준 스레드와 커널 수준 스레드를 혼합한 구조이다. 이는 시스템 호출을 할 때 다른 스레드를 중지하는 다대일 매핑의 사용자 수준 스레드와 스레드 수를 제한하는 일대일 매핑의 커널 수준 스레드 문제를 이겨내는 방법이다. 곧, 사용자 수준 스레드는 커널 수준 스레드와 비슷한 경량 프로세스에 다대다로 매핑되고, 경량 프로세스는 커널 수준 스레드와 일대일로 매핑된다. 결국 다수의 사용자 수준 스레드에 다수의 커널 스레드가 다대다로 매핑된다. 커널 수준 스레드는 디스패치하고 스케줄링하여 프로세서에서 수행한다. 반대로 경량 프로세스는 시스템 호출로 만들어 커널 영역의 프로세스 문맥 안에서 수행하고, 커널로 독립적으로 스케줄링하여 다중 처리에서는 병렬로 실행한다.

요약 및 결론

• 스레드는 운영체제에 따라 다양하게 구현할 수 있으며, 사용자 수준 스레드, 커널 수준 스레드, 혼합형 스레드가 있다. 

• 사용자 수준 스레드는 커널의 지원 없이 사용자 영역에서 스레드를 구현하는 방식으로 이식성과 유연한 스케줄링, 오버헤드 감소라는 장점이 있지만 시스템의 동시성을 지원하지 않고 스레드 간 보호가 불가능하며 확장에 제약이 따른다. 

• 커널 수준 스레드는 커널이 직접 스케줄링하고 실행하는 방식으로 사용자 수준 스레드의 문제점을 해결하지만 오버헤드가 커진다. 

• 혼합형 스레드는 사용자 수준 스레드와 커널 수준 스레드를 혼합한 구조로 다대다 매핑을 통해 병행 실행을 최적화한다.