복습)
- 프로세스: 실행 중인 프로그램!
- 프로세스의 문맥(context): 프로세스의 수행 정보
- PCB(Process Control Block): 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보를 담고 있는 데이터 구조
- 프로세스의 상태 : Running, ready, blocked, suspended ...
- 스케줄링 정보, 우선순위 등등 필요한 정보를 저장
프로세스
운영체제로부터 메모리 등 자원을 할당 받고
그 자원을 제어하여 작업을 수행하는데
여기서 자원을 제어하고 작업을 수행하는게 스레드!
예) 크롬 브라우저(=프로세스)에서 네이버 검색하기(=스레드1) & 스포티파이 음악 듣기(=스레드2)
Thread?
- 프로세스의 실행 단위, CPU의 수행단위
- lightweight process(경량 프로세스)
- 스레드는 각각의 제어 정보가 있고 각각의 작업을 수행하지만
- 프로세스의 주소 공간(메모리)을 일부 공유한다.
- 프로세스가 여러개면 address space는 하나만 만들고 여러개의 스레드를 만들어서 메모리 낭비를 줄일 수 있다.
- 스레드 개념이 없던 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
- Thread의 구성
각각의 스레드가 다른 스레드와 독립적을 실행되어야 하기 때문에 별도의 PC, register set, stack space를 사용한다.
- program counter(PC) - 현재 실행 중인 명령어의 주소
- register set
레지스터: cpu에 위치한 고속 메모리, 명령어/연산에 필요한 데이터 임시 저장- stack space
- Thread가 동료 thread와 공유하는 부분(=task)
- code section
- data section
- OS resource
:스레드끼리는 주소 공간의 data, code 영역을 공유 => 효율성
그러나 stack은 별도로 할당 받는다.
스택 - 스레드의 지역변수, 함수 호출 등에 필요한 데이터 저장.
각 스레드는 자신만의 스택을 가지고 있어야 독립적으로 실행.
PCB에서 PC와 register를 제외한 나머지 프로세스 정보를 공유

Thread의 장점/단점
- Responsiveness - 사용자 입장에서 빠른 응답!
다중 스레드의 경우 하나의 스레드가 block된 상태여도 다른 스레드가 실행될 수 있다. 예시) 화면에 그림 기다릴 때 글자라도 먼저!- Resouce Sharing
하나의 프로세스 안에 여러개의 스레드를 두면
코드, 데이터 자원 효율적으로 활용 가능!- Economy
새로운 프로세스 하나 만드는 것보다 기존 프로세스에 스레드를 추가하는 것이 더 overhead(추가적 비용)가 적다. 문맥 교환할 때도 마찬가지.- Utilization of Multi Processor Architecutre
만약 cpu가 여러개라면, 서로 다른 cpu 안에서 각각의 스레드가 작업해서 훨씬 효율적이다. 병렬적으로 일할 수 있음!
참고) 찾아본 스레드의 단점
자원의 공유로 인한 동기화 문제가 발생할 수 있다.
여러 스레드가 하나의 주소 공간과 자원을 공유하다보니
여러 스레드가 동시 수행하면, 디버깅 과정이 까다로울 수 있다.

참고)
자바스크립트는 기본적으로 싱글스레드로 동작.
단일 스레드로 코드를 실행하고 비동기 처리를 위해 콜백, promise, async/await 같은 매커니즘을 사용하는 것
- Kernel Thread
- 운영체제가 스레드가 여러 개인 것을 알고 있다.
- 스레드간의 CPU 교환을 ‘커널이’ CPU 스케줄링을 하듯이 관리
- 커널 스레딩은 멀티 스레딩을 지원 - 여러개가 동시 실행 가능
- 시스템 레벨의 작업 수행하고 운영체제 자체의 동작 제어하는데 사용
- User Thread
- 운영체제는 스레드가 여러 개인 것을 모르는 상태
- 사용자 프로그램이 라이브러리의 지원을 받아 스스로 여러 개의 스레드들을 관리
- 커널이 스레드의 존재를 모르기 때문에 구현에 제약이 있을 수 있다.
- 운영체제는 사용자 스레드를 하나의 프로세스로 인식하고 context switching을 통해 스레드를 실행한다.
- Real Time Thread?
- 실시간 스레드는 실시간 시스템에서 사용되는 스레드
- 시간 제약에 따라 특정한 시간 요구에 응답해야 함
- 정확한 작업 완료 시간이 중요한 응용 프로그램에 사용
- 높은 우선순위를 가지고 있으며, 운영체제는 이러한 스레드에 대한 스케줄링을 특별히 관리하여 실시간 요구에 최적화