스레드 컨텍스트 스위칭이 프로세스 컨텍스트 스위칭보다 빠른 이유는?
-> 메모리 주소 관련 처리를 하지 않기 때문
프로세스는 메모리에 올라가서 사용자에 의해 컴퓨터 상에서 실행 중인 프로그램이다. 그 프로세스의 실행 정보 또는 상태(메모리 주소 공간, 프로세스 ID, etc)는 OS에 의해 관리된다.
하지만 실제로 CPU 코어에서 실행되는 것은 스레드다.
따라서 CPU 코어에서 컨텍스트 스위칭이 되는 대상도 언제나 스레드다.
이때 같은 프로세스에 속한 스레드 간에 컨텍스트 스위칭이 발생한다면,
'스레드 컨텍스트 스위칭'이라고 부른다.
다른 프로세스에 속한 스레드 간에 컨텍스트 스위칭이 발생한다면,
'프로세스 컨텍스트 스위칭'이라고 부른다.
CPU 사용 시간을 아주 짧게 쪼개서 time slice 단위로
여러 스레드들이 번갈아 CPU에서 실행될 수 있도록 하는 방식이다
(스레드들은 같은 프로세스 소속일 수도 있고 다른 프로세스 소속일 수도 있다)
OS 마다 다르겠지만, 적어도 리눅스에서는 고정이 아니다
만약 동시에 실행돼야 하는 스레드 수가 계속 늘어난다면,
스레드가 실행되고 다시 자기 차례가 올 때 까지 기다리는 시간이 점점 더 길어지게 될 것이다
그리고 그만큼 스레드의 응답성도 떨어지게 된다
컨텍스트 스위칭이 많아질수록 그로인한 CPU 오버헤드도 더 많아질 것이다.
그러므로 스레드를 너무 많이 만들면 좋지 않다.
실행 주체: OS 커널(kernel)
실행 이유: 여러 프로세스/스레드 를 동시에 실행시키기 위해 필요함
정의: CPU/코어 에서 실행 중이던 프로세스/스레드 가 다른 프로세스/스레드 로 교체되는 것
실행 시점:
주어진 time slice(quantum)를 다 사용했거나,
I/O 작업을 해야하거나,
다른 리소스를 기다려야 하거나,
등등의 경우에 발생함
컨텍스트 스위칭은 아래와 같은 작업을 수행한다
(넘버는 실행 순서와는 관계 없음)
현재 실행 중인 프로세스 혹은 스레드의 context 백업
(가령, CPU 레지스터 값들, 어디까지 실행됐는지 등)
CPU 캐시를 비움(flush)
(CPU 마다 L1, L2 cache에 대한 동작이 다를 수 있음, 심지어 안 비울 수도 있음)
TLB(table lookaside buffer)를 비움
MMU(memory management unit)를 변경
프로세스 컨텍스트 스위칭: {1, 2, 3, 4번}을 모두 수행하지만
스레드 컨텍스트 스위칭: {1번}만 수행한다
컨텍스트(context)
- 프로세스/스레드의 상태
- CPU, 메모리 등등
OS 커널(kernel)
- 각종 리소스를 관리/감독하는 역할
가상 메모리(virtual memory)
실제 물리적인 메모리가 커버할 수 있는 용량에 비해
컴퓨터 상에서 실행되는 프로세스들이 사용하는 메모리 총량은 더 많아서
그 물리적인 메모리 용량의 한계를 극복하기 위해 나온 개념모든 프로세스는 자신 만의 virtual memory 영역을 가지는데,
예를 들어, 프로세스 A와 프로세스 B 모두 각각
가상(virtual) memory 주소 0에서 주소 10000000까지의 범위를 가지지만, 실제 메모리 상에서는 서로 다른 위치에 저장이 됌예를 들어,
프로세스 A의 가상 메모리 주소 100번에 위치한 데이터와
프로세스 B의 가상 메모리 주소 100번에 위치한 데이터는 다름.
가상 메모리 주소는 둘 다 동일하게 100번이라도
이 주소 100번이 실제 메모리 상에서 맵핑되는 위치는 다르기 때문임
캐시 오염 (cache pollution)
컨텍스트 스위칭(C.S)가 CPU를 잡아먹기 때문에, 너무 자주 발생하면 안 좋음
순수한 오버헤드 (pure overhead)
입출력 장치와 연관이 있는 I/O(입출력) 작업 시에
컨텍스트 스위칭이 발생하는 이유는,
입출력 장치에서 작업 처리를 하는 동안에는
CPU는 일 없이 기다리고 있어야 하기 때문이다.
기다리는 동안 CPU를 점유하고 있으면 CPU 낭비가 되기 때문에 그렇게 하지 않고
컨텍스트 스위칭이 돼서 다른 프로세스/스레드가 CPU를 사용할 수 있다.
백엔드를 예로 들면, 백엔드에서 가장 많이 사용하는 I/O는 네트워크 I/O이다.
백엔드 서버에서 다른 서버에 데이터를 보내거나 혹은 요청했을 때
그 데이터가 네트워크 공간을 이동하는 동안에는,
혹은 그 데이터가 다른 서버에서 처리되는 동안에는,
백엔드 서버의 CPU가 할 수 있는 일이 아무것도 없다.
이런 상태에서도 네트워크 I/O 작업을 요청한 프로세스/스레드가
CPU를 점유하고 있다면 CPU 낭비가 발생하기 때문에
그렇게 하지 않고 컨텍스트 스위칭을 해줘서
다른 기다리고 있는 프로세스/스레드가 CPU를 사용할 수 있도록 해주는 거다.