A Thread is a basic unit of CPU utilization
lightweight process라고 부른다. 프로세스를 여러개 두는 것 보다 스레드를 여러개 두는 것이 더 light하다.
프로세스 내부에 CPU 수행단위가 여러개 있는 경우이다.
프로세스가 하나 주어지면 code, data, stack(thread1의 stack, thread2의 stack ...) 같은 일을 하는게 여러개라면 프로세스 하나에 Thread를 여러개 둬 PC를 명시해 실행한다.
cpu 수행 단위가 다르므로 stack은 따로 두지만 공유할 수 있는 건 최대한 공유한다. PCB도 최대한 공유하지만 CPU 수행과 관련된 부분 (PC, register, stack)만 별도로 가진다.
예) 웹 브라우저에 네이버 -> 네트워크를 통해 웹페이지를 읽어옴 (I/O 작업) -> 웹 페이지를 읽어오는 동안에는 I/O 이므로 느리다. 따라서 사용자 입장에선 답답하다 -> 여러 스레드로 만들어놓으면 하나의 스레드가 네이버의 이미지를 읽어오길 기다리고 다른 스레드가 텍스트라도 먼저 읽어와 보여줌
다중 스레드의 경우 CPU 관련 정보만 각각 가지고 있는다.
ex) multi-threaded Web
웹 브라우저를 띄워놓고 포털 사이트의 홈페이지 주소 입력 -> html 문서가 날아옴 -> display 하려고 봤더니 이미지가 필요 -> 이미지 요청 -> 받아서 넣고 웹 페이지 완성
html 문서를 받아온 다음에 이미지 요청 -> 오래 걸리는 요청이므로 보통은 block 시킬 것이다. 그렇다면 block됐으므로 사용자 입장에서는 답답할 것이다. 그래서 다중 스레드를 사용해 display하는 스레드는 계속 실행하고 네트워크에 이미지를 요청하는 스레드만 block하면 사용자 입장에서는 답답하지 않을 것이다.
이미지 파일을 읽어오는 동안 프로세스를 block 시키지 않고 html을 통해 text만 display를 보여준다. -> I/O 와 무관하게 실행하기 때문에 비동기식이라고 할 수 있다.
자원을 공유할 수 있다. 만약 똑같은 일을 하는 프로그램이 여러개 있는데 이들을 별도의 프로세스로 만들기 보다는 하나의 프로세스에서 CPU 수행단위만 여러개 두면 code, data, 프로세스의 자원을 공유해 효율적으로 사용할 수 있다.
프로세스를 하나 만드는 것은 오버헤드가 크지만 프로세스 하나에 스레드를 추가 하는 것은 오버헤드가 그렇게 크지 않다. 프로세스 끼리의 context switch는 오버헤드가 크지만 thread 끼리의 CPU switch는 대부분의 문맥을 그대로 사용할 수 있기 때문에 부담이 적다.
따라서 프로세스 보다 thread를 생성하고 CPU switching하는 것이 더 낫다. Solaris의 경우 overhead가 각각 30배, 5배가 더 든다.
MP : multi processor -> CPU가 여러개인 구조
각 스레드가 다른 CPU에서 병렬적으로 실행될 수 있다.
커널, 라이브러리의 지원을 받는 것을 각각 Kernel Threads, User Thread라 한다.
real time을 지원하는 스레드도 있다.
Operating System Concepts 10th
KOCW 강의 - [운영체제] 이화여자대학교 반효경 교수