
현대의 컴퓨터는 여러 개의 프로그램을 동시에 실행할 수 있다. 그러나 이는 단순한 병렬 실행이 아닌, 운영체제가 제공하는 다양한 방식의 실행 전략에 기반한다. 본 글에서는 멀티태스킹과 멀티프로세싱의 개념을 정리하고, 프로세스와 스레드 구조, 컨텍스트 스위칭의 동작 방식과 비용에 대해 서술한다.

음악 재생 프로그램과 문서 작성 프로그램을 동시에 실행하는 상황을 가정하자. 이때 CPU가 하나인 경우, 실제로는 두 프로그램을 동시에 실행하지 못한다. CPU는 한 번에 하나의 작업만 처리할 수 있기 때문이다. 운영체제는 이 제한된 자원을 관리하면서 두 작업을 빠르게 전환하여 실행한다.

운영체제는 약 10ms 단위로 작업을 번갈아 수행한다. 예를 들어, 10ms 동안 프로그램 A를 실행한 뒤, 다음 10ms 동안 프로그램 B를 실행하고, 다시 A로 돌아가는 식이다. 이 과정을 매우 빠르게 반복하기 때문에 사용자는 두 프로그램이 동시에 실행되는 것처럼 인식하게 된다. 이를 시분할(Time Sharing) 방식이라 하며, 하나의 CPU로 여러 작업을 실행하는 방식이다.

CPU가 여러 개의 코어를 가지고 있다면, 각 코어가 서로 다른 작업을 병렬로 처리할 수 있다. 예를 들어, 프로그램 A는 코어 1에서, 프로그램 B는 코어 2에서 동시에 실행된다. 이 방식은 실제로 두 작업이 동시에 실행되므로 병렬 처리라고 한다.
| 구분 | 설명 |
|---|---|
| 멀티태스킹 | 하나의 CPU로 여러 작업을 번갈아 빠르게 실행하는 방식 |
| 시분할 | 짧은 시간 간격으로 작업을 순환하며 실행하는 운영체제 전략 |
| 멀티프로세싱 | 여러 CPU 코어가 실제로 병렬로 실행을 수행하는 방식 |

운영체제는 프로그램을 프로세스라는 단위로 관리한다. 실행 중인 하나의 프로그램은 하나의 프로세스이며, 프로세스는 독립적인 메모리 공간을 가진다. 운영체제는 각 프로세스의 메모리를 엄격히 분리하여 다른 프로세스의 접근을 제한한다. 이는 보안성과 안정성을 보장하기 위함이다.
스레드는 프로세스 내부에서 실제로 작업을 수행하는 최소 실행 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이들 스레드는 메모리 공간을 공유한다. 예를 들어, 힙 영역과 메서드 영역은 모든 스레드가 공유하고, 스택은 각 스레드마다 별도로 할당된다.
CPU는 한 번에 하나의 스레드만 실행할 수 있다. 여러 스레드가 있는 경우, 운영체제의 스케줄러가 어떤 스레드를 언제, 얼마나 실행할지 결정한다. 스케줄러는 다양한 알고리즘을 통해 작업을 분배하고, CPU 자원을 효율적으로 활용한다.
멀티태스킹 환경에서는 스레드 간 전환이 자주 발생한다. 이때 CPU는 이전 스레드의 실행 상태(문맥)를 저장하고, 새 스레드의 문맥을 복원하는 작업을 수행한다. 이 과정을 컨텍스트 스위칭이라 하며, 일정한 시간과 시스템 자원을 소모한다.
컨텍스트 스위칭은 개별 비용은 작지만, 스레드 수가 많아질수록 누적되어 시스템 성능에 영향을 줄 수 있다.
| CPU 코어 수 | 스레드 수 | 설명 |
|---|---|---|
| 4 | 2 | 컨텍스트 스위칭은 적지만 CPU 활용률이 낮다 |
| 4 | 100 | CPU 활용률은 높지만 스위칭 비용이 과도하게 발생할 수 있다 |
웹 서버는 대부분 I/O-바운드 작업이 주를 이룬다. 다음은 잘못된 구성 사례이다.
I/O 중심 환경에서는 CPU 코어 수보다 훨씬 많은 스레드를 구성해야 한다.
멀티태스킹은 시분할을 통해 하나의 CPU로 여러 작업을 실행하는 전략이며, 멀티프로세싱은 실제 병렬 실행을 의미한다. 운영체제는 프로세스와 스레드 단위로 실행을 관리하며, 각 스레드는 스케줄링과 컨텍스트 스위칭을 통해 실행된다. 컨텍스트 스위칭은 시스템 성능에 영향을 줄 수 있으므로, 스레드 수와 CPU 수의 관계를 고려한 전략이 필요하다. 특히 I/O-바운드 작업에서는 스레드를 충분히 확보하여 병렬성을 높이는 것이 중요하다.