안녕하세요~ 이번 시간에는 스레드 상태와 운용, 스레드 컨텍스트, 스레드 컨텍스트 스위칭에 대해 알아보는 시간을 가져보겠습니다! 그럼 시작하겠습니다~

1. 스레드의 기본 상태
- OS 마다 조금씩 상이
- 스레드 상태는 TCB에 저장됨
2. 스레드에 대한 연산/운용(operation)
- 스레드 생성
- 프로세스 생성시 main 스레드 자동 생성
- 한 스레드는 다른 작업 스레드 생성 가능
- 부모-자식 관계를 가지나 약한 관계를 지님
- 부모 스레드는 자식 스레드를 id로 제어 가능
- 스레드 종료
- 프로세스 종료시 그에 속한 모든 스레드 종료
- 임의의 스레드에서 exit() 호출시
- 부모 스레드가 종료되더라도 자식 스레드가 종료되지는 않음
- pthread_exit() 호출시 해당 스레드만 종료됨
- 한 스레드가 다른 스레드를 강제 종료하는 방법은 일반적으로 제공하지 않음
- 약속된 신호 전달하고, 신호를 수신한 스레드는 스스로 종료
- 공유 변수를 통한 확인으로 지연 종료
- 프로세스 종료시 그에 속한 모든 스레드 종료
- 스레드 조인(join)
- 한 스레드가 다른 스레드의 종료를 대기
- 보통은 부모가 자식이 작업을 끝마치기를 기다릴 때 사용
- 한 스레드가 다른 스레드의 종료를 대기
- 스레드 양보(yield)
- 실행 중인 스레드가 스스로 CPU를 다른 스레드에게 양보하기 위해 실행을 중단하는 행위
- 양보한 스레드는 ready 상태가 됨
3. 스레드 컨텍스트(thread context)
- 스레드가 실행 중인 상태 정보
- CPU 레지스터들 값
- TCB에 저장
4. 스레드 제어 블록(TCB, Thread Control Block)
- 스레드를 실행 단위로 다루기 위해 스레드에 관한 정보를 담은 구조체
- 스레드 엔터티(thread entity), 스케줄링 엔터티(scheduling entity)라고도 불림
- 커널 영역에 생성되고, 커널에 의해 관리됨
- 스레드가 생성될 때 생성
- 스레드가 소멸되면 제거
- TCB의 구성 요소
※ 스레드 테이블은 존재하지 않음. 각각의 스레드를 포함하고 있는 PCB에 의해서 유지 및 관리됨.
5. PCB와 TCB
6. 준비 리스트와 블록 리스트
7. 스레드 컨텍스트 스위칭
- 현재 실행 중인 스레드를 중단시키고, CPU를 다른 스레드에게 할당하는 과정
- 현재 CPU에 존재하는 스레드 컨텍스트를 TCB에 저장하고, 새로 실행될 스레드 컨텍스트를 CPU에 적재
- 스레드 스위칭이라고 함
- 커널이 CPU 자원을 한 스레드에서 다른 것으로 옮기는 작업
8. 컨텍스트 스위칭이 일어나는 경우
- 시스템 호출 처리 과정 중에
- 스레드가 자발적으로 다른 스레드에게 양보
- sleep(), yield(), wait() 등에 의해
- 블록되는 경우
- read(), write()등에 의해
- 스레드가 자발적으로 다른 스레드에게 양보
- 인터럽트 발생으로 ISR 실행 중에
- 스레드의 시간 할당량이 만료된 경우
- 타이머 인터럽트에 의해
- I/O 장치로부터 인터럽트가 발생한 경우
- 현재 스레드보다 우선순위가 더 높은 스레드의 I/O 작업이 완료된 경우
- 스레드의 시간 할당량이 만료된 경우
9. 컨텍스트 스위칭 과정
- CPU 레지스터 저장 및 복원
- 커널 정보 수정
- 커널 공간에 저장되는 TCB는 '매핑 테이블'을 통해서 물리 메모리의 특정 부분에 저장됨
- 스레드 컨텍스트 복원 또한 '매핑 테이블'을 통해 물리 메모리로부터 가져와서 CPU에 적재
10. 컨텍스트 스위칭 오버헤드
- 컨텍스트 스위칭은 기본적으로 CPU의 일
- CPU 시간 소모
- 전환 시간이 길거나 잦은 경우 처리율 저하
- 컨텍스트 스위칭 시간 최소화 필요
- 멀티 코어 CPU에서는 한 프로세스를 한 코어에 배치하거나 CPU에 스레드 별로 레지스터 셋을 두기도 함
11. 컨텍스트 스위칭 오버헤드 : 같은 프로세스로
- 같은 프로세스의 다른 스레드로 전환하는 경우
- 컨텍스트 저장/복원, TCB 리스트 조작, 캐시 플러시/채우기
12. 컨텍스트 스위칭 오버헤드 : 다른 프로세스로
- 다른 프로세스의 스레드로 전환하는 경우
- CPU 주소공간의 변경으로 추가적인 오버헤드 발생
지금까지 스레드 상태와 운용, 스레드 컨텍스트, 스레드 컨텍스트 스위칭에 대해 설명하였습니다.
아마도 많이 어려워 하실 것이라고 생각하는데요. 최대한 여러분이 이해하기 쉽게 설명하도록 노력하겠습니다~!
다음 시간에는 커널 레벨 스레드, 사용자 레벨 스레드, 멀티 스레드의 구현에 대해 알아보는 시간을 가질 예정입니다!
다들 고생 많으셨습니다~ 좋은 하루 되세여!!
