현대 프레임워크와 라이브러리들은 이미 최적화된 방식을 가지고 동시성 처리하도록 설계되어 있어, 개발자는 낮은 수준의 개념을 직접 관리할 필요가 없다. 그렇다면 이러한 CS 지식들을 자세히 이해하지 않고도 백엔드 개발을 잘 할 수 있을까? 개발 중 런타임 에러가 발생하면 개발자는 어느 부분에서 에러가 발생했는지 예상할 수 있어야 한다. CS 지식을 이해하지 않고 개발을 진행하면 이런 런타임 에러의 발생 지점을 예상하기 매우 어렵다. 따라서, 우리는 아무리 프레임워크와 라이브러리들이 내부적으로 추상화가 잘되어있고, 다 만들어놔도 CS 공부를 게을리하면 안된다.
Context Switching
Context란?
context는 프로세스나 스레드의 현재 상태이다.
context에는
- CPU 레지스터 상태(프로그램 카운터, 스택 포인터 등)
- 프로세스 정보: 프로세스 상태 정보, PID 등
- 메모리 상태: 메모리 경계, 페이지 테이블 등
- I/O 상태 정보: 열린 파일 디스크립터, 네트워크 연결 등
가 포함되어 있다.
컨텍스트 스위칭이 필요한 이유
컨텍스트 스위칭은 단일 CPU코어에서 여러 작업을 동시에 처리하는 것처럼 보이게 하는 멀티태스킹의 중요한 요소이다. 사용자에게 여러 프로그램이 동시에 실행되는 것 처럼 느끼게 해 반응성을 좋게 한다.
컨텍스트 스위칭이 발생하는 이유
- Time Slice(Quantum) 소진
- 각 프로세스나 스레드에 할당된 CPU 시간(타임 슬라이스)이 모두 사용되면 스케줄러가 컨텍스트 스위칭을 진행한다.
- 선점형 알고리즘에서 발생한다.
- I/O 작업 요청
- 프로세스가 디스크 읽기/쓰기, 네트워크 통신 등의 I/O 작업을 요청하면 컨텍스트 스위칭이 발생한다.
- CPU는 I/O 작업이 완료될 때까지 기다리는 대신, 다른 프로세스로 전환하여 효율성을 높인다.
- I/O 완료 시 인터럽트가 발생하고, 기존 프로세스로 다시 전환할 수 있다.
- 인터럽트 발생
- 하드웨어 인터럽트나 소프트웨어 인터럽트가 발생하면 컨텍스트 스위칭이 발생할 수 있다.
- 인터럽트 처리 루틴이 실행되고, 우선순위에 따라 원래 프로세스로 돌아가거나 다른 프로세스로 전한된다.
- 동기화 이벤트
- 한 스레드가 자원을 기다려야 할 때, 다른 스레드로 컨텍스트 스위칭발생한다.
- 우선순위 기반
- 더 높은 우선순위의 프로세스나 스레드가 실행 가능한 상태가 되면, 현재 실행 중인 낮은 우선순위의 작업을 중단하고 스위칭한다.
- 명시적 양보
- 프로세스나 스레드가 스스로 CPU 사용을 포기하고 다른 작업에게 넘겨줄 수 있다.
컨텍스트 스위칭의 주체
컨텍스트 스위칭의 주체는 운영체제의 커널이다. 커널이 독점적으로 컨텍스트 스위칭을 수행한다. 커널은 스케줄러를 통해 다음에 실행할 프로세스나 스레드를 선택하고 디스패처를 통해 컨텍스트 스위칭을 수행한다. 사용자 모드 프로그램은 시스템 콜을 통해 커널에 컨텍스트 스위칭을 요청해야 한다.
컨텍스트 스위칭의 과정
프로세스 컨텍스트 스위칭

- 인터럽트 또는 시스템 콜 발생:
- 타이머 인터럽트, I/O 인터텁트, 시스템 콜 등이 발생하면 CPU는 현재 작업을 중단하고 커널 모드로 전환한다.
- 인터럽트 벡터 테이블을 통해 해당 인터럽트 핸들러로 점프한다.
- 현재 프로세스 상태 저장
- 프로그램 카운터(PC), 스택 포인터(SP) 등 CPU 레지스터 값을 PCB(Process Control Block)에 저장한다.
- 프로세스의 상태를 'Running'에서 'Ready' 또는 'Blocked'로 변경한다.
- 메모리 관리 정보(페이지 테이블 포인터 등)를 저장한다.
- 스케줄러 호출
- 커널의 스케줄러가 호출되어 다음에 실행할 프로세스를 선택한다.
- 메모리 관리 구조 업데이트
- 새로운 프로세스의 메모리 주소 공간으로 전환하기 위해 MMU(Memory Management Unit) 설정을 업데이트한다.
- 페이지 테이블 베이스 레지스터(PTBR)를 새 프로세스의 페이지 테이블 주소로 설정한다.
- TLB(Translation Lookaside Buffer)를 플러시한다. 이 단계가 중요한데, TLB는 가상 메모리 주소와 물리적 메모리 주소 간의 매핑을 캐싱하는 하드웨어다. 다른 프로세스로 전환 시 이전 매핑 정보가 유효하지 않으므로 반드시 초기화해야 한다.
- 캐시 영향
- 프로세스 전환은 CPU 캐시(L1, L2, L3 캐시)의 효율성에 영향을 미친다.
- 새 프로세스는 초기에 캐시 미스가 많이 발생하여 실행 속도가 일시적으로 느려질 수 있다.
- 다음 프로세스 상태 복원
- 선택된 프로세스의 PCB에서 저장된 레지스터 값을 CPU 레지스터로 복원한다.
- 프로세스 상태를 'Ready'에서 'Running'으로 변경한다.
- CPU 권한 레벨을 설정하고, 필요한 경우 사용자 모드로 전환한다.
- 실행 재개
- 복원된 프로그램 카운터가 가리키는 위치부터 새 프로그램의 실행을 시작한다.
스레드 컨텍스트 스위칭

