
- 그래서 쓰레드를 쓰면 뭐가 좋은가.
- 하나의 프로세스 안에 쓰레드를 여러개 두면 쓰레드 하나가 blocked 상태일 때 다른 쓰레드가 CPU를 잡고 running을 할 수 있기 때문에 응답시간이 빠른 장점이 있다고 한다. → 아래 예시로 이해해보자.
- 웹 브라우저로 네이버를 본다고 할 때 네트워크를 통해 웹페이지를 읽어와야 할 것이다(I/O 작업).
- 웹 페이지를 읽어오는 과정은 오래걸리기 때문에 내 웹 브라우저는 blocked 상태가 될 것이다.
- 그렇게 되면 사용자는 답답할 것이다 → 웹 페이지를 다 읽어올 때까지 아무것도 못하기 때문에.
- 하지만 브라우저를 여러개의 쓰레드로 만들어 놓는다면 웹 페이지를 불러오는 동안에 프로세스를 block 시키지 않고 또다른 쓰레드로 이미 불러온 것이라도 화면에 보여주게 되면 사용자 경험을 개선할 수 있다.
- 동일한 일을 하는 프로세스를 여러개 띄워놓게 되면 각각이 메모리 공간을 차지해야하기 때문에 메모리 낭비가 심한데, 쓰레드로 협력하도록 하면 낭비를 줄이며 성능을 향상시킬 수 있다.
- CPU가 여러개 달린 컴퓨터의 경우인데, 쓰레드를 사용하면 병렬성을 높일 수 있다는 장점이 있다. → 행렬 곱셈이 하나의 예가 될 수 있다.

- 전 그림에서도 말했듯이 PCB는 하나만 생성된다.
- 그런데 프로세스 안에 쓰레드가 여러개 있게되면 CPU 수행과 관련된 정보만 쓰레드만 각각의 copy를 가지고 있게 된다 → PC, 레지스터 정보.

- 또 다른 표현 그림이고 자주 보던 그림인데 교수님은 별로 좋아하지 않는 그림이라고 한다.
- 결국 그냥 코드, 데이터, 파일은 공유하고 레지스터와 스택은 따로 쓴다는 그림

- 쓰레드를 사용하는 장점은 크게 네 가지로 요약할 수 있다.
- 응답성
→ 사용자 입장에서 빠르게 보임. 아까 말했듯이 웹 브라우저의 network I/O 작업이 있을 때, 하나의 쓰레드만 있다면 모두 불러올 때까지 멈춰있는 것처럼 보일 것인데, 웹 브라우저로 보여주는 쓰레드를 따로 두면 보다 빠르게 보여줄 수 있다.
→ 일종의 비동기식 입출력으로 볼 수 있다. I/O 작업을 던져놓고 내가 할 일 하는것.
- 자원 공유
→ 똑같은 일을 하는 프로그램이 여러개 있는데 그것을 별도의 프로세스로 만들기 보다는 하나의 프로세스를 만들고 그 안에 CPU 수행 단위만 여러개 두면 코드, 데이터, 각종 자원은 쓰레드끼리 공유하면서 자원을 효율적으로 사용할 수 있게 된다.
- 경제성
→ 프로세스를 하나 만드는 것은 overhead가 큰데, 프로세스 안에 쓰레드를 추가하는 것은 숟가락만 하나 얹으면 되는 것이기 때문에 어렵지 않다.
→ context switching은 오버헤드가 매우 큰데(CPU 관련 정보 저장, 캐시 메모리 flush 등..), 프로세스 내부에서 쓰레드 간 스위칭이 일어나는 것은 매우 간단하다 → 동일한 주소공간을 쓰고있기 때문에 대부분의 문맥은 그대로 사용할 수 있다.