thread 장점: 빠른 응답성/ 자원 절약 /
- 다중 스레드로 구성된 태스크 구조 ⇒ 하나의 서버 스레드가 blocked(waiting)이어도 다른 스레드를 running하면 되어서 빠르다.
- ex) 브라우저에 웹페이지 띄울 때?
- 네트웤을 통해서 웹페이지를 읽어와. ⇒ 이 역시 I/O 작업. 웹페이지 읽어오는 동안에는 오래 걸리니 웹브라우저는 블럭 상태. 아무것도 못하는 상태.
- 사용자는 답답하겠지. 읽어올 때까지 아무것도 못하니까.
- 다중 스레드로 만들면? 하나의 스레드가 네이버 웹서버에서 그림 이미지 불러오는 동안 프로세스를 블럭시키지 않고 이미 읽어온 텍스트 화면이라도 띄워준다면? 결과를 빨리 볼 수 있기 때문에 상대적으로 답답함이 덜하다! ⇒ 하나의 스레드가 다른 작업하는 동안, 또다른 스레드가 화면에 띄워주는 등 ⇒ 사용자에게 빠른 응답성!
- 동일한 일을 수행하는 다중 스레드가 협력해 높은 처리율 & 성능 향상!(자원 절약)
- 웹브라우저 여러 개 띄우거나 하면 각각을 서로 다른 프로세스로 만들면? 별도의 코드/데이터/스택을 가져야 하니 메모리 낭비가 심함.
- 하나의 프로세스 안에 스레드만 여러 개 두면? ⇒ 성능 향상, 자원 절약하는 효과!
- 스레드 사용하면 병렬성 높일 수 ! (CPU 여러개 달린 컴퓨터에 해당)
- 1000 X 1000 행렬 곱하기? ⇒ 독립적인 연산. CPU 하나 뿐이면 순차 연산인데 여러 개면 나눠서 계산하면 되니까.
- 하나의 프로세스마다 하나의 PCB가 만들어져서 관리
- 이 안에 스레드가 여러 개 있게 되면 CPU 수행과 관련 정보만 스레드마다 별도의 카피를 갖는데, 그게 아래 빨간 박스. PC, 레지스터 정보.
- CPU 수행과 관련된 정보만 따로 갖게 되는 것!
싱글/멀티 스레드 프로세스
스레드 장점? 4가지!
- 응답성(responsiveness)이 빨라.
- 웹브라우저(하나의 프로그램)가 스레드 여러 개 갖고 있으면?
- 하나의 스레드가 네트워크로부터 그림 파일이나 HTML 들고 오는 동안에
- 어떤 스레드는 HTML 안에 임베드된 이미지 파일을 웹서버한테 요청하고
- 위 작업은 오래 걸리는 작업이니 ⇒ 프로세스를 블록시킬 것. 그러면 사용자 입장에서는 답답함. 웹페이지를 읽어오는데 프로세스가 블록되면!
- 이렇게 하지 않고 프로세스를 여러 개 스레드로 만들면?
- 먼저 html 파일 갖고 와서 웹서버에 이미지 파일 요청. 만약 이게 프로세스면 이미지 파일을 요청하고서 받아올 때까지 해당 프로세스는 블록 처리된다.
- 근데 이걸 스레드로 열어두면 네트워크한테 요청하는 그 스레드만 블록(프로세스 블록하던게 프로세스 내 해당 스레드만 블록하는 방식으로 바뀜)
- 이때 다른 스레드가 이미 읽어온 html에서 이미지 부분 제외하고 텍스트 부분 먼저 화면에 출력. 이렇게 처리하면 사용자한테 답답함을 줄여.
- 동기식/비동기식 입출력 차원에서?
- 이미지 파일 읽어오는 동안에 프로세스를 블록시키는 게 아니라 I/O 끝나기 전에 이미 읽어온 텍스트 먼저 보여주는! 이게 일종의 비동기식 입출력. I/O 작업 결과를 보고 작업하는 게 아니라 앞 작업과 무관하게 진행되니까.
- 자원 공유(resource sharing)
- 만약 똑같은 일을 하는 프로그램을 별도 프로세스로 사용하는 것보다 하나의 프로세스를 두고 그안에 cpu 수행 단위만 여러 개 두면 코드/데이터/스택 등 각종 자원을 공유하면서 효율적으로 작업할 수!
- 경제성(economy)
- 좀 더 빠르다! but 응답성과는 다름.
- 프로세스를 만드는 건 오버헤드가 큰 반면, 프로세스에다 스레드를 추가하는 건 오버헤드가 크지 않음.
- context switch ⇒ 하나의 프로세스에서 다른 프로세스로 스위치하는 건 오버헤드가 커. cpu 정보 저장하고 캐시 메모리 처리 등 여러 복잡한 작업이 필요.
- But 하나의 프로세스 내에서 스레드 스위치는 간단. 대부분 문맥은 그대로 사용 가능.
- 프로세스 하나를 생성하고 cpu 스위치하는 것보다 스레드 하나 생성하고 cpu 스위치하는 게 훨씬 경제적.
- CPU 여러 개 있는 환경에서 스레드를 둘 때: 멀티프로세서 아키텍쳐인 경우?
- 프로세스는 하나지만 스레드가 여러개 있으면?
- 각 스레드가 각각 다른 CPU에서 병렬적으로 일할 수 있음. 결과를 더 빨리 얻는다.
스레드 구현 방법: 커널이 인지하면 커널 스레드 / 아니면 유저 레벨 스레드
- 커널 스레드: 어떤 애들은 커널 지원 받아
- 스레드가 여러 개 있단는 사실을 커널이 인지하고 있음.
- 커널이 cpu 스케쥴링하듯이 여러 스레드에 넘겨주는 방식.
- 유저 스레드: 라이브러리에 지원받아서 구현
- 프로세스 안에 스레드가 여러 개 있다는 사실을 커널이 몰라
- 유저 프로그램 스스로 스레드를 관리 by 라이브러리 지원을 받아서.
- 유저레벨 스레드: 커널이 모르고 있음. 커널이 보기에는 일반적인 프로세스로 봄.
- 유저 프로그램이 자기 내부에서 여러 스레드를 구현해서 여러가지 제약사항이 있음.