do{학습}while

Kernel) Context와 Context Switch란 무엇인가 본문

Linux/Kernel

Kernel) Context와 Context Switch란 무엇인가

하이오야이 2025. 5. 14. 16:44

운영체제에서 멀티태스킹을 구현하기 위해 가장 중요한 개념 중 하나가 바로 "Context"와 "Context Switch"다. 이 글에서는 context가 의미하는 바와 context switch 과정에서 정보가 어떻게 저장되고 관리되는지를 설명한다.

Context란?

Context는 일반적으로 "문맥" 또는 "상황"을 의미하지만, 운영체제나 커널 레벨에서는 "CPU가 어떤 프로세스를 실행하던 시점의 상태 정보"를 의미한다. 이 상태 정보에는 다음과 같은 것들이 포함된다:

  • 레지스터 값
  • 프로그램 카운터(PC)
  • 스택 포인터(SP)
  • 프로세서 플래그
  • 그 외 아키텍처에 따라 필요한 정보들

다시 쉽게 설명하자면...

여러 업무를 하고 있다고 가정할 때, 기존에 하던 업무를 잠시 멈추고 다른 업무를 하기 전에
정해진 형식(thread_info, thread_struct)에 따라 상태를 기록해두고,
다시 돌아올 때 그 기록을 참고하여 원래 업무를 이어가는 것.
그 기록 자체가 context다.

Context Switch란?

Context Switch는 운영체제가 하나의 프로세스 실행을 중단하고, 다른 프로세스로 CPU 자원을 넘겨주는 작업이다. 이를 통해 멀티태스킹이 가능해진다.

Context Switch가 일어날 때 운영체제는 다음의 두 가지 작업을 수행한다:

  1. 현재 실행 중인 프로세스의 context 저장
  2. 다음에 실행할 프로세스의 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