프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스가 된다. 프로세스는 데이터 자원과 스레드로 구성되어 있는데, 자원을 이용해 실제로 작업을 수행하는 것이 스레드이다.
Process
- 실행 중인 프로그램
Thread
- 프로그램 작업을 수행
Thread의 상태
스레드는 객체가 생성되면서 시작한다. 그리고 종료된 스레드는 다시 시작할 수 없다.
- 생성 상태 new
- new연산자에 의해 스레드가 만들어지고 생명 주기가 시작 된다 - 실행 가능 상태 runnable
- 객체 생성 후 start() 메서드를 호출해 실행 가능한 상태가 된다. - 실행 상태 running
- run() 메서드가 실행되면 실제로 스레드가 동작한다. - 일시 정지 상태 blocked
- I/O request나 synchronized 블록 수행 시 동작 상태를 의미한다. blocking이 종료될 때까지 유지한다. - 종료 상태 dead
- run() 메서드가 수행을 끝내고 스레드가 종료된 상태이다.
start() 메서드가 호출되면 Thread Control Block : TCB 가 JVM에 의해 생성 된다. 스레드를 관리하기 위한 정보를 담고 있다. 스레드 이름, 고유번호, 메모리 주소, 상태, 그룹, 레지스터, 우선순위 값과 같은 정보들이 저장되어 있다.
Thread의 장점과 단점
스레드는 시스템 관리를 효율적으로 하기 위해 사용한다.
프로세스는 독립적으로 존재하여 서로 자원을 주고 받는데 비용과 시간이 걸린다. 하지만 프로세스 안에 여러 스레드가 있을 경우, 스레드는 서로 자원을 공유한다. 이처럼 스레드끼리 자원을 공유하는 시간과 과정이 효율적이다. 그리고 스레드는 하나의 프로세스 처럼 작동하여 동시에 작업을 할 수 있다. 우리가 노래를 들으면서 블로그에 글을 올릴 수 있는 이유도 멀티 스레드가 작업을 수행하고 있어 가능하다. 여러 개의 프로세스를 사용하는 것보다 오버헤드가 적다는 것도 장점이다.
하지만 무조건 스레드를 사용하는 작업이 좋은 것은 아니다. 자원을 서로 공유할 수 있다는 것은 보안을 유지해야 할 필요가 있을 때 위험요소가 된다. 그리고 동기화나 교착상태와 같은 문제를 고려해 신중히 프로그래밍 해야 한다. 프로세스는 독립적으로 동작하기 때문에 자식 프로세스에 영향을 주지 않지만, 스레드는 자식 스레드에 영향을 미친다.
만약 스레드를 자주 사용하게 될 경우 Context Switching 비용이 높아 시스템 성능이 저하될 수 있다는 점도 기억해야 한다.
Thread 종류
- 데몬 스레드: JVM이 스스로 필요에 의해 사용
- 일반 스레드: 응용 프로그램에서 생성
Daemon Thread
: 백그라운드에서 사용자의 애플리케이션을 보조하는 스레드이다. 대표적으로 GarbageCollectionThread가 있다.
JVM은 일반 스레드가 하나라도 살아있는 한 실행을 계속하고, 일반 스레드가 종료되면 데몬 스레드가 살아있더라도 스스로 JVM을 종료한다. 데몬 스레드는 보조하는 역할로 존재할 뿐이다.
- 싱글 스레드: 프로세스 내에 스레드가 하나만 존재하는 경우
- 멀티 스레드: 프로세스에서 자원을 처리하는 스레드가 둘 이상인 경우
프로세스 메모리 수에 따라 생성할 수 있는 스레드의 수가 결정된다. CPU의 코어가 한 번에 하나의 작업만 수행할 수 있어, 코어의 수에 따라 실행되는 스레드가 같다. 스레드는 항상 코어보다 많이 존재해, 여러개의 코어가 번갈아 가며 동작 해 동시에 여러 작업을 하는 것처럼 보이게 한다. 그렇기 때문에 프로세스 성능이 스레드의 개수에 무조건 비례하는 것은 아니다.
모든 프로세스는 최소 하나 이상의 스레드가 존재하고, 둘 이상 스레드를 가지고 있으면 multi threaded process라고 한다. 대부분의 OS는 멀티 태스킹 (multi tasking)을 지원하고 있다.
multi threading
: CPU의 사용률을 향상시키고, 자원을 효율적으로 사용할 수 있게 한다. 작업이 분리되어 코드도 간결해진다.
'Language > JAVA' 카테고리의 다른 글
[자바/JAVA] ArrayList에 대해(설명, 메서드, 예시) (0) | 2023.07.20 |
---|---|
[자바/JAVA] 컬렉션 프레임워크 (Collection Framework) (0) | 2023.02.07 |
[Java/자바] 오류의 종류와 예외 처리 (0) | 2023.01.31 |
[Java/자바] 자바 가상 머신 JVM이란? (0) | 2023.01.31 |
[Java/자바] 입출력을 위한 스트림(Stream) (0) | 2023.01.26 |