[운영체제] Context Switching (문맥 교환)
PCB : https://wishlee0204.tistory.com/305
Context Switching (문맥 교환) 이란?
CPU가 실행 중인 프로세스를 변경할 때 발생하는 과정
CPU가 이전의 프로세스 상태(레지스터 정보 - PC, SP 등)를 PCB에 저장하고
새로운 프로세스의 PCB를 읽어 레지스터에 값을 복원하여
CPU의 레지스터 정보가 변경되어 새로운 프로세스가 실행(프로세스 상태 변경)되는 과정을 Context Switching 이라고 한다.
보통 인터럽트가 발생하거나, 실행 중인 CPU 사용 허가 시간을 모두 소모하거나, 입출력을 위해 대기해야 하는 경우에 Context Switching이 발생한다.
즉 프로세스가 Ready → Running, Running → Ready, Running → Waiting 처럼 상태 변경 시 발생한다.
문맥 교환 과정은 왜 필요한가?
CPU는 한 번에 하나의 프로세스만 실행할 수 있다.
따라서 여러 프로세스 / 스레드를 동시에 실행시키기 위해서 (동시에 실행되는 것처럼 보이기 위해서) 여러 프로세스를 빠르게 전환하면서 실행해야 한다. by 문맥 교환
switching은 교환.. 그러면 context 란 무엇인가?
context : CPU가 특정 프로세스를 실행하기 위한 정보들의 집합
→ CPU가 현재 어떤 프로세스를 실행해야 하는지 기억하는 정보
프로세스와 관련된 정보는 2 곳에 저장된다.
1. CPU 내부 (Register Context)
- CPU가 직접 작업하는 레지스터에 저장되는 정보
- 프로세스가 실행될 때 CPU에서 관리하는 데이터
2. 메인 메모리 (RAM)
- 실행 중인 프로그램의 코드, 데이터, 스택 , PCB 저장
- 프로세스가 실행되지 않을 때도 보관되는 데이터
📌 정리하면?
- CPU가 작업할 때는 레지스터(Register) 를 사용하지만,
- 프로세스 전체 데이터는 메모리(RAM) 에 저장된다.
CPU - Register Context (레지스터 컨텍스트)
💡 "CPU 내부에 저장된 프로세스 정보"
➡ CPU는 작업할 데이터를 Main Memory(메모리)에서 가져와서 레지스터에 올려서 실행한다.
➡ 이 레지스터에 저장된 프로세스 정보를 Register Context
📌 Register Context에 포함되는 정보
- PC (Program Counter): 다음 실행할 명령어 주소
- SP (Stack Pointer): 현재 스택의 최상단 위치
- 일반 레지스터 (AX, BX, CX, DX 등): 연산 중인 데이터
➡ CPU는 Register Context를 보고 현재 어떤 작업을 수행해야 하는지 판단한다.
메모리
💡 "프로세스 실행을 위해 메모리에 저장된 정보들"
- Code (코드 영역): 실행할 프로그램의 명령어 저장
- Data (데이터 영역): 전역 변수, 정적 변수 저장
- Stack (스택 영역): 함수 호출 정보, 지역 변수 저장
- PCB (Process Control Block): 프로세스의 모든 정보 저장
➡ 특히 PCB는 프로세스의 상태를 관리하는 중요한 구조체이다.
Context Switching 과정
- Task의 대부분 정보는 Register에 저장되고, PCB로 관리된다.
- 현재 실행하고 있는 Task의 PCB 정보를 저장하고,
- 다음 실행할 Task의 PCB 정보를 읽어 Register에 적재한다. (새로운 프로세스의 context 복구)
- 따라서 CPU가 이전에 진행했던 과정을 연속적으로 수행할 수 있다.
📌 Context Switching 동작 과정
1. Context Saving
- 현재 실행 중인 프로세스의 Register Context를 PCB에 저장
- 예) CPU 레지스터 값(PC, SP 등)을 PCB에 기록
2. 새로운 프로세스 선택
- 운영체제(OS)가 실행할 새로운 프로세스 선택
3. Context Restoring
- 새로운 프로세스의 Register Context를 CPU에 적재 → 실행
- 예) PCB에서 레지스터 값(PC, SP 등)을 가져와서 CPU에 입력
이 과정이 운영체제(OS)의 개입으로 자동으로 이루어진다.
좀 더 깊게 살펴보자면..
기본 작업
- 커널 모드로 전환
- 프로세스에서 통제권이 넘어가 커널에서 실행
- 하드웨어와 밀접한 일이나 컴퓨터의 리소스를 사용해야 하는 일
- CPU의 register 상태 교체
- 각종 명령어를 실행하기 위해 필요한 데이터를 저장하는 register의 상태 교체
- 상태 정보를 기억해서 다른 컨텍스트 스위칭 때 사용할 수 있다.
작동 순서
프로세스 A가 running 상태이고, 프로세스 B가 ready 상태일 때
- 스케줄러가 프로세스 A의 실행을 중단하고 프로세스 B를 실행할 것을 요청함(인터럽트/시스템 호출)
- 프로세스 A의 Stack의 데이터 위치를 가리키고 있는 SP(Stack Pointer)의 값과 다음 실행해야 하는 코드의 주소값을 가지고 있는 PC(Program Counter)의 값을 PCB에 업데이트한 후에 메인 메모리에 저장함
- 프로세스 A의 상태는 ready 혹은 block으로 변경되고, CPU에서 프로세스 B를 실행함
- 그리고 다시 프로세스 B에서 프로세스 A로 컨텍스트 스위칭을 하는 경우, 프로세스 B의 SP값과 PC값을 PCB에 저장함
- 이후, 실행해야 할 프로세스 A의 PCB 정보들을 메인 메모리에 가져와서 CPU 레지스터에 넣고 실행함
언제 Context Switching이 일어나는가?
- Interrupt handling : 커널 함수를 통해 프로그램 실행 도중에 중단되어 인터럽리 처리를 기다리는 경우
- Multitasking : 단일 cpu에서 동시에 작업이 실행된느 것처럼 보이도록 하는 경우 (동시성은 컨텍스트 스위칭을 통해 달성된다.)
- Time Quato Expiry : 주어진 quantum(time slice)의 시간이 끝난 경우(CPU의 사용 시간이 만료되었을 때
- Preemption (선점) : 더 우선순위가 높은 일을 해야하는 경우
- 사용자 ↔ 커널 모드 전환 시
- 시스템 호출(SYS_CALL)이나 예외(Exception) 발생 시
- 실행 중이던 프로세스가 커널 모드에서 실행되는 다른 프로세스로 전환될 수 있다.
Context Switching의 OverHead 란?
Overhead : 과부하
컨텍스트 스위칭은 ms의 짧은 시간 단위로 일어나지만, 과도하게 많이 일어나게 되면 오버헤드가 발생한다.
프로세스를 수행하다가 I/O 이벤트가 발생했을 때, 해당 이벤트가 끝날 때 까지 기다리면 CPU를 점유하고 있어도 아무런 작업도 할 수 없기 때문에 CPU가 낭비된다.
따라서 오버헤드를 감수하면서 기존 프로세스를 새 프로세스로 바꾸는 것이 더 효율적이다.
멀티태스킹에서 시간 할당량이 적어지면 문맥 교환의 수와 오버헤드가 증가하지만 동시에 더 많은 프로세스를 수행할 수 있고, 시간 할당량이 커지면 문맥 교환의 수와 오버헤드는 감소하지만 더 적은 프로세스를 동시에 수행할 수 있다.
CPU에 계속 프로세스를 수행시키도록 하기 위해서 다른 프로세스를 실행시키고 Context Switching 한다.
결국 CPU가 놀지 않도록 만들고, 사용자에게 빠르게 일처리를 제공해준다.
문맥교환 시나리오
- P0 프로세스가 인터럽트를 받으면서 PCB0에 P0 프로세스의 상태 정보를 저장한다.
- 다음 수행될 P1 프로세스의 PCB1에서 P1 프로세스의 상태 정보가 CPU에 재로딩 된다.
- P1프로세스를 일정시간 수행한다.
- P1 프로세스가 인터럽트를 받으면서 PCB1에 P1 프로세스의 상태 정보를 저장한다.
- 다음 수행할 PO 프로세스의 PCB0에서 P1 프로세스의 상태 정보가 CPU에 재로딩 된다.
- P0 프로세스를 일정시간 수행한다.
프로세스 컨텍스트 스위칭 vs. 스레드 컨텍스트 스위칭
프로세스와 스레드는 실행 중 언제든지 다른 프로세스로 전환(Context Switching) 될 수 있다.
하지만 프로세스 컨텍스트 스위칭과 스레드 컨텍스트 스위칭은 전환 방식과 속도에서 차이가 있다.
1. 공통점: 컨텍스트 스위칭은 모두 커널 모드에서 실행됨
운영체제(OS)는 사용자 프로그램이 직접 CPU를 조작하지 못하게 하고,
커널 모드에서만 CPU 상태를 변경할 수 있다.
그래서 문맥 교환(Context Switching) 은 항상 커널 모드에서 발생한다.
즉, 운영체제가 직접 CPU의 레지스터 값을 변경하고, 실행할 프로세스나 스레드를 선택하는 작업을 한다.
2. 스레드 컨텍스트 스위칭 (Thread Context Switching)
💡 같은 프로세스 내에서 스레드를 변경하는 것
✔ 예시:
➡ "웹 브라우저" 프로그램(프로세스1)의 탭1에서 탭2로 전환
➡ "게임" 프로그램(프로세스2)에서 그래픽 처리 스레드에서 사운드 처리 스레드로 변경
✔ 작동 방식:
✅ 같은 프로세스 안에서 실행되는 스레드끼리 전환
✅ 스레드끼리는 코드, 데이터, 힙 메모리를 공유
✅ 하지만 스택(Stack)은 각 스레드마다 따로 존재
✔ 변경해야 하는 정보
- CPU 레지스터 값 (현재 실행 중인 명령어, 스택 포인터 등)
- 스택 포인터 (각 스레드는 독립된 스택을 사용하므로 변경 필요)
💡 왜 빠를까?
✅ 같은 프로세스 내에서 작업하므로 메모리 주소 관련 변경이 없음!
✅ 즉, 메모리 주소를 다시 매핑하거나 캐시를 비울 필요가 없어서 빠름
✅ CPU 레지스터 값 정도만 바꾸면 됨
🛠 작업 내용
✔ 커널 모드 전환 (운영체제가 개입)
✔ CPU 레지스터 값 변경
✔ 스택 포인터 변경
3. 프로세스 컨텍스트 스위칭 (Process Context Switching)
💡 현재 실행 중인 프로세스에서 다른 프로세스로 변경하는 것
✔ 예시:
➡ 웹 브라우저(프로세스1)에서 게임(프로세스2)으로 전환
➡ 엑셀(프로세스3)에서 동영상 플레이어(프로세스4)로 변경
✔ 작동 방식:
✅ 실행 중인 프로세스의 CPU 레지스터 값 + 메모리 주소 정보를 모두 변경해야 함
✅ 서로 다른 프로세스는 메모리를 공유하지 않음
✅ 따라서 MMU(Memory Management Unit)의 가상 메모리 주소도 변경해야 함
✔ 변경해야 하는 정보
- CPU 레지스터 값 (현재 실행 중인 명령어, 스택 포인터 등)
- 메모리 주소 정보 (MMU 업데이트) → 가상 주소 체계 변경 필요
- 캐시 비우기 (TLB 캐시 비우기)
💡 왜 느릴까?
✅ 프로세스가 바뀌면 메모리 주소 체계도 변경해야 함
✅ CPU는 실행 중인 데이터를 빠르게 가져오기 위해 캐시(Cache) 를 사용
✅ 프로세스가 바뀌면 이전 프로세스의 캐시 데이터가 남아 있어 새로운 프로세스가 사용 못 함
✅ 이걸 캐시 오염(Cache Pollution) 이라고 함
🛠 작업 내용
✔ 커널 모드 전환 (운영체제가 개입)
✔ CPU 레지스터 값 변경
✔ 메모리 주소 변경 (MMU 수정)
✔ 캐시 비우기 (TLB 캐시 비우기)
4. 스레드 vs. 프로세스 컨텍스트 스위칭 비교
전환 대상 | 같은 프로세스 내 스레드 전환 | 다른 프로세스로 전환 |
공유하는 것 | 코드, 데이터, 힙 공유 | 아무것도 공유하지 않음 |
바꿔야 하는 정보 | CPU 레지스터 + 스택 포인터 | CPU 레지스터 + 가상 메모리 주소 + 캐시 비우기 |
속도 | 빠름 | 느림 |
이유 | 메모리 주소 변경 X, 캐시 유지 가능 | 메모리 주소 변경 O, 캐시 비워야 함 |
추가 작업 | 거의 없음 | MMU 수정 + TLB 캐시 비우기 |
5. 핵심 요약
🔹 스레드 컨텍스트 스위칭: 같은 프로세스 내에서 스레드를 바꾸는 것
🔹 프로세스 컨텍스트 스위칭: 실행 중인 프로세스를 완전히 다른 프로세스로 변경하는 것
💡 프로세스 컨텍스트 스위칭이 느린 이유
1️⃣ 가상 메모리 주소 변경 필요 (MMU 수정)
2️⃣ 캐시 오염 발생 (TLB 캐시 비우기)
3️⃣ 공유되는 정보가 없어 모든 걸 새로 세팅해야 함
💡 스레드 컨텍스트 스위칭이 빠른 이유
1️⃣ 같은 프로세스 내에서 실행되므로 메모리 주소 변경 없음
2️⃣ 캐시를 유지할 수 있음
3️⃣ CPU 레지스터와 스택 포인터만 변경하면 됨
Context Switching은 비용이 많이 소모된다.
- 문맥교환에서의 비용은?
- CPU 자원과 시스템 성능의 낭비를 의미한다.
문맥 교환(Context Switching)은 비용이 많이 소모되는 작업이다. 그 이유를 알아보자
1. 왜 비용이 많이 소모되는가?
- Cache 초기화
- CPU는 캐시 메모리(L1, L2, L3)를 사용하여 데이터를 빠르게 접근한다.
- 하지만 프로세스가 변경되면 이전 프로세스의 캐시 데이터가 무효화되고 새로운 프로세스의 데이터를 다시 로드해야 한다.
- 이 과정에서 Cache Miss가 증가하며, 메모리 접근 속도가 느려져 성능이 저하된다.
- Memory Mapping 초기화
- 각 프로세스는 고유한 가상 주소 공간을 가진다.
- 문맥 교환 시 페이지 테이블과 메모리 맵핑 정보를 새롭게 설정해야 하며, 이는 TLB(Translation Lookaside Buffer)도 초기화해야 하는 과정이 필요하다.
- 이 과정에서 TLB Miss가 발생하면 메모리 접근 속도가 느려진다.
- 커널이 항상 실행되어야 한다
- 문맥 교환을 수행하는 주체는 운영체제(OS) 커널이다.
- 문맥 교환을 위해 커널 모드로 전환(Mode Switching)되어야 하며, 이 과정에서 커널 코드 실행에 따른 오버헤드가 발생한다.
- 즉, 유저 모드 → 커널 모드 → 유저 모드 전환 과정에서 불필요한 CPU 자원이 소비된다.
2. Context Switching의 비용
- 프로세스 문맥 교환 비용 > 스레드 문맥 교환 비용
- 프로세스 교환 시
- PCB(Process Control Block)에 있는 모든 레지스터, 스택, 프로그램 카운터, 페이지 테이블 정보를 저장하고 복원해야 한다.
- 메모리 매핑이 새로 설정되어야 한다. (TLB, 캐시 초기화)
- 따라서 비용이 크다.
- 스레드 교환 시
- 같은 프로세스 내에서 스택(Stack)만 변경하면 되므로 부담이 적음
- Code, Data, Heap 영역은 그대로 유지되므로 메모리 재설정 부담이 없음
- 따라서 비용이 적다
- 프로세스 교환 시
reference
CS-Study/operating-system/컨텍스트 스위칭.md at main · jmxx219/CS-Study
Computer Science && Tech Interview . Contribute to jmxx219/CS-Study development by creating an account on GitHub.
github.com
https://velog.io/@klloo/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-PCB%EC%99%80-Context-Switching
[운영체제] PCB와 Context Switching
특정 프로세스에 대한 정보를 담고 있는 자료구조운영체제는 PCB에 담긴 프로세스 정보를 이용하여 프로세스를 관리하고 제어한다.프로세스가 생성될 때 마다 고유의 PCB가 생성되어 메인 메모
velog.io