[Java] 스레드와 프로세스 이해하기

@Joy Lee · February 05, 2025 · 8 min read

1. 프로세스와 스레드 개념

프로세스란?

컴퓨터에서 실행 중인 프로그램을 말하며 실행 중인 프로그램에 대해 독립적으로 메모리와 자원을 할당한다.

  • 각 프로세스는 독립된 메모리 영역(코드, 데이터, 스택 등)을 가진다
  • 다른 프로세스와는 독립적으로 작동하며 서로 간섭하지 않는다
  • 운영체제는 여러 프로세스를 동시에 실행하여 멀티태스킹 환경을 제공한다

프로세스를 알아야 하는 이유

  • 컴퓨터 자원의 효율적인 관리와 운영체제의 동작 원리를 이해하기 위해.
  • 멀티태스킹 환경에서 프로세스 간의 상호작용과 자원 분배를 최적화하기 위해.

스레드란?

프로세스 내에서 실행되는 작업의 흐름 단위를 말하며 하나의 프로세스는 여러 스레드를 생성할 수 있다.

  • 같은 프로세스 내의 스레드들은 공유 메모리를 사용하여 작업을 수행한다
  • 가벼운 실행 단위로 생성 및 전환 비용이 비교적 적다
  • 여러 스레드가 동시에 실행될 때 멀티태스킹 효과를 제공한다

스레드를 알아야 하는 이유

  • 동시성과 병렬성을 통해 프로그램의 실행 효율을 극대화하기 위해.
  • 자원을 최적화하고 반응성을 높이며 작업 처리 속도를 향상시키기 위해.

2. 동시성과 병렬성

동시성(Concurrency)

하나의 프로세서(CPU)가 여러 작업을 번갈아가며 실행하는 방식이다.

  • 컨텍스트 스위칭(Context Switching)을 통해 작업을 빠르게 전환할 수 있다.
  • 실제로는 한 번에 하나의 작업만 실행되지만 매우 빠르게 진행되어 동시에 실행되는 것처럼 보인다.

병렬성(Parallelism)

멀티코어 프로세서를 활용하여 여러 작업을 각각의 코어에서 동시에 실행하는 방식이다.

  • 물리적으로 여러 코어에서 작업을 나누어 수행한다.
  • 실제로 여러 작업이 동시에 실행된다.

차이점

구분 동시성 병렬성
설명 하나의 프로세서가 여러 작업을 번갈아가며 실행 여러 프로세서(코어)가 각각 작업을 동시에 실행
예시 한 사람이 전화와 메모를 번갈아가며 수행 여러 사람이 각자 전화와 메모를 동시에 수행
장점 단일 프로세서에서도 다중 작업 처리가 가능 작업 처리 속도가 빠르고, 대규모 작업에 적합

3. 프로세스와 스레드의 차이점

구분 프로세스(Process) 스레드(Thread)
정의 독립적으로 실행되는 프로그램 단위 프로세스 내에서 실행되는 작업의 흐름 단위
메모리 구조 각 프로세스는 독립적인 메모리 공간
(Code, Data, Heap, Stack)을 가짐
프로세스 내의 메모리를 공유
(Code, Data, Heap 공유, Stack은 독립적)
생성 비용 생성 및 종료에 높은 비용 (운영체제의 도움 필요) 생성 및 전환 비용이 낮음
안정성 프로세스 간의 충돌이 없음 하나의 스레드가 잘못되면 프로세스 전체에 영향을 줄 수 있음
예시 크롬 브라우저, 메모장 등 독립적인 프로그램 크롬 브라우저 내에서 실행되는 탭, 다운로드 등

4. 프로세스의 메모리 구조

  1. Code : 프로그램 실행에 필요한 명령어가 저장되는 메모리 영역. 읽기 전용으로 보호된다.
  2. Data : 전역 변수와 static 변수가 저장되는 메모리 영역. 프로그램 시작 시 할당되고 종료 시 해제된다.
  3. Heap : 객체와 배열 같은 동적 메모리가 저장되는 메모리 영역. 가비지 컬렉션에 의해 관리된다.
  4. Stack : 지역 변수, 매개변수, 반환값 등이 저장되는 메모리 영역. 함수 호출 시마다 새로운 스택 프레임이 생성되고 함수가 종료되면 해제된다.

5. 자바에서 스레드의 필요성

현대 프로그램은 한 번에 단 하나의 작업만 처리하는 방식으로는 사용자 요구를 충족할 수 없다. 특히 사용자 경험(UX)을 높이기 위해 여러 작업이 동시에 수행되는 멀티태스킹이 필수적이다.

예시) Youtube

유튜브와 같은 애플리케이션에서는 다음과 같은 작업들이 동시에 이루어진다

  • 영상 재생 / 자막 표시 / Seek Bar 조정 / 진행 시간 업데이트 등..

이 모든 작업이 하나의 스레드에서 처리된다면 각 작업의 실행 시간이 길어져 프로그램이 느려지고 사용자 반응성이 떨어질 것이다. 이를 해결하기 위해 각 작업을 별도의 스레드에서 실행하여 프로그램의 반응성과 효율성을 높일 수 있다.

사용 예시 코드

YouTubeApp 이라는 하나의 프로세스 안에서 VideoPlayer , Subtitle 스레드가 동시에 진행된다.

public class YouTubeApp {
  // 영상 재생 작업
  static class VideoPlayer extends Thread {
      @Override
      public void run() {
          for (int i = 1; i <= 5; i++) {
              System.out.println("영상 재생 중... 프레임 " + i);
              try {
                  Thread.sleep(500); // 0.5초마다 실행
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
  }

  // 자막 표시 작업
  static class Subtitle extends Thread {
      @Override
      public void run() {
          String[] subtitles = {"안녕하세요", "오늘은 스레드에 대해 알아보겠습니다"};
          for (String subtitle : subtitles) {
              System.out.println("자막: " + subtitle);
              try {
                  Thread.sleep(1000); // 1초마다 실행
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
  }

  public static void main(String[] args) {
      // 스레드 생성
      Thread videoThread = new VideoPlayer();
      Thread subtitleThread = new Subtitle();

      // 스레드 시작
      videoThread.start();
      subtitleThread.start();
  }
}
Joy Lee
FRONTEND DEVELOPER