CS 복습을 위해 강의 영상을 정리한 내용을 공유합니다.
전체 정리는 Notion을 참고해주세요.
스레드
프로세스 vs 스레드
- 프로세스는 자원을 할당받고, 제어하며 원하는 작업을 처리한다.
- 즉, 프로세스는 자원과 제어 두가지 개념이 필요하다.
- 그 중에서 제어 역할만 하는 것을 스레드라고 볼 수 있다.
- 자원을 여러 가지로 제어할 수 있다. = 하나의 프로세스 안에 여러 스레드가 존재할 수 있다.
프로세스 구조
- 프로세스는 제어 정보(스택 포인터, 프로그램 카운터, 상태 등) + 지역 데이터 + 스택을 가지고 있다.
- 그리고 프로세스는 리소스를 위한 메모리 영역도 가지고 있다. 코드 + 전역 데이터 + 힙 등 리소스를 관리하는 영역이다.
- 스레드는 제어 부분을 처리하는 개념이므로, 아래와 같이 표현할 수 있다.
- 스레드 = 제어 정보(SP, PC, state) + 지역 데이터(변수) + 스택 메모리
- 하나의 프로세스에 여러개의 스레드가 존재할 수 있고,
- 하나의 메모리 공간을 공유한다.
스레드 구조
- 하나의 프로세스 내에 여러개의 스레드가 존재할 수 있다.
- 각 스레드는 각각의 고유 영역을 가지고 있다.
- 그리고 힙, 데이터, 코드와 같은 리소스 영역을 공유할 수 있다.
스레드 정리
- 스레드를 다른말로 Light Weight Process (가벼운 프로세스) 라고 한다.
- 스레드는 프로세서를 활용할 수 있는 기본 단위다. 다른 말로, 스레드가 여러개라면 동시에 여러개의 CPU를 사용할 수 있다.
- 구성 요소는 프로세스의 제어 요소와 비슷하다.
- 스레드 ID
- 레지스터 Set (PC, SP)
- Stack (각각의 작업 영역)
- 코드, 데이터, 리소스 등은 프로세스 내 다른 스레드와 공유한다.
- 한 프로세스 안에 하나의 스레드만 있다면? 단일 스레드 프로세스라고 하고, 전통적 프로세스라고도 한다.
스레드 특징
스레드의 장점
사용자 응답성
- 작업을 분할했기 때문에, 일부 스레드 처리가 지연되어도 다른 스레드가 작업을 처리하고 응답할 수 있다.
자원 공유
- 만약 하나의 리소스를 스레드를 사용하지 않고 여러개의 프로세스로 작업한다고 가정해보자.
- 두 프로세스는 자원을 번갈아 사용해야 하기 때문에, Context Switching이 발생할 수 있다.
- 이 과정은 오버헤드가 있는 연산이기 때문에, 성능이 하락할 수 있다.
- 하지만 프로세스 안에 두개의 스레드가 있다면? 하나의 프로세스가 자원을 할당받아서 사용하기 때문에 Context Switching이 발생하지 않는다.
- 즉, 여러 자원이 같은 리소스를 활용해야 하는 경우 스레드가 유리할 수 있다.
경제성
- 작업을 위해 새롭게 프로세스를 생성하거나, 기존 프로세스와 Context Switching 하는 것 보다 효율적이다.
멀티 프로세서 활용
- 스레드가 프로세서의 기본 작업 단위이므로, 병렬 처리를 통한 성능 향상이 가능하다.
스레드 종류(구현)
유저 스레드
- 사용자 영역의 스레드 라이브러리로 구현할 수 있는 스레드.
- 라이브러리를 통해 스레드 생성, 스케줄링이 가능하다.
- ex) POSIX threads, Win32 threads, Java threads API
- 이렇게 생성된 스레드는 커널이 알 수 없다.
- 커널이 생성하고 관리하는 스레드가 아니고, 커널은 프로세스 단위로 자원을 할당하기 때문이다.
- 유저 스레드의 단점은, 커널은 결국 프로세스 단위로 자원을 할당하므로, 프로세스 내부의 하나의 스레드에서 Block이 발생하면 프로세스 전체가 Block 상태가 될 수 있다.
- 사용자 영역의 프로세스 = 커널 영역의 스레드 1개 → 프로세스 내부에 스레드 라이브러리를 통해 여러개의 스레드를 만들고, 스레드 제어 블록을 통해 관리한다.
커널 스레드
- OS, 커널이 직접 관리하는 스레드.
- 커널 영역에서 스레드를 생성하고, 관리한다.
- 사용자 영역에서 스레드가 만들어지면, 그에 맞추어 커널 영역에서도 스레드를 생성하고 관리한다.
- 스레드를 관리하는 것도 커널 레벨에서 관리한다.(TCB in Kernel)
- 커널 스레드의 단점은 커널이 직접 관리하므로 Context Switching 등 오버헤드가 크다. 프로세스의 Context Switching보다는 아니지만, 스레드끼리 프로세서를 사용하기 위한 Context Switching 오버헤드가 발생할 수 있다.
- 커널 스레드의 장점은 유저 스레드와 반대로, 프로세스 내 스레드들이 병행 수행이 가능하다. 하나의 스레드가 Block되어도 전체 프로세스는 Block되지 않는다.
혼합형 스레드
- 유저 스레드는 1:n, 커널 스레드는 1:1 이므로 두개의 장점을 같이 사용하는 모델.
- n개의 사용자 스레드 : m개의 커널 스레드를 사용한다. (사용자 스레드 수 > 커널 스레드 수)
- 장점으로는 사용자 영역에서 원하는 만큼의 스레드를 사용하면서도, 커널 영역에서는 1개보다 많은 스레드를 사용하므로, 하나의 스레드가 Block 되더라도 다른 스레드로 병행 처리가 가능하다. (효율적 + 유연함)
단일 프로세스 멀티 스레드일 때 Context Switching이 일어나지 않는다기 보다는, Thread Context Switching랑 Process Context Switching이 있고 Process Context Switching 비용이 더 크다 정도로 보는게 좋을 듯.. (과거 20세기 서적들에서 단일 스레드 프로세스 기반으로 서술)
Process Context Switching 비용이 더 큰 이유는 TCB/PCB 간 크기 차이와 추가 처리도 있겠지만, 주로 캐시 미스가 많아져서 메모리 액세스가 잦아지기 되기 때문. (지역성)
https://cs.stackexchange.com/questions/1088/what-happens-to-the-cache-contents-on-a-context-switch