7편. 멀티태스킹 완전 이해 – 운영체제는 어떻게 동시에 앱을 실행할까?
📚 목차
1. 멀티태스킹이란? - 운영체제가 여러 작업을 동시에 처리하는 방식
2. 멀티태스킹 vs 멀티스레딩 vs 멀티프로세싱 - 동시성 개념 비교
3. 사용자 관점에서 보는 멀티태스킹 - 리소스 분배와 체감 성능
4. 실습으로 체험하는 멀티태스킹 - Python 코드로 이해하기
✔ 마무리 - 멀티태스킹은 성능 최적화의 출발점입니다.
웹 브라우저로 영상을 시청하면서 동시에 메신저로 대화하고, 백그라운드에서는 파일이 클라우드로 백업되는 환경을 자연스럽게 경험합니다. 마치 컴퓨터가 한 번에 여러 가지 작업을 동시에 수행하는 것처럼 보이죠.
하지만 그 이면에는 운영체제의 정교한 멀티태스킹(Multitasking) 기술이 숨어 있습니다.
CPU는 한 번에 하나의 작업만 처리할 수 있는데, 어떻게 우리는 ‘동시에’ 앱을 사용하는 것처럼 느낄 수 있을까요?
이 글에서는 멀티태스킹의 개념부터 멀티스레딩, 멀티프로세싱과의 차이, 그리고 실제 코드 실습을 통해 그 원리를 하나씩 파헤쳐봅니다.
1. 멀티태스킹이란? – 운영체제가 여러 작업을 동시에 처리하는 방식
멀티태스킹(Multitasking)은 하나의 운영체제가 여러 개의 프로그램(프로세스)을 동시에 실행되는 것처럼 관리하는 기능입니다.
실제로는 CPU가 한 번에 하나의 작업만 처리할 수 있지만, 운영체제는 매우 짧은 시간 간격으로 여러 작업을 빠르게 전환해 실행함으로써, 사용자에게는 마치 모든 프로그램이 동시에 작동하는 것처럼 보이게 합니다.
이러한 방식은 시간 분할(Time Sharing)이라는 기법에 기반합니다. 운영체제는 CPU의 시간을 일정 단위로 나누어 각 프로세스에 번갈아 할당하고, 문맥 교환(Context Switching)을 통해 실행 중인 프로세스를 빠르게 전환합니다.
📌 예시
유튜브 영상을 보며 워드 문서를 작성하고, 동시에 백그라운드에서는 클라우드 동기화 앱이 파일을 업로드하는 상황은 각각 독립된 프로세스입니다.
이들을 운영체제가 빠르게 전환하며 실행시키기 때문에 사용자는 ‘동시에’ 실행된다고 느끼게 됩니다.
시간 분할 실행 구조 예시
┌────┬────┬────┬────┬────┐
│ A │ B │ C │ A │ B │ ...
└────┴────┴────┴────┴────┘
각 블록은 짧은 시간 단위의 CPU 실행 시간을 의미하며, 운영체제가 이 순서를 반복합니다.
2. 멀티태스킹 vs 멀티스레딩 vs 멀티프로세싱 – 동시성 개념 비교
멀티태스킹(Multitasking)을 정확히 이해하려면, 함께 자주 언급되는 멀티스레딩(Multithreading)과 멀티프로세싱(Multiprocessing) 개념과 비교해서 살펴보는 것이 매우 효과적입니다.
이 세 가지는 모두 동시성(Concurrency) 또는 병렬성(Parallelism)과 관련된 개념이지만, 처리 단위와 실행 방식, 구조에서 분명한 차이가 있습니다.
🔷 멀티태스킹 (Multitasking)
▸ 처리 단위: 여러 개의 프로세스
▸ 실행 방식: 하나의 CPU가 여러 프로세스를 시간 단위로 번갈아가며 처리
▸ 메모리: 프로세스마다 독립된 메모리 공간 사용
▸ 예시: 음악 앱, 웹 브라우저, 파일 탐색기 동시 실행
운영체제가 짧은 시간 간격으로 각 프로세스를 빠르게 전환하기 때문에, 사용자 입장에서는 모든 앱이 동시에 동작하는 것처럼 느껴집니다.
🔷 멀티스레딩 (Multithreading)
▸ 처리 단위: 하나의 프로세스 내 여러 스레드
▸ 실행 방식: 동일한 메모리 공간을 공유하며 동시에 실행
▸ 특징: 빠른 전환이 가능하지만, 자원 공유에 따른 동기화 문제가 발생할 수 있음
▸ 예시: 웹 브라우저 탭, 게임의 물리 엔진 + 렌더링 엔진
하나의 작업을 여러 스레드로 나누어 처리하면 성능이 향상되지만, 스레드 간 충돌을 방지하기 위한 정교한 설계가 필요합니다.
🔷 멀티프로세싱 (Multiprocessing)
▸ 처리 단위: 여러 개의 CPU 코어 + 프로세스
▸ 실행 방식: 각 CPU 코어가 서로 다른 프로세스를 물리적으로 동시에 실행
▸ 특징: 진정한 병렬 처리가 가능하지만, CPU 자원과 전력 소비가 증가함
▸ 예시: 4 코어 CPU에서 각 코어가 브라우저, 음악 앱, 영상 편집기 등을 병렬 실행
멀티코어 환경에서 프로세스를 나눠 실행하면, 성능이 크게 향상되며 병렬 컴퓨팅에 최적화됩니다.

