본문 바로가기
IT개발/Tech Notes

프로세스와 스레드의 차이, 개발자라면 꼭 알아야 할 CS 기초 개념

by 시간기억자 2025. 4. 23.
반응형

개발자라면 반드시 이해하고 넘어가야 할 개념 중 하나가 바로 ‘프로세스(Process)’‘스레드(Thread)’의 차이다.

운영체제나 멀티태스킹, 병렬 처리 개념을 이해할 때 이 둘은 자주 등장하는 용어이다.


✅ 프로세스란?

프로세스는 실행 중인 하나의 프로그램을 의미한다.
운영체제는 하나의 프로그램이 실행될 때 해당 프로그램을 프로세스 단위로 관리한다.

  • 각 프로세스는 독립적인 메모리 공간을 가진다.
  • 다른 프로세스 간에는 메모리와 자원을 공유하지 않는다.
  • 예: 크롬 브라우저 하나를 실행하면 그 자체가 하나의 프로세스

✅ 스레드란?

스레드는 프로세스 내에서 실행되는 작업 단위다.
하나의 프로세스 내에 여러 개의 스레드가 존재할 수 있으며, 이를 멀티스레드라고 한다.

  • 동일한 프로세스 내에서는 메모리와 자원을 공유한다.
  • 자원을 공유하기 때문에 통신 비용이 적고 빠르다.
  • 하지만 충돌 및 동기화 문제가 발생할 수 있다.
  • 예: 브라우저에서 여러 탭을 동시에 여는 것 = 여러 스레드

🧠 프로세스 vs 스레드 비교


항목 프로세스 스레드
정의 실행 중인 프로그램 프로세스 내 작업 단위
메모리 독립적 공유
안정성 높음 낮음 (충돌 가능성)
속도 느림 (비용 큼) 빠름 (가벼움)
예시 크롬 전체 실행 크롬 내 여러 탭 실행

💡 개발자에게 중요한 이유

프로세스와 스레드의 차이는 운영체제, 네트워크, 동시성 처리 등의 기초가 되는 개념이다.
이해하고 있어야 멀티태스킹, 서버 병렬 처리, 백그라운드 작업 등에서 효율적인 설계가 가능하다.


📚 예제 코드 (Java 기준)

// Thread 예시
public class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 실행 중");
    }

    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();
    }
}

 

📌 코드 설명

  1. 클래스 선언
    • MyThread 클래스는 Thread 클래스를 상속받는다
    • Thread 클래스를 상속받으면, 우리가 원하는 **작업 로직(run 메서드)**을 오버라이딩해서 사용할 수 있다.
  2. run 메서드 오버라이딩
    • run() 메서드는 스레드가 실행될 때 실제로 수행할 작업을 정의한다.
    • 여기서는 단순히 "스레드 실행 중"이라는 문자열을 출력한다.
  3. main 메서드 (프로그램의 시작점)
    • MyThread t1 = new MyThread();
      MyThread 객체를 생성한다.
    • t1.start();
      이 부분이 핵심이다!
      start() 메서드는 내부적으로 새로운 스레드를 생성해서 run() 메서드를 비동기적으로 실행한다
      즉, main 스레드와는 별도로 t1이라는 새로운 스레드가 동작한다.

⚠️ t1.run();이라고 호출하면 스레드가 새로 생성되지 않고, 일반 메서드 호출처럼 동작한다.

반드시 start()를 호출해야 새로운 스레드가 실행된다.


▶️ 동작 방식 요약

  • 자바 프로그램은 기본적으로 main 스레드에서 시작된다.
  • t1.start() 메서드가 호출되면 JVM이 새로운 스레드 스택을 생성하고, 해당 스레드에서 run() 메서드를 실행한다.
  • run() 메서드에서는 "스레드 실행 중"이라는 문자열이 출력된다.

🖨️ 출력 결과 (예상)

스레드 실행 중

단, 스레드는 비동기로 실행되기 때문에 다른 작업보다 먼저 출력되거나 나중에 출력될 수 있다.


📘 추가 설명: 싱글 스레드 vs 멀티 스레드

일반적인 프로그램은 하나의 흐름(싱글 스레드)으로 동작한다.
예를 들어, 함수 A → 함수 B → 함수 C처럼 순차적으로 실행된다.

멀티 스레드는 하나의 프로그램 안에서 여러 흐름이 동시에 실행되는 구조이다.
예를 들어, 스레드 A는 파일 다운로드, 스레드 B는 사용자 인터페이스 처리를 담당할 수 있다.


🧵 스레드 생성 방법

Java에서는 스레드를 생성하는 방법이 대표적으로 두 가지가 있다.

1. Thread 클래스 상속

위의 예제처럼 Thread 클래스를 상속받아 run() 메서드를 오버라이딩하는 방식이다.

2. Runnable 인터페이스 구현

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable 스레드 실행");
    }

    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }
}

Runnable 방식은 클래스 상속을 사용하지 않기 때문에, 다른 클래스를 동시에 상속받을 수 없는 Java의 특성상

더 유연하게 사용할 수 있다.
실무에서는 대부분 Runnable 방식을 선호한다.


🧠 운영체제 관점에서 본 스레드

운영체제에서는 프로세스를 자원 단위, 스레드를 실행 단위로 관리한다.
멀티스레드는 하나의 프로세스 내에서 자원을 공유하며 동시에 여러 작업을 처리할 수 있어 성능 향상에 유리하다.

하지만 자원을 공유하기 때문에 동기화 문제나 데드락(교착 상태) 등의 문제가 발생할 수 있으며,

이를 해결하기 위해 synchronized 키워드나 lock 같은 동기화 기술이 사용된다.

 

반응형

댓글