본문 바로가기
이직&취업/Java 기초 상식

스레드(Thread)와 프로세스(Process) 완벽 비교

by journeylabs 2025. 4. 14.
728x90
반응형

목차

     

    운영체제와 프로그래밍을 공부하다 보면 스레드(Thread) 프로세스(Process)라는 용어를 자주 마주칩니다. 이 둘은 프로그램 실행의 핵심 단위지만, 역할과 동작 방식에서 뚜렷한 차이를 보입니다. 이 글에서는 스레드와 프로세스의 주요 개념, 특징, 차이점, 원리, 그리고 주의사항까지 초보자도 쉽게 이해할 수 있도록 상세히 설명합니다. 멀티태스킹과 성능 최적화에 관심이 있다면, 지금 바로 읽어보세요!

    1. 스레드(Thread)와 프로세스(Process)의 주요 개념 및 특징

    1.1 프로세스(Process)란?

    프로세스는 운영체제에서 실행 중인 프로그램을 의미합니다. 즉, CPU와 메모리를 할당받아 독립적으로 동작하는 실행 단위입니다. 독립적인 메모리 공간(Heap, Stack, Code 등)을 갖는 단위

     

    주요 용어:

    • PCB(Process Control Block): 프로세스 상태, ID, 메모리 정보 등을 저장
    • 메모리 영역: 코드, 데이터, 힙, 스택으로 나뉨
    • 상태: 생성, 준비, 실행, 대기, 종료

    특징:

    • 하나의 프로세스는 최소 1개의 스레드를 포함
    • 독립적인 메모리 공간을 가짐
    • 서로 다른 프로세스는 메모리 공유 ❌  프로세스 간 통신(IPC, Inter-Process Communication)이 필요
    • 자원 소모가 큼(메모리, CPU 등)
    • 운영체제에 의해 관리됨 ( 운영체제에서 자원을 할당받는 단위 )

    예: 메모장에서 파일을 여는 행위 = 새로운 프로세스 실행

    1.2 스레드(Thread)란?

    스레드는 프로세스 내에서 실행되는 작업 단위로, 프로세스의 자원을 공유하며 동작합니다. "경량 프로세스(Lightweight Process)"라고도 불립니다.

     

    주요 용어:

    • 스레드 ID: 스레드를 식별하는 고유 값
    • 스택: 각 스레드마다 독립적인 호출 스택을 가짐
    • 공유 자원: 코드, 데이터, 힙은 스레드 간 공유

    특징:

    • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
    • 동일한 프로세스 내에서 자원( 메모리(Heap) 등)을 공유
    • 빠른 생성과 컨텍스트 스위칭
    • 멀티스레딩으로 병렬 작업 가능
    • 스레드 간 동기화 필요
    • CPU 사용 측면에서 효율적, 응답성 향상
    •  

    예: 웹 브라우저에서 탭을 여럿 띄우면 각각 스레드로 처리 가능

    1.3 스레드와 프로세스의 차이점

    구분 프로세스 스레드
    정의 실행 중인 프로그램 프로세스 내 실행 단위
    자원 독립적인 메모리 공간 프로세스의 자원을 공유
    생성 비용 높음 (메모리 할당 등 필요) 낮음 (스택만 생성)
    통신 IPC 필요 (파이프, 소켓 등) 메모리 공유로 직접 통신 가능
    예시 브라우저, 워드프로세서 브라우저 탭, 파일 다운로드

    2. 스레드와 프로세스의 원리 및 구조

    2.1 프로세스의 구조와 동작 원리

    프로세스는 운영체제로부터 독립적인 메모리 공간을 할당받습니다. 이 메모리는 네 가지 주요 영역으로 나뉩니다:

    • 코드 영역: 실행할 프로그램 코드
    • 데이터 영역: 전역 변수, 정적 변수
    • 힙 영역: 동적 메모리 할당
    • 스택 영역: 함수 호출 및 지역 변수

    예시 1 : 

    사용자가 워드와 크롬을 동시에 실행
    → 워드 = 하나의 프로세스
    → 크롬 = 또 다른 프로세스
    → 서로의 메모리에 접근할 수 없음

     

    예시 2: 프로세스 실행 흐름 운영체제가 프로그램을 실행하면, 프로세스가 생성되고 PCB에 상태가 기록됩니다. 예를 들어, 웹 브라우저를 실행하면 하나의 프로세스가 생성되고, CPU 스케줄링에 따라 실행됩니다.

    public class ProcessExample {
        public static void main(String[] args) {
            System.out.println("Process ID: " + ProcessHandle.current().pid());
            // 독립적인 프로세스로 실행됨
        }
    }

     

    동작 원리:

    1. 운영체제가 프로세스를 생성하고 메모리를 할당.
    2. CPU가 프로세스를 실행하며 상태를 관리(준비 → 실행 → 종료).
    3. 다른 프로세스와 독립적으로 동작하며, 통신은 IPC를 통해 이루어짐.

    2.2 스레드의 구조와 동작 원리

    스레드는 프로세스 내에서 실행되며, 코드, 데이터, 힙은 공유하지만 각 스레드는 독립적인 스택을 가집니다. 이를 통해 병렬 작업이 가능해집니다.

     

    Java로 구현한 멀티스레드 예시:

    public class ThreadExample {
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    System.out.println("Thread 1: " + i);
                }
            });
    
            Thread thread2 = new Thread(() -> {
                for (int i = 0; i < 5; i++) {
                    System.out.println("Thread 2: " + i);
                }
            });
    
            thread1.start();
            thread2.start();
        }
    }

     

    동작 원리:

    1. 프로세스 내에서 스레드가 생성되고, 공유 자원을 활용.
    2. 각 스레드는 독립적인 스택으로 호출 흐름을 관리.
    3. 스레드 간 자원 공유로 빠른 통신 가능, 하지만 동기화(Synchronized) 필요.

    예시 1: 웹 브라우저에서 HTML 렌더링(스레드 1)과 파일 다운로드(스레드 2)가 동시에 실행되며, 동일한 프로세스의 메모리를 공유합니다.

     

    예시 2:

    크롬에서 여러 탭을 열어 유튜브, 구글, 메일을 동시에 실행
    → 하나의 크롬 프로세스 내부에서 각각 스레드로 동작
    → 리소스 공유 + 병렬 실행 가능


    3. 주의사항: 스레드와 프로세스의 장점과 단점

    3.1 프로세스의 장점과 단점

    장점:

    • 독립적인 메모리로 안정성 높음(하나가 종료돼도 다른 프로세스에 영향 없음)
    • 보안성 우수(프로세스 간 데이터 접근 제한)
    • 멀티태스킹 환경에서 적합

    단점:

    • 생성 및 종료 비용이 큼(메모리 할당/해제)
    • 프로세스 간 통신(IPC)이 복잡하고 느림
    • 자원 소모가 많음

    주의사항:

    • 메모리 부족 시 프로세스 생성에 실패할 수 있으니 자원 사용량을 모니터링하세요.
    • IPC 설계 시 성능 병목을 방지하려면 효율적인 통신 방법을 선택해야 합니다.
    • 프로세스는 리소스가 무거워 너무 많이 생성하면 오버헤드 증가

    3.2 스레드의 장점과 단점

    장점:

    • 자원 공유로 생성 및 컨텍스트 스위칭이 빠름
    • 병렬 처리로 CPU 활용도 향상
    • 동일 프로세스 내에서 데이터 접근이 쉬움

    단점:

    • 동기화 문제 발생 가능(데드락, 경쟁 조건)
    • 하나의 스레드 오류가 전체 프로세스에 영향을 줄 수 있음
    • 디버깅과 관리가 복잡

    주의사항:

    • 멀티스레딩 사용 시 synchronized 블록이나 Lock을 활용해 동기화를 관리하세요.
    • 스레드 풀(Thread Pool)을 사용해 스레드 생성 오버헤드를 줄이는 것이 좋습니다.
    • 스레드는 메모리를 공유하므로 공유 자원 접근 시 동기화 필요 (synchronized, ReentrantLock)
    항목 프로세스 스레드
    메모리 분리 ✅ 완전 분리 ❌ 공유
    통신 속도 느림 (IPC 필요) 빠름 (공유 메모리)
    오류 영향 다른 프로세스에 영향 없음 한 스레드 오류 시 전체 프로세스 위험
    생성 비용 높음 (무거움) 낮음 (가벼움)
    동기화 문제 거의 없음 주의 필요 (Race Condition 등)
    사용 용도 독립적인 작업 동시성 작업, 병렬 처리

    4. 결론

    프로세스와 스레드는 프로그램 실행의 기본 단위로, 각각의 특성에 따라 적합한 상황이 다릅니다. 프로세스는 독립성과 안정성이 필요한 경우(예: 서로 다른 애플리케이션 실행)에 적합하며, 스레드는 자원 효율성과 병렬 처리가 중요한 경우(예: 단일 애플리케이션 내 작업 분할)에 유리합니다. 운영체제와 프로그래밍 환경에서 이 둘의 차이를 이해하고, 프로젝트 요구사항에 맞게 활용하면 성능과 안정성을 모두 잡을 수 있습니다. 실무와 학습에서 이 개념을 적용해 보고, 멀티태스킹의 세계를 탐험해 보세요!

     

    자바, Spring, Android 등에서 스레드 활용은 거의 필수 수준입니다.
    예를 들어, Spring에서는 @Async를 통해 비동기 스레드를 쉽게 실행할 수 있습니다.

     

     

    728x90
    반응형