구조 비교 요약
Multitasking : [프로세스 A] [프로세스 B] [C] - 시간 전환
Multithreading : [프로세스 A] → [스레드1 | 스레드2] - 병렬 흐름
Multiprocessing : [CPU1: 프로세스 A], [CPU2: 프로세스 B] - 병렬 실행
🔸멀티태스킹은 하나의 CPU가 여러 프로세스를 짧은 시간 간격으로 번갈아 실행하여, 사용자에게 동시에 작동하는 것처럼 보이게 하는 방식입니다.
🔸멀티스레딩은 하나의 프로세스 내부에서 여러 스레드가 병렬로 작업을 수행하는 구조로, 자원을 공유하면서 빠르게 처리할 수 있습니다.
🔸멀티프로세싱은 두 개 이상의 CPU 코어가 각각의 프로세스를 물리적으로 동시에 실행하여 진정한 병렬 처리를 가능하게 합니다.
3. 사용자 관점에서 보는 멀티태스킹 – 리소스 분배와 체감 성능
운영체제의 멀티태스킹 덕분에 우리는 여러 개의 앱을 동시에 사용하는 것이 너무도 당연하게 느껴집니다. 하지만 실제로는 각 프로세스가 CPU, 메모리, 디스크, 네트워크 자원을 서로 나눠 쓰며 협력하거나 충돌하기도 합니다.
시스템 자원이 충분할 때는 자연스럽게 동작하지만, 부족해지는 순간 앱의 반응 속도가 느려지거나 멈추는 현상이 발생합니다.
🔷 Ubuntu 예시
Ubuntu Desktop에서는 다음과 같이 여러 앱을 동시에 실행하면서 멀티태스킹 환경을 관찰할 수 있습니다:
# 예시 명령어
firefox & # 웹 브라우저 실행
gedit & # 텍스트 편집기 실행
terminal & # 터미널 실행
htop # 시스템 리소스 실시간 관찰
▸ & 기호를 붙이면 앱이 백그라운드에서 실행되어 터미널이 블로킹되지 않습니다.
▸ htop 명령어를 통해 현재 실행 중인 각 프로세스의 CPU 사용량, 메모리 점유율 등을 실시간으로 시각적으로 확인할 수 있습니다.
▸ 각각의 앱은 고유한 PID(Process ID)를 가지고 독립적으로 실행되며, 운영체제는 이들 프로세스에 적절히 리소스를 분배합니다.
🔷 Windows 예시
Windows에서도 멀티태스킹 환경은 일상적입니다. 다음과 같은 실험으로 시스템 상태를 확인해 볼 수 있습니다:
1. 웹 브라우저, 문서 편집기(Word), 음악 앱, 백업 프로그램 등을 동시에 실행
2. Ctrl + Shift + Esc를 눌러 작업 관리자(Task Manager) 실행
3. '프로세스' 탭에서 각 앱의 CPU, 메모리, 디스크 사용량 확인
4. 리소스가 부족해질 경우 앱 전환이 느려지거나 입력 반응이 지연됨

