컨텍스트 스위칭
컨텍스트 스위칭 개념 정리
운영체제프로세스와 스레드 개념과 아주 밀접하게 연결된 개념으로, 우리가 컴퓨터로 여러 프로그램을 동시에 켜놓고 사용하는 것처럼 보이는 이유를 설명해 주는 핵심 원리
컨텍스트
- 특정 프로세스나 스레드가 현재 어떤 상태에서 작업을 하고 있는지에 대한 모든 정보의 집합
- e.g.) 다음에 실행할 명령어의 위치, 사용 중이던 데이터, 메모리 정보 등
컨텍스트 스위칭
- 하나의 CPU가 현재 실행하고 있는 프로세스(또는 스레드)의 컨텍스트를 저장하고, 다음에 실행할 다른 프로세스(또는 스레드)의 컨텍스트를 복원해 실행을 전환하는 과정
- 이 과정에 아주 빠르게 일어나기 때문에, 사용자 입장에서는 여러 작업이 동시에 처리되는 것처럼 보임
쉽게 이해하기
쉽게 정리하면 이렇다.
컴퓨터의 CPU 코어는 한 번에 딱 하나의 일만 처리할 수 있는데, 이건 마치 학생 한 명이 수학 문제집과 영어 단어장을 동시에 풀 수 없는 것과 같다. 그렇다면 어떻게 여러 과목을 공부하는가?
- 수학 공부 시작: 학생은 수학 문제집의 특정 페이지의 특정 문제를 풀기 시작한다. (이때 '수학', '문제집 53페이지 3번 문제' 같은 정보가 머릿속에 있다.)
- 과목 전환(Switching): 정해진 시간(e.g. 30분)이 지나면, 학생은 풀던 위치를 책갈피로 표시하고 수학 문제집을 덮는다.
- 영어 공부 시작: 이제 영어 단어장을 펴고, 이전에 외우던 부분부터 다시 외우기 시작한다. (머릿속 정보를 '영어', '단어장 12과'로 바꾼다.)
즉, 한 과목 공부를 멈추고 다른 과목으로 넘어갈 때
- 어디까지 했는지 기억하고 (저장)
- 새로운 과목의 진도를 불러오는 (복원)
이런 행위를 하는데 이것이 바로 컨텍스트 스위칭과 같다.
일어나는 이유
1. 멀티태스킹을 위한 OS의 강제 조치(가장 일반적인 이유)
컴퓨터에 CPU 코어가 1개뿐이라고 가정해본다. 그러나 우리는 음악을 들으면서 코딩을 하고 웹서핑도 동시에 한다.
이것이 가능한 이유는 OS가 프로세스에게 CPU를 사용할 시간을 아주 짧게 나누어 주기 때문이다.
- 타임 슬라이스: OS는 각 프로세스에게 아주 짧은 CPU를 사용하라고 할당하는데, 이 할당된 시간을 의미한다.
- 타이머 인터럽트: 할당된 시간이 끝나면, 하드웨어 타이머가 CPU에게 시간이 다 됐다는 신호(인터럽트)를 보낸다.
- 강제 전환: 신호를 받은 OS는 현재 실행 중이던 프로세스를 강제로 멈추고, 다음 차례의 프로세스에게 CPU 사용 권한을 넘긴다. 이 과정에서 컨텍스트 스위칭이 발생한다.
💬 비유: 마치 체스 고수가 여러 명의 초보자와 동시에 체스를 두는 것과 같음 고수는 1번 선수와 한 수를 두고, 바로 2번에게 가서 한 수를 두고, 다시 3번에게... 이 과정을 아주 빠르게 반복하면, 각 선수들은 고수가 자신하고만 게임하는 것처럼 느끼게 된다.
2. 프로세스의 자발적인 대기 상태 진입
프로세스가 실행되다가 스스로 CPU를 양보해야 하는 상황이 발생하기도 한다.
대표적인 것이 I/O 작업을 요청할 때다.
- 느린 I/O 작업: 하드디스크에서 파일을 읽거나, 인터넷으로 다운받는 작업은 CPU의 연산 속도에 비해 엄청 느리다.
- CPU 낭비 방지: 만약 프로세스가 파일 읽기가 끝날 때까지 CPU를 계속 점유하고 아무것도 안 하고 기다린다면, 이는 엄청난 자원 낭비다.
- 자발적 대기: 따라서 OS는 I/O 작업을 요청한 프로세스를 '대기' 상태로 만든다.
- 그리고 그 즉시 CPU를 다른 '준비' 상태의 프로세스에게 넘겨준다. (컨텍스트 스위칭 발생)
💬 비유: 식당에서 주문한 음식을 기다리는 상황과 같다. 음식을 주문하고(I/O 요청) 주방에서 요리가 완성될 때까지 멀뚱멀뚱 기다리는(CPU 점유) 것이 아니라, 자리에서 친구와 이야기를 나누거나(다른 프로세스 실행) 물을 마시는 것(다른 프로세스 실행)과 같다.
프로세스 vs 스레드 컨텍스트 스위칭
컨텍스트 스위칭은 프로세스 간에도, 스레드 간에도 일어난다. 하지만 큰 차이가 있다.
- 프로세스 컨텍스트 스위칭
- 독립된 메모리 공간을 사용하므로, 전환시 메모리 구조 전체(페이지 테이블 등)를 바꿔야 함
- 스레드 컨텍스트 스위칭
- 같은 프로세스 내에서 일어나므로 메모리 공간을 공유
- 바꿔야 할 정보는 스택이나 레지스터 값 등 일부 정보에 한정
- 그래서 훨씬 가볍고 빠르다.