스레드(Thread)란?
스레드란 light weight process라고 불릴 정도로 프로세스와 유사한 개념이다. 이전 글에서 프로세스는 프로그램을 실행시켜서 메모리에 로드한 것이라고 설명한 바 있다. 운영체제로부터 메모리와 CPU 등의 자원을 할당받을 때에는 이렇게 프로세스를 기준으로 할당을 받는다.
스레드는 프로세스를 기준으로 할당받은 자원을 CPU가 실제로 이용하는 것의 기본 단위다. 즉, 프로세스 안에 스레드를 여러 개 두어서 프로세스 단위로 할당받은 자원을 이용해 CPU가 작업을 할 때 스레드 단위로 나누어 처리하도록 할 수 있는 것이다. 이런 이유로 스레드를 light weight process라고도 하는 것이며, 전통적인 개념의 heavyweight process는 단 하나의 스레드로 이루어진 task로 볼 수도 있다.
왜 굳이 프로세스와 스레드를 구분하는지는, 두 개념이 구체적으로 어떤 부분에서 어떤 차이가 있는지에 대해 알아봄으로써 설명하도록 하겠다.
스레드와 프로세스
프로세스의 구성
1. 프로세스 주소 공간
우선, 프로그램을 실행시켜 프로세스를 메모리에 로드하면 메모리에는 프로세스별 공간인 프로세스 주소 공간이 할당된다. 그 주소 공간은 code, data, stack 영역으로 이루어져 있는데 해당 개념에 대한 추가 설명은 다음 글을 참고하도록 하자.
2. 프로세스 문맥
이외에도 프로세스와 관련된 정보는 CPU의 수행 상태와 연관된 program counter와 register set 그리고 OS resource 정보(프로세스 ID와 프로세스 상태 등)가 있는데, 이를 통틀어서 프로세스 문맥이라고 한다. 프로세스 주소 공간도 프로세스 문맥에 해당한다. 프로세스 문맥에 대한 세부사항은 여기서 확인할 수 있다.
스레드의 구성
스레드를 구성하는 정보는 크게 둘로 나누어진다. 다른 동료 스레드와 같은 내용을 공유하는 부분과 스레드마다 다른 정보를 가지는 부분으로 말이다.
1. 다른 동료 스레드와 공유하는 부분
스레드는 하나의 프로세스 안에 함께 속한 다른 동료 스레드와 프로세스 주소 공간 중 code 영역, data 영역 그리고 프로세스 문맥 중 OS resource 정보를 공유한다. 메모리 공간을 공유하기 때문에 동료 스레드 간에는 자료를 공유하기가 쉽지만, 하나의 스레드에 문제가 생겨서 OS에 문제가 발생한다면 같은 프로세스에 속한 다른 동료 스레드들도 전부 영향을 받기 때문에 주의해야 한다.
2. 스레드별로 다른 정보를 가지는 부분
스레드는 저만의 CPU 실행 정보인 program counter와 register set을 가진다. 또한, 함수 호출은 스레드마다 개별적으로 이뤄지기 때문에 스레드는 개별적인 stack space를 가진다.
따라서 멀티스레드의 경우에는 프로세스 주소 공간과 PCB가 다음과 같은 형태를 띈다. 같은 프로세스여도 PC와 register 값은 다르게 구성되기 때문에 스레드 사이에서 제어권이 이동될 때에도 context switch가 필요할 것이라는 걸 짐작해볼 수 있다.
다중 스레드의 메모리 구조를 싱글 스레드와 비교하면 다음의 그림과 같다.
이로써 스레드는 프로세스와 관련된 정보들 중에 일부는 공유하고 일부는 독자적인 정보를 가진다는 것을 알게 되었다. 이런 차이로 인해 스레드가 프로세스와 어떤 부분에서 다르게 작동하는지 더 설명해보겠다.
스레드의 특징
우선 스레드는 프로세스와 동일한 상태 구조(Ready, Running, Blocked 등)를 가진다. 여러 스레드, 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked인 상태여도 동일한 태스크 내의 다른 스레드가 실행될 수 있어서 높은 반응성으로 작업을 더욱 빠르게 처리할 수 있다.
또한, 동일한 일을 수행하는 여러 동료 스레드가 협력을 하여 처리율을 높이고 성능을 향상시킬 수 있으며 여러 스레드를 다른 프로세서에서 동시에 병렬적으로 실행시킬 수 있기 때문에 멀티 프로세서의 사용률을 높일 수 있다. 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들기에 멀티 프로세스 보다 높은 효율로 자원을 관리할 수 있다.
code, data 영역은 동료 스레드끼리 공유할 수 있기 때문에 한 스레드에서 다른 스레드로 제어권이 넘어갈 때 이루어지는 더 빠르고 효율적인 context switch가 가능하다. 다만 자원을 공유하기 때문에 앞에서도 설명했듯이 스레드 하나의 문제에 전체 프로세스가 영향을 받게 되며, 자원 공유로 인한 동기화 문제도 발생할 수 있다.
프로세스는 다른 프로세스와 정보를 공유하는 것이 까다롭기 때문에 정보를 공유할 필요가 있으면서도 높은 반응성과 처리율이 필요한 경우, 자원을 아껴 효율적인 처리를 하는 것이 중요한 경우 멀티프로세싱보다 멀티스레딩을 이용하는 것이 좋다고 할 수 있다.
'CS > 운영체제(OS)' 카테고리의 다른 글
CPU 스케줄링 : CPU 스케줄러와 CPU 스케줄링 알고리즘들 (0) | 2022.04.23 |
---|---|
프로세스 관리 : 프로세스 생성과 종료, 부모 프로세스와 자식 프로세스 (0) | 2022.04.21 |
프로세스와 프로세스 문맥, 문맥 교환(Context Switch) (0) | 2022.04.19 |
프로세스 주소 공간 : Stack, Data, Code (0) | 2022.04.19 |
동기식 입출력과 비동기식 입출력 (0) | 2022.04.18 |