•
참고 강의
contents
Thread(Lightweight Process)
: 프로세스 내부의 CPU 수행 단위가 여러개 있는 경우
: 프로세스 안에 CPU 수행 단위만 여러개를 두는 것
•
같은 일을 하는 프로세스마다 주소공간이 만들어져서 메모리가 낭비된다.
◦
같은 일을 하는 프로세스를 여러개 올리고 싶다면 주소 공간 하나만 만들어두고 각 프로세스마다 다른 부분의 코드를 실행할 수 있게 해주면 된다.
•
Thread의 구성(CPU 수행 부분)
Thread마다 별도로 실행되어야 하는 부분
◦
Program Counter
◦
Register set
◦
Stack Space
•
Thread가 공유하는 부분(= task)
◦
Code Section
◦
Data Section
◦
OS Resources
프로세스는 하나기 때문에 프로세스 상태, 프로세스 내부 자원들 Thread 간 공유
→ 별도로 가지는 건 CPU 수행과 관련된 정보(PC, Register, Stack)
Thread 여러 개, Task 한 개
프로세스가 하나기 때문에 PCB는 하나만 만들어진다.
code, data, files들은 공유하고, CPU Related한 정보들은 각각 가지고 있다.
Thread의 장점
•
응답성
◦
다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting)상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(Running)되어 빠른 처리를 할 수 있다.
ex. 하나의 스레드가 웹 페이지의 이미지를 불러오는 동안에 해당 스레드를 blocked시키지 않고 또 다른 스레드가 이미 읽어온 텍스트라도 display해줌. 답답함이 덜하다. 빠른 응답성 제공
•
자원 공유
◦
동일한 일을 하는 프로그램들을 별도의 프로세스로 만들기 보다는 하나의 프로세스로 만들고 그 안에 CPU 수행 단위만 여러개를 두게 된다면 각종 자원은 Thread들이 공유하기 때문에 자원을 효율적으로 사용할 수 있게 된다.
◦
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
▪
자원을 절약 → 같은 일하는 프로세스를 여러개 만들어두면 별도의 코드, 데이터, 스택을 가지고 가기 때문에 메모리 낭비가 심하다.
▪
하나의 프로세스안에 Thread만 여러개 두게 된다면 성능 향상, 자원 절약 효과가 생김
◦
프로세스 내 스레드 간 통신은 메모리와 파일을 공유하기 때문에 커널의 개입이 필요없음
•
경제성
◦
프로세스를 하나 만드는 건 오버헤드가 크지만 쓰레드를 하나 만드는건 오버 헤드가 크지 않다.
◦
문맥 교환은 오버헤드가 크지만 쓰레드간의 CPU Switching은 동일한 공간을 사용하고 있기 때문에 대부분의 문맥은 그대로 사용하고 있어서 오버 헤드가 크지 않다.
ex. Solaris 운영체제안에서는 각각의 Overhead가 30배, 5배나 된다.
•
Multiprocessor 아키텍쳐의 활용
◦
CPU가 여러개 있는 환경에서 Thread를 여러 개 뒀을 때 얻을 수 있는 장점
◦
각각의 Thread가 서로 다른 CPU에서 병렬적으로 일을 할 수 있다. → 결과를 더 빨리 얻을 수 있음
◦
스레드를 사용하면 병렬성을 높일 수 있다.
▪
독립적인 연산을 할 때, 서로 다른 CPU에서 실행하고서 합쳐주면 결과가 더 빨리 나오게 된다.
▪
병렬적으로 실행되기 때문에 결과가 빨리 나온다.
스레드의 상태와 동기화
Thread를 구현할 수 있는 방법
•
운영체제 Kernel의 지원을 받는 Thread : Kernel Threads(= Kernel level Thread)
Thread가 여러 개 있다는 사실을 운영체제가 알고 있음.
◦
하나의 Thread에서 다른 Thread로 CPU가 넘어가는 걸 Kernel이 CPU 스케줄링하듯 넘겨준다.
◦
다중처리 환경일 경우 한 프로세스 내의 다수 스레드는 각각 처리기를 할당받아 병렬 실행이 가능
◦
한 스레드의 대기 시 같은 프로세스에 속한 다른 스레드로 스위칭이 가능
◦
같은 프로세스에 속한 스레드 간의 스위칭에도 커널의 개입이 필요(모드 스위칭)
◦
커널 레벨 스레드를 사용하게 된다면 스레드가 대기 중인 시간대에 다른 스레드를 실행할 수 있어서 중복된 만큼 전체 일의 종료 시간이 앞당겨진다.
◦
Example
▪
Windows 95/98/NT
▪
Solaris
▪
Digital UNIX, Mach
•
library 형태로 구현 : User Threads(= User level Thread)
프로세스 안에 Thread가 여러개 있다는 사실을 운영체제가 모름.
◦
User 프로그램이 라이브러리의 지원을 받아서 스스로 Thread를 관리한다.
▪
스레드 라이브러리가 어디서부터 실행해야하는지 알려준다.
▪
스레드 간 스위칭은 라이브러리에 있는 스위칭 프로그램에 의해 결정되기 때문에 운영체제가 정한 스케줄링에 따를 필요가 없다. → 독자적인 스케줄링 사용 가능, 어떤 운영체제에서도 운영 가능
◦
특정 스레드의 실행에서 대기는 자신이 소속된 프로세스의 대기를 초래한다.
▪
실행 중이었던 스레드는 스레드 라이브러리에 의해 실행으로 계속 간주되고 있다가 나중에 CPU가 다시 프로세스로 할당되었을 때 계속 실행해 나갈 수 있도록 해준다.
ex. 스레드 실행 중, Time Interrupt가 날 경우 커널이 프로세스 Switching를 수행. 당시 실행 중이던 스레드 역시 실행 상태로 유지되다가 해당 프로세스가 CPU를 다시 받게 되면 다시 실행.
◦
커널이 볼 때는 일반적인 프로세스로 보이는데 내부에서 CPU 수행단위를 여러개 둬서 관리 → 구현상의 제약은 존재
◦
단점
▪
특정 스레드의 대기가 자신이 소속된 프로세스 내의 모든 스레드들의 대기를 초래
▪
CPU가 프로세스 단위로 할당되기 때문에 다중처리 환경이 주어진다해도 스레드 단위의 다중처리가 되지 못한다는 점 → 병렬적으로 실행 불가능
◦
Example
▪
POSIX Pthreads
▪
Mach C-threads
▪
Solaris threads
•
Real-time threads
Real-time 기능을 하는 Thread