- 인터럽트 또는 시스템 콜 발생:
- 타이머 인터럽트, I/O 인터텁트, 시스템 콜 등이 발생하면 CPU는 현재 작업을 중단하고 커널 모드로 전환한다.
- 인터럽트 벡터 테이블을 통해 해당 인터럽트 핸들러로 점프한다.
- 현재 스레드 상태 저장
- 프로그램 카운터(PC), 스택 포인터(SP) 등 CPU 레지스터 값을 TCB(Thread Control Block)에 저장한다.
- 스레드의 상태를 업데이트한다.
- 스케줄러 호출
- 스레드 스케줄러가 호출되어 다음에 실행할 스레드를 선택한다.
- 메모리 관리 구조 유지
- 프로세스 컨텍스트 스위칭과 달리, 동일한 프로세스 내에서 스레드 간 전환이므로 메모리 주소 공간은 변경되지 않는다.
- MMU 설정은 그대로 유지된다.
- TLB를 플러시할 필요가 없다.
- 메모리 관련 캐시가 유효하게 유지된다.
- 스레드 별 상태 복원
- 선택된 스레드의 TCB에서 레지스터 상태를 복원한다.
- 스택 포인터는 해당 스레드의 스택을 가리키도록 변경된다.
- 실행 재개
- 복원된 프로그램 카운터가 가리키는 위치부터 새 스레드의 실행을 시작한다.
프로세스 vs 스레드 컨텍스트 스위칭
- 메모리 관리
- 프로세스 컨텍스트 스위칭
- 가상 메모리 공간 전체가 변경된다.
- 페이지 테이블이 완전히 교체된다.
- 커널은 MMU를 재설정하고 TLB를 플러시해야 한다.
- 각 프로세스는 독립적인 메모리 공간을 가지므로, 보안과 안정성이 향상되지만 스위칭 비용이 증가한다.
- 스레드 컨텍스트 스위칭
- 가상 메모리 공간을 공유한다.
- 페이지 테이블이 변경되지 않는다.
- MMU 재설정이나 TLB 플러시가 필요 없다.
- 메모리 캐시 효율성이 유지된다.
- 프로세스 컨텍스트 스위칭
- 캐시
- 프로세스 컨텍스트 스위칭
- 프로세스 전환 시 CPU 캐시의 대부분이 무효화된다.
- 코드와 데이터 캐시 적중률이 크게 저하된다.
- 캐시 예열 시간이 필요하여 초기 성능이 저하될 수 있다.
- 스레드 컨텍스트 스위칭
- 코드 세그먼트와 전역 데이터는 캐시에 그대로 유지된다.
- 지역 변수와 스택 관련 데이터만 캐시 미스가 발생한다.
- 캐시 효율성이 더 높게 유지되어 성능 저하가 적다.
- 프로세스 컨텍스트 스위칭
- 레지스터 및 상태 정보
- 프로세스 컨텍스트 스위칭
- PCB에 저장되는 정보가 더 많다.
- 모든 CPU 레지스터와 함께 프로세스 관련 메타데이터가 저장/복원된다.
- 파일 디스크립터, 시그널 핸들러 등의 정보도 교체될 수 있다.
- 스레드 컨텍스트 스위칭
- TCB에 저장되는 정보가 더 적다.
- 주로 CPU 레지스터와 스레드 특정 정보만 저장/복원한다.
- 파일 디스크립터, 시그널 핸들러 등은 프로세스 내에서 공유된다.
- 프로세스 컨텍스트 스위칭
- 성능 및 오버헤드
- 프로세스 컨텍스트 스위칭
- 일반적으로 수천 개의 CPU 사이클이 소요된다.
- TLB 미스와 캐시 미스로 인한 추가 지연이 발생한다.
- 상대적으로 비용이 높은 작업이다.
- 스레드 컨텍스트 스위칭
- 일반적으로 수백 개의 CPU 사이클이 소요된다.
- 메모리 관련 오버헤드가 없어 더 빠르다.
- 프로세스 컨텍스트 스위칭