운영체제에서 프로그램이 실행될 때의 최소 단위는 프로세스(Process)와 스레드(Thread)로 나뉩니다
구분 | 프로세스(Process) | 스레드(Thread) |
---|---|---|
정의 | 실행 중인 프로그램의 독립적인 인스턴스 | 프로세스 내에서 실행되는 작업 단위 |
메모리 | 독립된 메모리 영역 소유(코드, 데이터, 힙, 스택) | 프로세스 내의 힙, 데이터 영역 공유, 스택은 별도 소유 |
컨텍스트 스위칭 오버헤드 | 크다 (메모리 공간 전환 필요) | 작다 (공유 메모리로 전환 빠름) |
통신 방식 | IPC(파이프, 소켓 등) | 공유 메모리, 스레드 간 변수 직접 접근 가능 |
안정성 | 하나의 프로세스 종료 시 다른 프로세스는 영향 없음 | 하나의 스레드 오류 시 전체 프로세스에 영향 가능 |
동시성(Concurrency)
병렬성(Parallelism)
자바에서는 스레드를 사용자 스레드와 데몬 스레드로 구분합니다
구분 | 사용자 스레드 | 데몬 스레드 |
---|---|---|
JVM 종료 조건 | 모든 사용자 스레드 종료 시 JVM 종료 | 사용자 스레드 종료 시 데몬도 종료 |
용도 | 일반적 작업 수행 (비즈니스 로직 등) | 백그라운드 작업(로그, GC 등) 수행 |
예시 | Main Thread, Worker Thread | Garbage Collector Thread 등 |
Thread daemonThread = new Thread(() -> {
while(true) {
// 백그라운드 작업
}
});
daemonThread.setDaemon(true);
daemonThread.start();
컨텍스트 스위칭은 CPU가 다른 작업으로 전환할 때 수행하는 과정으로,
다음과 같은 오버헤드를 발생시키빈다
스레드의 수가 많아지고 전환이 빈번할수록 성능이 저하됩니다
자바는 1(MIN) ~ 10(MAX)까지 우선순위를 부여합니다.
Thread thread = new Thread(() -> {});
thread.setPriority(Thread.MAX_PRIORITY);
CPU Affinity는 특정 스레드를 특정 CPU 또는 코어에 고정하여 캐시 활용 효율성을 높이고 성능을 향상시키는 기법입니다
자바에서는 기본 API로 제공하지 않아 JNI 또는 JNA 등 네이티브 접근 방법을 사용해야 합니다
InterruptedException
발생 가능합니다Thread.sleep(1000); // 1초 일시 정지
Thread.yield(); // CPU 점유권 양보 요청