Thread
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행 (running)되어 빠른 처리를 할 수 있다.
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율 (throughput)과 성능 향상을 얻을 수 있다.
- 스레드를 사용하면 병렬성을 높일 수 있다.
- 만약 같은 일을 하는 프로세스를 여러개 띄워 놓으면 메모리 낭비가 심함.
- 왜냐면 각각의 프로세스가 가지고 있는 메모리 code, data, stack을 가지기 때문에
- 프로세스마다 하나의 PCB가 만들어져서 운영체제가 관리함.
- 프로세스 안에 스레드가 여러개 있게 되면 CPU 수행과 관련된 정보만 각각 스레드마다 별도의 copy를 가지고 있게 된다.
- 그것이 programcounter와 register이다.
- 프로세스마다 메모리 주소 공간이 있는데, code, data, stack이 있다.
- 각 프로세스마다 PCB 존재
- 이때 스레드는 프로세스 안에서 독자적으로 가져야되는 정보만 가지고 있다.
- 주소 공간에서 code와 data는 공유
Single and Multithreaded Processes
- 그림에서 보듯 code, data, 여러 자원들은 스레드들끼리 공유
- CPU 수행과 관련된 정보, register들과 stack은 스레드마다 별도로 소유
- 일단 위에 Binary라고 써있는것은 무시
스레드의 장점
Responsiveness (응답성)
- 사용자 입장에서 빠름.
- 왜냐면 웹브라우저가 쓰레드를 여러개 가지고 있으면, 웹 브라우저의 주소를 입력했을때, html과 그 문서안에 임베드된 이미지들이 있음.
- 보통 이미지를 불러오는 작업이 오래걸리는 작업이여서 그 프로세스를 block시킴.
- 그러면 사용자 입장에서는 block이 되어 있어서 답답함. display를 못해주기 때문.
- 여러개의 스레드를 사용해서 웹 브라우저를 구현하면, 먼저 html 문서를 갖고와서, 이미지 파일들을 서버에 요청함.
- 그러면 원래 block이 되어야 하는데, 멀티 스레드여서 네트워크 요청을 한 스레드만 block이 됨.
- 그러면 html 문서를 읽어온 스레드가 사용자 화면에 display 해주면, 사용자 입장에서는 덜 답답함.
동기식 입출력과 비동기식 입출력 차원에서의 설명
- 이미지 파일을 읽어오는 동안에(I/O를 실행하는 동안에) 프로세스를 block 시키는 것이 아닌, I/O가 끝나기 전에 CPU를 얻어서 화면에 html 먼저 display를 해줌.
- 그림을 읽어온 결과를 보고 인스트럭션을 실행하는 것이 아닌, 읽어온 결과와 무관하게 먼저 실행할 수 있는 것들을 화면에 보여줌.
- 이것이 비동기식 입출력.
Resource Sharing (자원 공유)
- 만약에 똑같은 일을 하는 프로그램이 여러개가 있는데, 그것들을 전부 개별 프로세스로 사용하는것 보다는, 하나의 프로세스를 만들고 CPU 수행 단위만 여러개를 두게 되면, code, data, 각종 자원들은 스레드들이 공유하게 된다.
- 그러면 자원을 좀 더 효율적으로 쓰는 효과를 얻을 수 있다.
Economy (경제성)
- 프로세스를 하나 만드는것은 overhead가 상당히 크다.
- 프로세스 안에 스레드를 하나 추가하는 것은 숟가락만 하나 얹으면 되는 것이기 때문에, overhead가 크지 않다.
- 프로세스 간의 Context Switch는 overhead가 상당히 크다.
- CPU 관련 정보를 저장하고, 캐시 메모리라던지, 등등 여러가지 일을 해야함.
- 프로세스 내에서 CPU switch가 일어나는 것은 간단하다.
- 동일한 주소 공간을 쓰고 있기 때문에, 대부분의 context는 사용할 수 있다.
- 그래서 프로세스를 하나 생성하고 CPU를 switch하는것이 스레드를 하나 생성하고 CPU를 생성하는 것보다 훨씬 overhead가 크다.
- 솔라리스의 경우 프로세스 하나 생성하는 것이 스레드를 생성하는 것보다 30배 overhead
- 솔라리스의 경우 프로세스 프로세스 context switch 하는 overhead가 스레드 context switch 하는 overhead 보다 5배나 더 듬.
- 그렇기 때문에 같은 일을 하는 작업 같은 경우는 프로세스를 여러개 만드는 것 보다, 프로세스 안에 여러개의 스레드를 두는 것이 훨씬 효율적이다.
위의 세 가지 응답성, 자원 공유, 경제성은 CPU를 하나 두었을 때 얻을 수 있는 장점
밑에 나머지 하나의 장점은 CPU를 여러개 두었을 때, 얻을 수 있는 장점
Utilization of MP(Multi Processr)(CPU가 여러개 있는) Architectures
- 서로 다른 CPU에서 각 스레드가 병렬적으로 일을 할 수 있음.
스레드를 구현할 수 있는 방법
- Some are supported by kernel -> kernel Threads
커널 스레드는 운영체제가 스레드가 여러개 있다는 것을 알고있음.
그래서 하나의 스레드가 다른 스레드로 CPU가 넘어가는 것도 커널이 CPU 스케줄링 하듯이 넘겨준다.
- Windows 95/98/NT
- Solaris
- Digital UNIX, Mach
- Others are supported by library -> User Threads
프로세스 안에 스레드가 여러 개 있다는 것을 운영체제는 모름.
유져 프로그램이 라이브러리의 지원을 받아서 스레드를 관리함.
- POSIX Pthreads
- Mach C-threads
- Solaris threads
- Some are real-time threads