LINUX

프로세스는 어떻게 실행되는가(3/3): CPU 스케줄링과 컨텍스트 스위칭

최서은 2026. 4. 15. 17:56

 

 

지난 포스팅에서 프로그램이 프로세스로 탄생하고 관리되는 전반적인 생명주기를 다뤘다면, 이번 글에서는 그 프로세스들이 한정된 자원을 어떻게 나누어 쓰는지 알아보겠습니다.

 

우리가 컴퓨터로 음악을 들으면서 웹서핑을 하고, 동시에 수십 개의 브라우저 탭을 띄워둘 수 있는 이유는 사실 운영체제가 보이지 않는 곳에서 미친 듯이 바쁘게 움직이고 있기 때문입니다.

 

이번 포스팅에서는 한정된 CPU 자원, 실행하려는 프로세스는 넘쳐나는 상황에서 순서를 정하는 CPU 스케줄링과 작업을 교체하는 순간에 발생하는 컨텍스트 스위칭의 동작 원리를 자세히 살펴보겠습니다.

 

 

 

 

CPU 스케줄링


CPU는 단일 코어 기준으로 하나의 프로세스만 처리할 수 있습니다. 

우리가 수백 개의 프로그램을 동시에 실행하는 것처럼 느끼는 것은 스케줄러가 CPU 자원을 사용할 프로세스를 실시간으로 결정하고, CPU가 그 결정을 받아 사람이 인지하지 못할 만큼 빠른 속도로 각 프로세스를 교체하며 실행하기 때문입니다.

 

CPU 스케줄링은 준비 큐(Ready Queue)에 쌓여 있는 여러 프로세스 중 어떤 프로세스에게 CPU 자원을 할당할지 결정하는 기술입니다.

모든 프로세스에게 공평하게 기회를 주면서도, 전체 작업량은 늘리고, 사용자가 느끼는 지연 시간은 줄이는 것이 핵심입니다.

 

 

 

스케줄러와 디스패처 (Scheduler & Dispatcher)


운영체제 내에서 CPU 자원을 할당하는 과정은 선택과 실행이라는 두 단계로 나뉩니다.

실행 프로세스의 선택은 스케줄러, 실행은 디스패처가 담당합니다.

 

스케줄러

 

운영체제에는 장기 스케줄러, 단기 스케줄러, 중기 스케줄러 세 가지 유형의 스케줄러가 있습니다.

이중 단기 스케줄러는 CPU 스케줄러라고도 합니다.

 

단기 스케줄러의 역할은 준비 큐에서 CPU에 할당할 프로세스를 선택하는 것입니다.

프로세스 스케줄링

 

스케줄러는 특정 프로세스가 I/O 작업 등으로 인해 대기 상태로 전환되어 CPU가 비는 시간 동안, 자원 활용을 극대화하기 위해 준비 큐에서 다음에 실행할 프로세스를 선택합니다.

  • 중기 스케줄러: 메모리 부족 시 프로세스를 임시로 디스크로 쫓아내거나(Swap-out), 다시 메모리로 불러들이는(Swap-in) 역할을 수행하여 메모리 위의 프로세스 수를 조절합니다.
  • 장기 스케줄러: 디스크에 대기 중인 프로그램 중 어떤 것을 메모리에 올려 프로세스로 만들지 결정하여, 시스템 내 전체 프로세스 수(다중 프로그래밍의 정도)를 조절합니다.

 

 

디스패처

 

 스케줄러가 준비 큐에서 실행할 CPU를 할당할 프로세스를 선택하면, 디스패처는 선택된 프로세스를 CPU에 할당하는 작업을 수행합니다.

 

실행 중인 프로세스는 I/O 작업 등을 위해 대기 상태로 전환되고 CPU는 다른 프로세스에 할당됩니다. 

이렇게 CPU가 다른 프로세스로 전환되는 과정을 컨텍스트 스위칭이라고 합니다.

 

디스패처는 컨텍스트 스위칭 외에도 사용자 레지스터 설정, 메모리 매핑 등 다양한 작업을 수행합니다.

 

 

 

 

 

 

스케줄링 알고리즘


스케줄링은 실행 중인 프로세스가 일시 중단되었을 때, 다음에 CPU를 사용할 프로세스를 선택하는 과정입니다.

 

이는 한정된 CPU 자원을 효율적으로 관리하기 위해 필수적입니다. 입출력 대기 등으로 인해 CPU가 노는 시간 없이 계속 일하게 하여 사용률을 극대화하고, 특정 프로세스가 자원을 독점하지 않도록 공평하게 배분해야 하기 때문입니다.

 

운영체제는 이러한 시스템의 목적에 맞춰 최적의 성능을 끌어내기 위해 다양한 스케줄링 알고리즘을 사용합니다.

스케줄링 알고리즘은 다양하게 존재하지만 크게 두가지 유형이 있습니다.

 

  • 비선점형(Non-preemptive): 프로세스가 스스로 CPU를 반납할 때까지 기다리는 방식입니다. 
    • FCFS (First-Come, First-Served): 먼저 온 순서대로 처리하는 은행 창구 방식입니다. 앞 작업이 길어지면 뒤가 무한정 밀리는 단점이 있습니다.
    • SJF (Shortest Job First): 실행 시간이 가장 짧은 것부터 처리합니다. 효율적이지만, 긴 작업은 영원히 실행되지 못하는 기아 현상이 생길 수 있습니다.
  • 선점형(Preemptive): 운영체제가 우선순위가 높은 프로세스를 위해 현재 실행 중인 CPU를 강제로 뺏을 수 있는 방식입니다. (현대 OS의 주류)
    • Round Robin (RR): 각 프로세스에 동일한 시간 할당량(Time Quantum)을 주고 순서대로 돌아가며 실행합니다. 현대 시분할 시스템의 기초입니다.
    • Priority Scheduling: 우선순위가 높은 프로세스에게 먼저 CPU를 줍니다.
    • SRTF(Shortest Remaining Time First): 현재 실행 중인 프로세스의 남은 시간보다 더 짧은 작업이 도착하면 CPU를 강제로 뺏어 할당합니다. 

 

 

 

 

