남궁성 님의 "Java의 정석" 책을 정리한 포스팅 입니다.
1. 프로세스와 스레드
프로세스
- 실행중인 프로그램을 의미합니다.
구성
- 자원
- OS로부터 실행에 필요한 자원을 할당받아 프로세스가 됩니다.
- 스레드
- 모든 프로세스에는 하나 이상의 스레드가 존재합니다.
- 작업을 수행하는데 필요한 개별적인 호출스택이 필요합니다.
스레드
- 자원을 이용하여 실제 작업을 수행하는 실행 단위입니다.
멀티태스킹
- 여러 프로세스가 동시에 실행될 수 있습니다.
- 프로세스 생성비용과 컨텍스트 스위칭 비용이 스레드보다 많이 들어 많은 수의 사용자 요청을 서비스하기 어렵습니다.
멀티스레딩
- 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것입니다.
- 짧은 시간동안 여러 작업을 번갈아 수행하면서 동시에 수행하는 것처럼 보이게 합니다.
- CPU 코어 당 하나의 작업을 수행할 수 있습니다.
장점
- 자원을 효율적으로 사용할 수 있습니다.
- CPU 사용률을 향상시킵니다.
- 사용자 응답성이 향상됩니다.
- 작업이 분리되어 코드가 간결해집니다.
단점
- 동기화 문제
- 여러 스레드는 프로세스 내에서 자원을 공유하면서 작업합니다.
- 스레드 간 컨텍스트 스위치가 일어나면서 작업중에 공유자원이 갱신되어 데이터 무결성 문제가 발생합니다.
- 공유자원에 대한 접근 관리가 요구됩니다.
- 교착상태
- 자원을 점유한 상태에서 서로 상대편이 점유한 자원을 사용하려고 대기하느라 진행이 멈춰있는 상황입니다.
- 스레드는 자원을 점유하면 강제적으로 빼앗을 수 없습니다.
2. 구현과 실행
Thread 클래스 상속
class MyThread extends Thread {
public void run() { // 작업내용 }
}
Runnable 인터페이스 구현
class MyThread implements Runnable {
public void run() { // 작업내용
}
- 좀더 일반적인 방법입니다. (다중상속으로부터 자유로움)
3. start()와 run()
- Thread나 Runnable 인스턴스가 생성되면 실행 대기 상태에 있습니다.
- 실행중인 사용자 스레드가 하나도 없을 때 프로그램이 종료됩니다.
실행 과정
start() - 새로운 스레드 생성
- 새로운 스레드 및 호출 스택을 생성합니다.
run() - 작업 수행
- 주어진 시간동안 작업을 마치지 못하면 대기합니다.
스레드 종료
- 주어진 시간동안 작업을 마치면 스레드가 종료됩니다.
main thread
프로그램의 기본 스레드
- main()을 실행하는 스레드 입니다.
- main()이 수행을 마쳤다 하더라도 다른 스레드가 아직 작업을 마치지 않은 상태라면 프로그램이 종료되지 않는다.
IllegalThreadStateException
- 한번 실행된 스레드를 두번 이상 호출할 경우 발생하는 예외 입니다.
- 한번 실행이 종료된 스레드는 다시 실행할 수 없습니다.
4. 싱글스레드와 멀티스레드
싱글스레드
한 개의 스레드로 두 개의 작업을 수행하는 경우
- 한 작업이 끝나야 다음 작업을 수행합니다.
- 만약 한 작업이 대기 상태에 들어갔다면 CPU 유휴상태가 발생합니다.
멀티스레드
두 개의 스레드로 두 개의 작업을 수행하는 경우
- 동시에 두 작업이 처리되는 것처럼 동작합니다.
- 효율적인 CPU 사용이 가능합니다.
- 한 스레드가 I/O 작업으로 대기 상태에 있는 동안, 다른 스레드를 실행시켜 효율적으로 CPU를 사용할 수 있습니다.
- 빠르게 번걸아가며 컨텍스트 스위칭이 이루어집니다.
컨텍스트 스위칭
- 스레드간의 작업 전환을 의미합니다.
- 전환하기 전, 현재 진행중인 스레드의 작업 상태를 저장합니다.
멀티 코어 기반 멀티스레딩
- CPU 코어 당 스레드의 작업을 처리합니다.
- 동시에 복수개의 스레드가 수행됩니다.
- 스레드들이 같은 자원을 두고 경쟁하는 상황이 발생할 수 있습니다.
출처
'Java' 카테고리의 다른 글
[Java의 정석] 15-1. 입출력: 바이트 기반 스트림 (0) | 2023.11.29 |
---|---|
[Java의 정석] 13-2. 스레드: 우선순위, 그룹, 데몬 스레드 (2) | 2023.11.27 |
[Java] Stream (2) | 2023.10.22 |
[Java][Tutorial] 3-3. Collections: Aggregate Operations (0) | 2023.10.20 |
[Java][Tutorial] 3-2. Collections: Queue, Deque, Map (0) | 2023.10.15 |