한줄 요약 : CPU가 한 개의 Task(process/Thread)의 상태를 저장하고 다음 진행할 Task의 상태값을 읽어 적용하는 과정입니다.
CPU는 기본적으로 한번에 한가지 일만 합니다. 하지만 우리의 프로그램들은 동시에 여러 일이 필요합니다. 하지만 중간 중간 선수 교체는 필요한 법이죠.
포켓몬스터를 하는데 포켓몬이 Process라고 생각하면 됩니다.
포켓몬이 하는 일은 Thread 입니다.
포켓몬스터로 이해해봅시다.
결투중 어떤 포켓몬을 사용할지는 트레이너가 정합니다.
CPU가 무슨 일을 할 지는 OS(운영체제)가 정합니다.
우리는 이제부터 포켓몬 트레이너(OS)입니다.
OS : CPU가 휴식하기에는 너무 일이 많단다! 일단 하나를 하고 있으렴
파이리의 선택은 정말 좋았습니다.
당장 필요했던 안전을 지켜주고, 요리가 필요할 때에는 불도 문제가 없었습니다.
식량 문제도 해결할 수 있었습니다.
하지만 저런,,,! 문제가 생겼습니다.
파이리가 불을 내고 말았습니다.
우리에게 필요한 것은 파이리가 아니라 꼬부기입니다...!!
나와라 꼬부기..!
꼬부기는 열심히 불을 꺼줬습니다.
우리는 꼬부기와 함께 여행을 지속했습니다.
역시 목 마를 때에는 꼬부기죠!
하지만 꼬부기랑만 다닐 수는 없습니다.
배는 너무 금방 꺼지고 배를 채우려면 파이리가 필요합니다.
우리는 배고파 죽을때 쯤 파이리를 다시 불렀고, 목말라 죽을때 쯤 꼬부기를 불렀습니다.
이쯤되면 생각이 납니다.
배고파 죽을것같을때, 목말라 죽을 것 같을 때 말고 그냥 정기적으로 꼬부기랑 파이리를 교체하자 !
그래서 우리는 스케줄을 짜기로 했습니다.
파이리와 꼬부기는 2시간 마다 교대로 소환되기로 하였습니다.
그리고 일도 정기적으로 하기로 했습니다.
파이리와 꼬부기는 업무가 많아서 모든 업무를 2시간만에 끝낼 수 없습니다. 다음에 소환될 때 이전에 하던 일을 바로 이어서 할 수 있도록 각 포켓몬은 본인이 뭘 하고 있었는지 수첩에 기록한 뒤 다음 포켓몬을 소환하기로 했습니다.
이처럼 Task(포켓몬, 포켓몬의 업무)를 교체하는 것을 Context Switching이라고 합니다.
포켓몬들도 소환되자마자 바로 일을 시작 할 수는 없습니다. 포켓볼에 들어가기 전에 뭘 하고 있었는지 기록했던 수첩도 읽고 스트레칭도 한번 하고 일을 시작할 수 있습니다.
CPU도 Context Switching을 수행하는 동안 Cache를 초기화하고 Memory Mapping을 초기화하는 등 바로 일을 할 수 없습니다.
분명 일을 제대로 못할 겁니다. 소환되고 수첩 읽고 스트레칭하고 일 좀 할까? 하면 다른 포켓몬으로 교체될 테니까요.
대신에 업무를 자주 바꾸는건 어떨까요? 수첩읽고 스트레칭하는 시간은 필요없을테니 조금 더 시간이 절약되겠죠?
멀티 프로세스를 통해 PCB를 Context Switching하는 것 보다 멀티 Thread를 통해 TCB를 Context Switching하는 비용이 더 적습니다.