운영체제

[운영체제] 동시성 vs 병렬성

위시리 2025. 2. 7. 17:07

프로세스 & 스레드 / 동시성 & 병렬성

컴퓨터를 사용하다보면 유튜브를 보면서 워드 작업을 하면서 크롬으로 검색을 할 수 있다. 어떻게 컴퓨터는 이렇게 여러 가지 작업을 동시에 실행할 수 있는걸까? 

컴퓨터는 여러 작업을 동시에 실행하기 위해 동시성(Concurrency)병렬성(Parallelism) 개념을 활용하고 이를 구현하는 주요 방법은 프로세스(Process)스레드(Thread) 를 사용하는 것이다. 운영체제(OS)는 CPU 스케줄링과 메모리 관리를 통해 이 과정을 조율한다.

동시성과 병렬성이 어떻게 이루어지는지 이해하려면 프로세스와 스레드의 차이를 먼저 알아야한다.
(추후 분리하여 정리 예정)

 

1️⃣ 프로세스와 스레드

✅  프로세스(Process)

  • 운영체제에서 실행 중인 하나의 프로그램 단위
  • 운영체제에서 각 프로세스를 독립적인 단위로 관리하여 실행된다.
    • 독립적인 단위 → 독립적인 메모리 공간(Code, Data, Heap, Stack)을 가진다.
  • 멀티프로세스(Multiprocessing) 를 사용하면 여러 프로세스를 병렬로 실행 가능하다.
  • 프로세스 간 통신(IPC, Inter-Process Communication)이 필요하므로 비용이 크다.

🔹 Ex

  • 크롬 브라우저의 각 탭은 독립적인 프로세스로 실행됨 → 하나의 탭이 멈춰도 다른 탭에는 영향 없다.

 

✅  스레드(Thread)

  • 스레드는 프로세스 내부에서 실행되는 작은 실행 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 이 스레드들은 같은 메모리 공간을 공유하면서 실행된다.
  • 멀티스레딩(Multithreading) 을 사용하면 하나의 프로세스 내에서 여러 작업을 동시 실행 가능하다.
  • 스레드 간 동기화 문제(데드락, 레이스 컨디션) 가 발생할 수 있다.

🔹 Ex

  • 게임에서 그래픽 렌더링 스레드와 물리 연산 스레드가 동시에 실행
  • 웹 서버(Spring Boot, Node.js)에서 여러 요청을 처리하는 멀티스레딩 방식

 

프로세스와 스레드의 차이 정리

정의 실행 중인 프로그램 프로세스 내에서 실행되는 작업 단위
독립성 각 프로세스는 독립적인 메모리 공간을 가짐 같은 프로세스 내에서 메모리를 공유
통신 방식 IPC(Inter-Process Communication) 필요 같은 프로세스 내에서는 공유 메모리 사용
문맥 전환 비용 높음 (각 프로세스는 개별적인 메모리 공간을 가짐) 낮음 (스레드는 같은 메모리를 사용하기 때문에 빠름)
병렬 실행 다중 CPU(Core)를 활용해 병렬 실행 가능 멀티스레딩을 사용해 동시성(Concurrency) 구현 가능

 

 

2️⃣  동시성 vs 병렬성

✅  동시성(Concurrency)

🔹 동시성의 원리

  • 여러 작업(Task)이 겉으로 보기에는 동시에 실행되는 것처럼 보이는 개념
  • 하지만 실제로는 하나의 CPU 코어에서 작업들이 빠르게 번갈아가며 실행되는 중이다.
  • 시간을 쪼개어 실행됨 → 논리적으로 동시에 실행되는 것처럼 보인다.
  • CPU가 하나인 경우에도 빠른 문맥 교환(Context Switching) 을 통해 여러 작업을 수행하는 것처럼 동작한다.
  • 주요 기법: 멀티태스킹(Multitasking), 비동기 프로그래밍(Async/Await), 코루틴(Coroutine)

🔹 독립적인 프로세스

  • 각 프로세스는 독립된 메모리 공간을 가지므로 하나의 프로세스가 죽어도 다른 프로세스에 영향을 주지 않는다.
  • 예를 들어, 크롬 브라우저에서 여러 개의 탭을 각각 다른 프로세스로 실행하여, 하나의 탭이 크래시 나도 다른 탭이 영향을 받지 않는다.

🔹 스레드는 독립적이지 않음 !

  • 같은 프로세스 내에서 실행되므로, 공유 메모리를 사용한다.
  • 하나의 스레드가 오류로 인해 충돌하면, 같은 프로세스 내의 다른 스레드도 영향을 받을 수 있다.
  • 예를 들어, 게임이 하나의 프로세스에서 실행될 때, 그래픽 렌더링 스레드가 크래시 나면 게임 전체가 다운될 수 있다.

📌 정리하면

  • 프로세스는 독립적인 실행 단위라서 하나가 죽어도 다른 프로세스에 영향 x
  • 스레드는 공유 메모리를 사용하므로 하나의 스레드 문제가 전체 프로세스에 영향을 줄 수 o

🔹 Ex

  • 웹 서버가 여러 클라이언트 요청을 처리할 때, 하나의 요청이 DB 조회를 기다리는 동안 다른 요청을 먼저 처리하는 방식

 

✅  병렬성(Parallelism)

🔹 병렬성의 원리

  • 여러 작업(Task)이 실제로 동시에 실행되는 것 (실제로 동시에 실행)
  • 다중 코어 CPU 또는 다중 프로세서 시스템에서 각 코어가 독립적으로 작업을 수행한다.
  • 여러 개의 프로세서가 각각 다른 작업을 동시에 수행
  • 주요 기법: 멀티프로세싱(Multiprocessing), GPU 병렬 연산, 쓰레드 병렬 처리

🔹 프로세스 기반 병렬성

  • 여러 개의 프로세스가 독립적으로 실행되고 각 프로세스는 서로 다른 CPU 코어에서 병렬로 실행될 수 있다.
  • 서로 독립적인 메모리 공간을 가지므로 병렬 실행이 쉽지만, 통신 비용(IPC)이 큼.
  • 예제: 웹 브라우저와 동영상 플레이어가 각각 실행되는 경우.

🔹 스레드 기반 병렬성

  • 하나의 프로세스 내부에서 여러 스레드가 같은 메모리를 공유하면서 병렬로 실행됨.
  • 스레드 간의 전환 비용은 적지만, 동기화 문제(경쟁 상태, 데드락 등)가 발생할 수 있음.
  • 예제: 게임에서 그래픽 렌더링, 물리 연산, AI 연산이 각 스레드에서 동시에 실행됨

📌 정리하면

  • 프로세스는 독립적인 실행 단위라서 하나가 죽어도 다른 프로세스에 영향이 없음.
  • 스레드는 공유 메모리를 사용하므로 하나의 스레드 문제가 전체 프로세스에 영향을 줄 수 있음.

🔹 Ex

  • AI 모델 학습 시 GPU에서 여러 행렬 연산을 동시에 수행
  • 멀티코어 CPU가 여러 개의 스레드를 동시에 실행

 

🚀 병렬성과 독립성은 트레이드오프 관계에 있기 때문에, 상황에 따라 적절한 선택을 해야한다!

  • 독립성이 중요한 경우 → 프로세스 사용
    • 독립적인 실행이 필요할 때(예: 크롬 브라우저 탭)
  • 빠른 병렬 실행이 필요한 경우 → 스레드 사용
    • 공유 데이터를 빠르게 처리할 때(예: 게임, 웹 서버)