Thread 란?
- Light Weight Process라고도 한다.
- 프로세스
- 프로세스 간에는 각 프로세스의 데이터 접근이 불가
- 스레드
- 하나의 프로세스에 여러개의 스레드 생성 가능
- 스레드들은 동시에 실행 가능
- 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능
- 프로그램(프로세스) 실행 단위이며 하나의 프로세스는 여러개의 스레드로 구성이 가능하다.
- 하나의 프로세스를 구성하는 스레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.
- 프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 가지며 실행 상태가 변할 때마다 Context Switching을 수행한다.
- 각 스레드별로 자신만의 스택과 레지스터를 가진다.
- 한 순간에 하나의 스레드만이 실행 가능하다.
프로세스와 스레드의 차이
프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
- 프로세스는 실행 중인 프로그램으로 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것을 말한다.
- 하지만 프로세스 생성은 많은 시간과 자원을 소비한다.
- 스레드는 프로세스의 실행 단위라고 할 수 있다.
- 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유할 수 있다.
- 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 가지고 있다.
스택을 스레드마다 독립적으로 할당하는 이유
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소 값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메로리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 가능하게 한다.
- 따라서 독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당한다.
PC Resister를 스레드마다 독립적으로 할당하는 이유
- PC값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다.
- 스레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분가지 수행했는지 기억할 필요가 있다.
- 따라서 PC 레지스터를 독립적으로 할당한다.
한 프로세스가 하나의 스레드를 이용하여 한 번에 한 작업만 수행하는 것은 싱글 스레드(Single thread), 한 프로세스가 여러 스레드로 동시에 여러 작업을 수행하는 것은 멀티 스레드(Multi thead)라고 한다. 프로세스 내의 스레드는 모두 각각 독립적인 실행 파일이며, 모든 스레드는 프로세스의 일부이다. 프로세스를 여러 개 수행해도 되지만 굳이 스레드를 사용하는 이유는 다음과 같다.
- 프로세스를 생성하거나 Context switching 하는 작업은 너무 무겁고 잦으면 성능 저하가 발생하는데, 스레드를 생성하거나 switching 하는 것은 그에 비해 가볍다.
- 두 프로세스가 하나의 데이터를 공유하려면 메시지 패싱이나 공유 메모리 또는 파이프를 사용해야 하는데, 이는 효율도 떨어지고 개발자 구현, 관리하기도 번거롭다.
Multithreading
프로세서가 여러 개인 경우 멀티 스레드를 통해 병렬성(Parallelism)을 높일 수 있다. 즉, 여러 작업이 동시에 실행될 수 있다.
프로세스의 스레드들이 각각 다른 프로세서에서 병렬적으로 수행될 수 있기 때문이다. 병렬성은 CPU 의 개수에 비례한다.
장점
- 응답성(Responsiveness)
싱글 스레드인 경우, 작업이 끝나기 전까지 사용자에게 응답하지 않는다. 반면 멀티스레드인 경우 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있다. - 자원 공유(Resource sharing)
프로세스는 오직 공유 메모리나 패싱을 이용하여 자원을 공유할 수 있지만, 스레드는 자신이 속한 프로세스 내의 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있다. - 경제성(Economy)
프로세스를 새로 생성하는 비용보다 스레드를 새로 생성하는게 훨씬 싸다. 그리고 Context switching의 오버헤드 또한 스레드가 더 경제적이다. 실제로 Solaris에서 프로세스 생성은 스레드 생성보다 30배 느리고, switching은 5배 느리다. - 확장성(Scalability)
싱글 스레드인 경우 한 프로세스는 오직 한 프로세서에서만 수행 가능하다. 반면 멀티 스레드인 경우 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 훨씬 효율적이다.
단점
- 스레드 중 한 스레드만 문제가 있어도 전체 프로세스가 영향을 받는다.
- 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능 저하
- 동기화 이슈로 비정상적으로 동작가능
- 동기화 코드를 적절히 추가해줘야 한다.
동기화 이슈 문제는 중요한 내용이니 다음에 다시 한번 설명하겠다.
- 동기화 코드를 적절히 추가해줘야 한다.
참고: https://goodgid.github.io/What-is-Thread/
'CS' 카테고리의 다른 글
[네트워크] OSI 7 Layer / 7계층 (0) | 2022.12.16 |
---|---|
[운영체제] 가상 메모리 (0) | 2022.12.03 |
[운영체제] 프로세스와 프로세서의 차이 (0) | 2022.11.28 |
[운영체제] 컴퓨터 운영 체제 종류와 특징 (0) | 2022.11.27 |
운영체제(OS) (0) | 2022.11.27 |