💋 인트로
안녕하세요. 우아한테크코스 5기 깃짱이라고 합니다.
💋 컨텍스트 스위칭
✔️ 개념
- CPU/코어에서 실행중이던 스레드가 다른 스레드로 교체되는 것
- 이 때 두 스레드는 같은 프로세스에 속할수도, 다른 프로세스에 속할 수도 있다.
- 여러 프로세스/스레드를
동시에
실행시키기 위해 필요하다.
✔️ 발생 원인
크게 3가지!
- Time Quato Expiry: 주어진 quantum(time slice)의 시간이 다됨. 쉽게 말해 Time Over!
- Interrupt: 커널 함수를 통해서 프로그램 실행 도중에 멈춰버림. (SIGKILL interrupt signal)
- Preemption: 더 우선순위가 높은 일을 해야 할 때 선점해버려서
✔️ 컨텍스트(context)란?
- 프로세스/스레드의 상태
- CPU, 메모리의 상태 등등
- 심화공부 키워드: CPU의 registers, counter
💋 컨텍스트 스위칭의 과정
컨텍스트 스위칭은 OS 커널이 실행한다. OS 커널은 리소스를 관리, 감독하는 역할을 한다.
설명을 위해, 컨텍스트 스위칭을 통해서 CPU에서 실행되던 스레드1 → 스레드2
로 교체된 상황이라고 하자.
먼저, 아래 내용은 기본적으로 일어나게 된다.
✔️ 컨텍스트 스위칭 기본 작업
- 커널 모드로 전환
- 프로세스에서 통제권이 넘어가 커널에서 실행
- 하드웨어와 밀접한 일, 혹은 컴퓨터의 리소스를 사용해야 하는 일 (컨텍스트 스위칭에 필요한 일)
- CPU의 register 상태 교체
- 각종 명령어를 실행하기 위해 필요한 데이터를 저장하는 register의 상태 교체
- 스레드1의 레지스터 상태를 저장해야 어디까지 실행되었는지 등 상태 정보를 기억해서 다시 컨텍스트 스위칭 때 활용할 수 있음.
이때 스레드1, 스레드2가 속하는 프로세스가 동일한지, 다른지에 따라서 스위칭 과정이 달라진다.
- 프로세스1의 스레드1 → 프로세스2의 스레드2 =
Process Context Switching
- 프로세스1의 스레드1 → 프로세스1의 스레드2 =
Thread Context Switching
✔️ Thread Context Switching
기본 작업만 하면 된다. ⇒ 빠르다
커널 모드 전환 + CPU register 상태 교체
✔️ Process Context Switching
가상 메모리 주소 관련 처리
를 추가로 수행해야 한다.
- MMU(Memory Management Unit)이 새로운 프로세스의 주소 체계를 바라보도록 수정
- 캐시 역할을 하는 TLB(Translation Lookaside Buffer)를 완전히 비워줘야 함.
커널 모드 전환 + CPU register 상태 교체 + 가상 메모리 주소 처리(MMU 수정 + TLB 캐시 비우기)
💋 캐시 오염 (Cache Pollution)
CPU 내부에 캐시를 위한 공간이 있는데, 컨텍스트 스위칭을 하면, 캐시의 데이터가 현재 실행중인 스레드의 데이터가 아닐 수 있다.
컨텍스트 스위칭 직후에는 캐시에 필요한 데이터가 없어서, 메모리에 접근해 데이터를 받아와야 하기 때문에 성능에 안좋은 영향을 줄 수 있다.
💋 애플리케이션 관점에서, 컨텍스트 스위칭은 그냥 오버헤드
오버헤드란 프로그램의 실행 흐름에서 나타나는 현상 중 하나로 예를 들어 , 프로그램의 실행 흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때, 추가적으로 시간, 메모리, 자원이 사용되는 현상입니다.
예를 들어, 실행에 10초가 걸리는 기능이 간접적인 원인으로 20초가 소요된다면, 오버헤드는 10초가 되는 것이다.
💋 결론
Process Context Switching 과정 = 커널 모드 전환 + CPU register 상태 교체 + 가상 메모리 주소 처리(MMU 수정 + TLB 캐시 비우기)
Thread Context Switching 과정 = 커널 모드 전환 + CPU register 상태 교체
⇒ 스레드 컨텍스트 스위칭이 더 빠르다!
컨텍스트 스위칭 = Pure Overhead
💋 참고자료
- https://www.baeldung.com/cs/os-cpu-context-switch
- https://www.youtube.com/watch?v=Xh9Nt7y07FE&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=2
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
'Computer Science > Operating System' 카테고리의 다른 글
[OS] 동기화 메커니즘(Synchronization Mechanisms)(1): 스핀락(Spinlock), 뮤텍스(Mutex), 세마포어(Semaphore) (0) | 2023.11.20 |
---|---|
[OS] 동기화(synchronization)의 필요성: 경쟁 조건(race condition), 임계 영역(critical section) (0) | 2023.11.12 |
[OS] CPU Bound VS IO Bound: 스레드는 몇 개가 좋을까? (0) | 2023.11.10 |
[OS] 프로세스/스레드의 개념: 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍을 구분하자! (2) | 2023.11.09 |
[OS] Connection Pool Size를 줄이면 오히려 성능이 개선될 수 있다. (1) | 2023.09.29 |