개발자라면 반드시 이해하고 넘어가야 할 개념 중 하나가 바로 ‘프로세스(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();
}
}
📌 코드 설명
- 클래스 선언
- MyThread 클래스는 Thread 클래스를 상속받는다
- Thread 클래스를 상속받으면, 우리가 원하는 **작업 로직(run 메서드)**을 오버라이딩해서 사용할 수 있다.
- run 메서드 오버라이딩
- run() 메서드는 스레드가 실행될 때 실제로 수행할 작업을 정의한다.
- 여기서는 단순히 "스레드 실행 중"이라는 문자열을 출력한다.
- main 메서드 (프로그램의 시작점)
- MyThread t1 = new MyThread();
MyThread 객체를 생성한다. - t1.start();
이 부분이 핵심이다!
start() 메서드는 내부적으로 새로운 스레드를 생성해서 run() 메서드를 비동기적으로 실행한다
즉, main 스레드와는 별도로 t1이라는 새로운 스레드가 동작한다.
- MyThread t1 = new MyThread();
⚠️ 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 같은 동기화 기술이 사용된다.
'IT개발 > Tech Notes' 카테고리의 다른 글
RAM vs ROM 완전 정리 - 메모리 차이와 역할 쉽게 이해하기 (0) | 2025.04.27 |
---|---|
접근 제어 방식 완벽 비교! MAC, DAC, RBAC 차이 정리 (0) | 2025.04.24 |
🖥️ 개발자 취업을 위한 CS 기초 공부 로드맵 총정리 (0) | 2025.04.18 |
📌 트랜잭션의 4가지 특성, ACID란 무엇인가? (0) | 2025.04.18 |
ERD와 정규화(Normalization), 왜 항상 같이 언급될까? (0) | 2025.04.18 |
댓글