| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- makefile
- interrupt handler
- pagefile.sys
- 소캣
- layouts
- HDR
- fprintf
- intents
- ubuntu
- Shared Folder
- 디스크 축소
- context switch
- 프레임버퍼
- 문자형 디바이스 파일
- usb2.0
- jenkins
- activities
- context
- DMA
- 멀티프로세싱
- fscanf
- 환경 변수
- gparted
- interrupt context
- 속도저하
- 디스크립터
- sscanf
- 젠킨스
- memcmp
- sprintf
- Today
- Total
do{학습}while
Kernel) Context와 Context Switch란 무엇인가 본문
운영체제에서 멀티태스킹을 구현하기 위해 가장 중요한 개념 중 하나가 바로 "Context"와 "Context Switch"다. 이 글에서는 context가 의미하는 바와 context switch 과정에서 정보가 어떻게 저장되고 관리되는지를 설명한다.
Context란?
Context는 일반적으로 "문맥" 또는 "상황"을 의미하지만, 운영체제나 커널 레벨에서는 "CPU가 어떤 프로세스를 실행하던 시점의 상태 정보"를 의미한다. 이 상태 정보에는 다음과 같은 것들이 포함된다:
- 레지스터 값
- 프로그램 카운터(PC)
- 스택 포인터(SP)
- 프로세서 플래그
- 그 외 아키텍처에 따라 필요한 정보들
다시 쉽게 설명하자면...
여러 업무를 하고 있다고 가정할 때, 기존에 하던 업무를 잠시 멈추고 다른 업무를 하기 전에
정해진 형식(thread_info, thread_struct)에 따라 상태를 기록해두고,
다시 돌아올 때 그 기록을 참고하여 원래 업무를 이어가는 것.
그 기록 자체가 context다.
Context Switch란?
Context Switch는 운영체제가 하나의 프로세스 실행을 중단하고, 다른 프로세스로 CPU 자원을 넘겨주는 작업이다. 이를 통해 멀티태스킹이 가능해진다.
Context Switch가 일어날 때 운영체제는 다음의 두 가지 작업을 수행한다:
- 현재 실행 중인 프로세스의 context 저장
- 다음에 실행할 프로세스의 context 복원
이 과정을 통해 이전에 실행되던 프로세스는 마치 중단되지 않고 계속 실행되었던 것처럼 상태가 이어진다.
Context는 어디에 저장되는가?
리눅스 커널에서는 Context 정보가 주로 두 개의 구조체에 저장된다:
1. task_struct
task_struct는 프로세스와 관련된 대부분의 정보를 담고 있는 커널의 핵심 구조체이다. 이 구조체 내부에는 thread_struct라는 멤버가 있으며, 여기에 context 정보가 저장된다.
struct task_struct {
...
struct thread_struct thread;
...
};
2. thread_struct
thread_struct는 실제 context 정보를 담고 있는 구조체로, CPU 레지스터, 스택 포인터, 프로그램 카운터 등의 정보를 포함한다. 이 구조체는 아키텍처에 따라 다르게 정의된다.
struct thread_struct {
unsigned long sp;
unsigned long ip;
...
};
3. thread_info
thread_info는 스택 하단에 위치하며 task_struct보다 가볍고 빠르게 접근할 수 있는 구조체다. 빠른 context 전환이나 커널 초기화 단계 등에서 자주 사용된다.
struct thread_info {
struct task_struct *task;
unsigned long flags;
...
};
마무리
Context는 단순히 프로세스의 상태 정보에 그치지 않고, context switch와 함께 운영체제의 멀티태스킹 구현에 핵심적인 역할을 한다.
추가
아키텍쳐 별 Stack의 크기
| 아키텍쳐 | 10진수 | 16진수 |
| x86 (32bit) | 8KB = 8192 | 0x2000 |
| x86_64 (64bit) | 16KB = 16384 | 0x4000 |
| ARM (32bit) | 8KB = 8192 | 0x2000 |
| ARM64 (64bit) | 16KB = 16384 | 0x4000 |
'Linux > Kernel' 카테고리의 다른 글
| Kernel) QEMU와 Buildroot로 ftrace 실습 환경 만들기 (1) | 2025.05.24 |
|---|---|
| Kernel) 디버깅을 연습을 위한 환경 셋팅(x86 환경) (0) | 2025.05.19 |
| Kernel) 커널 동기화 (0) | 2025.05.15 |
| Kernel) Interrupt, Interrupt handler, Interrupt context (0) | 2025.05.15 |
| Kernel) 프로세스 VS 스레드 (0) | 2025.05.14 |