4. 실습으로 체험하는 멀티태스킹 – Python 코드로 이해하기
운영체제가 멀티태스킹을 어떻게 구현하는지 제대로 이해하려면, 직접 코드를 실행해보는 것이 가장 빠른 방법입니다.
Python을 통해 동시에 두 가지 작업을 처리하는 방식을 직접 비교해보며, 멀티태스킹, 멀티스레딩, 멀티프로세싱의 차이를 실습해 봅시다.
🔷 1. 순차 실행 (싱글태스킹)
우선 가장 단순한 방식부터 시작합니다. 하나의 작업이 끝나야 다음 작업이 시작되는 구조입니다.
import time
def task_a():
for _ in range(5):
print("Task A")
time.sleep(1)
def task_b():
for _ in range(5):
print("Task B")
time.sleep(1)
# 순차 실행
task_a()
task_b()
▸ 총 소요 시간: 약 10초 (5초 + 5초)
▸ 이 방식은 하나의 CPU가 한 번에 하나의 작업만 처리할 수 있을 때의 구조와 유사합니다.
▸ 실제 CPU는 매우 빠르게 작업을 전환하지만, 위 코드는 시간 분할 없이 순차 처리되므로 병렬성은 전혀 없습니다.
🔷 2. 멀티스레딩 (하나의 프로세스 내에서 동시에 실행)
이번에는 Python의 threading 모듈을 사용해 두 개의 작업을 동시에 수행해 봅니다.
import threading
import time
def task_a():
for _ in range(5):
print("Task A")
time.sleep(1)
def task_b():
for _ in range(5):
print("Task B")
time.sleep(1)
# 스레드 생성
t1 = threading.Thread(target=task_a)
t2 = threading.Thread(target=task_b)
# 병렬 실행
t1.start()
t2.start()
# 메인 스레드가 기다림
t1.join()
t2.join()
▸ 총 소요 시간: 약 5초
▸ 두 스레드가 같은 프로세스 내에서 병렬로 실행되기 때문에, 작업이 겹쳐서 실행됩니다.
▸ 즉, Task A와 Task B가 1초 간격으로 번갈아가며 실행되는 모습을 볼 수 있습니다.
📌 주의사항
Python 인터프리터(CPython)에서는 GIL(Global Interpreter Lock)이라는 제한 때문에, 멀티스레딩이 CPU 연산이 많은 작업에서는 제대로 병렬화되지 않습니다.
하지만 I/O 작업(예: 다운로드, 파일 읽기, 네트워크 통신 등)에는 매우 효과적입니다.
🔷 3. 멀티프로세싱 (독립 프로세스로 병렬 실행)
이번에는 multiprocessing 모듈을 사용하여 아예 두 개의 독립된 프로세스를 만들어 실행해 봅니다.
import multiprocessing
import time
def task_a():
for _ in range(5):
print("Task A")
time.sleep(1)
def task_b():
for _ in range(5):
print("Task B")
time.sleep(1)
if __name__ == "__main__":
# 프로세스 생성
p1 = multiprocessing.Process(target=task_a)
p2 = multiprocessing.Process(target=task_b)
# 병렬 실행
p1.start()
p2.start()
# 메인 프로세스가 기다림
p1.join()
p2.join()
▸ 총 소요 시간: 약 5초
▸ 이 방식은 각각의 작업을 별도 프로세스에서 실행하므로, Python의 GIL 영향을 받지 않고 진짜 병렬 처리가 가능합니다.
▸ 특히 CPU 연산이 많은 작업을 동시에 수행해야 할 때는 멀티프로세싱이 훨씬 더 효율적입니다.
실행 흐름 비교
순차 실행: A A A A A → B B B B B
스레딩 실행: A B A B A B A B A B
프로세싱: A A A A A + B B B B B (병렬)
운영체제의 멀티태스킹 기능은 단순히 여러 작업을 동시에 실행하는 것이 아니라, 시간을 쪼개거나 코어를 나누어 자원을 효율적으로 분배하는 정교한 전략입니다.
✔ 마무리 - 멀티태스킹은 성능 최적화의 출발점입니다
멀티태스킹은 단순히 여러 앱을 ‘동시에 실행한다’는 사용자 체감 기능을 넘어서, 운영체제가 한정된 자원을 효율적으로 배분하고 조율하는 핵심 전략입니다.
실무 환경에서는 다음과 같은 복합 상황이 빈번하게 발생합니다:
🔸 백그라운드에서 로그를 저장하면서,
🔸 동시에 사용자 요청을 처리하고,
🔸 외부 API와 통신하며,
🔸 UI 이벤트까지 실시간으로 반응해야 하는 상황.
이러한 흐름을 안정적으로 처리하려면, 멀티태스킹의 구조와 제약, 그리고 프로세스/스레드의 차이를 이해하는 것이 필수입니다.
📌 개발자 관점에서 멀티태스킹을 이해하면 가능한 일들
🔸 병목 현상 원인 파악: CPU, 메모리, I/O 중 어느 지점에서 지연이 발생하는지 빠르게 분석
🔸 스레드 안전성 고려한 설계: 동시성 문제를 예측하고 적절한 동기화 기법 설계
🔸 멀티코어 활용 최적화: 병렬 처리가 필요한 연산을 적절히 분산 설계하여 성능 극대화
🔸 백그라운드 작업 구조화: 사용자 인터페이스의 응답성과 안정성을 동시에 확보
🔸 데이터 동기화 및 리소스 충돌 방지: race condition, deadlock과 같은 문제 예방
멀티태스킹은 이론적 개념을 넘어, 성능 최적화와 안정적인 시스템 설계의 출발점입니다.
운영체제의 내부 구조를 이해하는 개발자는 단순히 코드를 작성하는 수준을 넘어, 복잡한 흐름 속에서도 성능과 품질을 조율할 수 있는 역량을 갖추게 됩니다.
※ 게시된 글 및 이미지 중 일부는 AI 도구의 도움을 받아 생성되거나 다듬어졌습니다.
'1.시스템&인프라 > 개발 입문자를 위한 운영체제' 카테고리의 다른 글
| 9편. CPU 스케줄링 성능 지표 - 성능은 어떻게 비교할까? (0) | 2025.11.20 |
|---|---|
| 8편. CPU 스케줄링 알고리즘 완전 정복 – 공정성, 속도, 우선순위의 비밀 (0) | 2025.11.17 |
| 6편. 데드락(Deadlock)이란? – 프로그램이 멈추는 진짜 이유와 해결 전략 (0) | 2025.11.17 |
| 5편. 프로세스 동기화 완전 정복 – 경쟁 조건과 뮤텍스, 세마포어, 모니터 (0) | 2025.11.14 |
| 4편. 스레드란 무엇인가? – 하나의 프로세스에서 동시에 여러 일을 처리하는 원리 (0) | 2025.11.14 |