Q. CODE, DATA, STACK 확실히 구분 해봐, 스레드에서 각각의 영역은 어떻게 동작해 그럼? 참고
Q.스레드가 data 영역을 공유할 때 전역변수나 static변수나 값의 변경이 일어날 수 있는데 그럼 스레드 간 CPU 할당이 바뀌면서 각 스레드의 실행결과에 영향을 줄 수 있지 않아?
Q. 왜 스레드를 사용하는 게 더 효율적임?, 문맥교환이 안 일어나서? 문맥교환이 그렇게 오버헤드가 커? 왜?, 스레드 간 CPU 할당이 바뀌는 건 오버헤드가 없어 그럼?
"A thread (or lightweight process) is a basic unit of CPU utilization"
Thread의 구성
Thread가 동료 thread와 공유하는 부분(= task)
전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다
Thread의 효율성 예시: 웹브라우저에서 창을 띄울 때 HTML 코드를 가져왔는데, HTML 코드 안에 IMG URL이 있어서 또 서버로 요청하여 네트워크 응답을 기다리면, 그동안 화면에 아무것도 안 띄워져있을 경우 답답한데, 다른 Thread를 실행시켜서 화면을 띄우게 하면 빨리 처리가 가능하다.
Q.그럼 SPA가 멀티 스레드로 구성된건가..? 한 프로그램 내 여러 스레드가 있을 때 이 스레드는 작업별로 구분이 가능한건가? 아님 아주 작은 기능 단위로도 스레드가 구별가능한건가 뭐지..
커널 수준의 스레드: 운영체제가 스레드의 존재를 아는 경우 커널 수준의 스레드 운영이 가능함, 스레드를 프로세스처럼 간주하고 처리, 큐에 넣거나 CPU를 할당하는 등의 관리를 할 때 스레드 단위를 이용
사용자 수준의 스레드: 사용자 수준의 스레드는 운영체제는 하나의 프로세스를 실행시키는 것이지 안에 스레드가 나뉘어 있는 것을 모르나 사용자의 코드 상 구현으로 스레드가 운용될 때, 예를 들어 비동기식 입출력과 같이 하나의 스레드가 작업을 진행하다가 I/O를 요청하면 CPU를 넘기는 것이 아니라 다른 스레드를 실행하도록 구현
Q. 사용자 수준의 스레드를 운용할 때 그럼 커널이 갖고 있는 각 스레드의 PC나 register 정보는 어떻게 읽어와? 스레드 간 문맥교환할 때 이 정보가 필요하지 않아? 프로세스 내에 PC나 register 정보를 같이 가지고 있나?