스레드 vs. 프로세스?

스레드(경량 프로세스, lightweight process): 단일 실행 맥락(Context)
- 프로그램 카운터, 레지스터, 플래그, 스택으로 구성
- 다른 스레드들과 코드 영역, 데이터 영역, OS 자원(커널 컨텍스트)을 공유
- 스레드는 프로세서 레지스터 상에 있을 때, 실행중이라고 함
- 스레드 추가 시 레지스터, 스택만 추가하면 됨(코드, 데이터를 공유하기 때문에) ex)pthread_create
프로세스: 실행중인 프로그램(프로세스), 스레드 1개 이상으로 구성
- (스레드) + (코드, 데이터, 커널 컨텍스트)로도 볼 수 있음

- 제한된 권한(다른 프로세스의 메모리에 접근 X)을 가진 실행 환경
- 코드, 데이터, 레지스터, 스택 모두 필요 ex) fork
멀티스레드
- 멀티스레드: 프로세스가 사용하는 스레드 개수에 따라 싱글스레드, 멀티스레드로 구분하는데, 2개 이상의 스레드를 사용하는 것
- 멀티스레딩: CPU가 OS의 도움을 받아 여러 스레드를 동시에 처리하는 것
- 각 스레드는 자신만의 논리적 흐름(logical flow) 가짐, 스레드 간에는 코드, 데이터, 커널 컨텍스트 공유
- PID는 동일하나, 각 스레드마다 TID(Thread ID) 가짐
- 멀티스레드 작업에서, 한 스레드가 중단되면(blocked) 같은 작업 중인 다른 스레드가 동작 가능
- 처리량(throughput), 성능(performance) 향상
- ex) 멀티스레드 서버: 사용자의 요청이 있으면 스레드를 만들어 처리하게 함

병렬성(parallelism) vs. 동시성(concurrency)
병렬성(parallelism): 시스템이 하나 이상의 작업(task)를 동시에(simultaneously) 하는 것, 여러 코어에서 작업을 나눠서 수행
- Data parallelism: 같은 데이터를 여러 코어 간에 분산하여 처리
- Task parallelism: 각 스레드가 독립적인 작업(task) 수행

동시성(concurrency): 일정 시간 동안 여러 작업을을 처리하는 것. 하나의 코어에서 가능

스레드 분류
스레드는 유저 스레드와 커널 스레드로 구분

- 유저 스레드(User Thread): 유저 레벨의 스레드 라이브러리를 이용
ex) Pthreads
- 커널 스레드(Kernel Thread): 커널이 지원하는 스레드
ex) 대부분의 OS에서 지원
멀티스레딩 모델
유저 스레드와 커널 스레드가 어떻게 대응하는지에 따라 구분
- Many-to-One

- 유저 스레드 Many - 커널 스레드 One
- 커널 스레드 막히면(blocked) 모두 막힘
- 커널에 하나밖에 못 올라가므로, 여러 스레드가 병렬처리 안 될 수 있음
- One-to-One

- 유저 스레드 One - 커널 스레드 One
- 유저 스레드 하나 만들면 커널 스레드도 하나 생성
- Many-to-One보다 병렬성(parallelism) 더 좋음
-
Many-to-Many

- 유저 스레드 Many - 커널 스레드 Many
- OS가 충분한 수의 스레드를 생성
-
Two-level

- Many-to-Many와 비슷 but One-to-One처럼 스레드가 커널 스레드에 대응(bound)되는 것 허용
스레드의 생애(Life Cycle of Thread)

<스레드의 생애>

<프로세스 상태>
스레드 풀(Thread Pools)
- P: 스레드를 각 요청 때마다 생성하는 것은 비용이 많이 듦, 생성된 스레드는 요청 처리하고 종료됨
- 미리 일정 수의 스레드를 생성해두고, 사용자 요청(request) 있으면 풀에서 가져와서 사용
- 요청 처리한 후에는 exit하지 않고 풀로 돌려보내고 wait 시킴
- 최대 스레드 수는 제한 걸어둠

<nginx도 스레드풀을 사용함>
References
- 강순주 교수님 PPT4
- Operating System Concepts 10ed. Abraham Silberschatz
- https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)
- https://freecontent.manning.com/concurrency-vs-parallelism/
- https://www.nginx.com/blog/thread-pools-boost-performance-9x/
소중한 정보 감사드립니다!