1. 프로세스와 스레드 개념
프로세스란?
컴퓨터에서 실행 중인 프로그램을 말하며 실행 중인 프로그램에 대해 독립적으로 메모리와 자원을 할당한다.
- 각 프로세스는 독립된 메모리 영역(코드, 데이터, 스택 등)을 가진다
- 다른 프로세스와는 독립적으로 작동하며 서로 간섭하지 않는다
- 운영체제는 여러 프로세스를 동시에 실행하여 멀티태스킹 환경을 제공한다
프로세스를 알아야 하는 이유
- 컴퓨터 자원의 효율적인 관리와 운영체제의 동작 원리를 이해하기 위해.
- 멀티태스킹 환경에서 프로세스 간의 상호작용과 자원 분배를 최적화하기 위해.
스레드란?
프로세스 내에서 실행되는 작업의 흐름 단위를 말하며 하나의 프로세스는 여러 스레드를 생성할 수 있다.
- 같은 프로세스 내의 스레드들은 공유 메모리를 사용하여 작업을 수행한다
- 가벼운 실행 단위로 생성 및 전환 비용이 비교적 적다
- 여러 스레드가 동시에 실행될 때 멀티태스킹 효과를 제공한다
스레드를 알아야 하는 이유
- 동시성과 병렬성을 통해 프로그램의 실행 효율을 극대화하기 위해.
- 자원을 최적화하고 반응성을 높이며 작업 처리 속도를 향상시키기 위해.
2. 동시성과 병렬성
동시성(Concurrency)
하나의 프로세서(CPU)가 여러 작업을 번갈아가며 실행하는 방식이다.
- 컨텍스트 스위칭(Context Switching)을 통해 작업을 빠르게 전환할 수 있다.
- 실제로는 한 번에 하나의 작업만 실행되지만 매우 빠르게 진행되어 동시에 실행되는 것처럼 보인다.
병렬성(Parallelism)
멀티코어 프로세서를 활용하여 여러 작업을 각각의 코어에서 동시에 실행하는 방식이다.
- 물리적으로 여러 코어에서 작업을 나누어 수행한다.
- 실제로 여러 작업이 동시에 실행된다.
차이점
구분 | 동시성 | 병렬성 |
---|---|---|
설명 | 하나의 프로세서가 여러 작업을 번갈아가며 실행 | 여러 프로세서(코어)가 각각 작업을 동시에 실행 |
예시 | 한 사람이 전화와 메모를 번갈아가며 수행 | 여러 사람이 각자 전화와 메모를 동시에 수행 |
장점 | 단일 프로세서에서도 다중 작업 처리가 가능 | 작업 처리 속도가 빠르고, 대규모 작업에 적합 |
3. 프로세스와 스레드의 차이점
구분 | 프로세스(Process) | 스레드(Thread) |
---|---|---|
정의 | 독립적으로 실행되는 프로그램 단위 | 프로세스 내에서 실행되는 작업의 흐름 단위 |
메모리 구조 | 각 프로세스는 독립적인 메모리 공간 (Code, Data, Heap, Stack)을 가짐 |
프로세스 내의 메모리를 공유 (Code, Data, Heap 공유, Stack은 독립적) |
생성 비용 | 생성 및 종료에 높은 비용 (운영체제의 도움 필요) | 생성 및 전환 비용이 낮음 |
안정성 | 프로세스 간의 충돌이 없음 | 하나의 스레드가 잘못되면 프로세스 전체에 영향을 줄 수 있음 |
예시 | 크롬 브라우저, 메모장 등 독립적인 프로그램 | 크롬 브라우저 내에서 실행되는 탭, 다운로드 등 |
4. 프로세스의 메모리 구조
- Code : 프로그램 실행에 필요한 명령어가 저장되는 메모리 영역. 읽기 전용으로 보호된다.
- Data : 전역 변수와 static 변수가 저장되는 메모리 영역. 프로그램 시작 시 할당되고 종료 시 해제된다.
- Heap : 객체와 배열 같은 동적 메모리가 저장되는 메모리 영역. 가비지 컬렉션에 의해 관리된다.
- 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();
}
}