컨텍스트 스위칭 (Context Switching)


컨텍스트 스위칭은 CPU가 현재 실행 중인 프로세스의 제어권을 다른 프로세스에 넘겨줄 때 일어나는 일련의 과정을 말합니다. 이 과정이 있기에 우리는 하나의 CPU로도 여러 프로그램을 동시에 사용하는 듯한 경험을 할 수 있습니다.

동작 과정

 

컨텍스트 스위칭은 단순히 작업을 바꾸는 것이 아니라, 중단된 시점을 완벽하게 기억하고 복원하는 정교한 단계를 거칩니다.

 

위 다이어그램은 CPU가 컨텍스트 스위칭을 통해 두 프로세스(p0, p1) 사이에서 실행을 번갈아 수행하는 방식을 보여줍니다.

  1. 실행 단계: p0 프로세스가 실행 중이고, p1는 대기 중입니다.
  2. 상태 저장: 현재 실행 중인 프로세스(p0)를 일시중지하고 p0의 레지스터 값, 프로그램 카운터(PC) 등을 해당 프로세스의 PCB(PCB0)에 저장합니다.
  3. 새로운 프로세스 로딩: PCB1에서 p1의 저장된 상태를 가져옵니다.
  4. 실행 단계: 새로 선택된 프로세스(p1)는 실행됩니다. p0은 대기 중입니다.

 

 

 

컨텍스트 스위칭 비용 (Overhead)


컨텍스트 스위칭은 시스템 운영에 필수적이지만, 실제 유저 코드를 실행하는 시간이 아니기 때문에 일종의 낭비되는 시간(Overhead)이기도 합니다.

 

  • PCB 접근 시간: 커널 메모리에 접근하여 프로세스의 신분증인 PCB를 읽고 쓰는 물리적인 시간이 소모됩니다.
  • 캐시 미스(Cache Miss): 가장 큰 비용 중 하나입니다. 프로세스가 바뀌면 CPU 내부의 캐시 메모리가 이전 프로세스의 데이터로 채워져 있어 무용지물이 됩니다. 새로운 프로세스가 다시 캐시를 채우는 동안 성능 저하가 발생합니다.
  • 성능 관계: 스케줄링 주기가 너무 짧아 스위칭이 빈번해지면, CPU가 '실제 작업'보다 '작업 교체'에 더 많은 자원을 쓰는 배보다 배꼽이 더 큰 상황이 벌어집니다.

 

 

 

프로세스 스위칭 vs 스레드 스위칭


  • 프로세스 스위칭: 각 프로세스는 독립적인 가상 메모리 공간을 가집니다. 따라서 스위칭 시 메모리 주소 변환 정보(Page Table)를 통째로 갈아끼워야 하며, 이는 캐시를 완전히 비워야 함을 의미하므로 비용이 매우 큽니다.
  • 스레드 스위칭: 같은 프로세스 내의 스레드들은 Stack 영역을 제외한 나머지 메모리(Code, Data, Heap)를 공유합니다. 따라서 메모리 맵을 바꿀 필요 없이 레지스터와 스택 정보만 교체하면 됩니다.

멀티스레딩 환경이 멀티프로세싱보다 훨씬 가볍고 빠른 이유입니다.

멀티스레딩 환경에선 단일 프로그램 내에서 원활한 멀티태스킹 기능을 제공하지만, 공유 메모리 환경에서는 다소 위험할 수 있습니다. 

 

 

 

 

 

실제 리눅스에서 확인해보기


리눅스 터미널에서 top 명령어를 입력하면 실시간 프로세스 상태를 볼 수 있습니다.

  • R (Running): 실행 중 혹은 실행 대기
  • S (Sleeping): 이벤트 대기 중 (I/O 등)
  • D (Uninterruptible Sleep): 깨울 수 없는 대기 상태
  • Z (Zombie): 프로세스는 종료되었으나 PCB가 아직 정리되지 않은 상태

 

 

 

프로세스 실행 전체 흐름 
1) 프로그램 실행 → 프로세스 생성 (fork/exec)
2) Ready 큐에서 대기
3) 스케줄러에 의한 선택
4) 디스패처에 의한 컨텍스트 스위칭
5) CPU에서 Running
6) CPU 할당 시간 만료 시 다시 Ready로 돌아가거나 작업 완료 후 Exit

 

 

 

 



 

 


학습용으로 작성한 포스팅이므로 오류가 있을 수 있습니다.

잘못된 내용이나 보완이 필요한 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
궁금한 점도 편하게 남겨주세요.

 

 

 

 

출처

- Context Switching in Operating System

https://www.geeksforgeeks.org/operating-systems/context-switch-in-operating-system/

- CPU Scheduling in Operating Systems

https://www.geeksforgeeks.org/operating-systems/cpu-scheduling-in-operating-systems/

- Difference Between Scheduler and Dispatcher

https://www.differencebetween.com/difference-between-scheduler-and-vs-dispatcher/