항상 공부하다 보면 스레드 스레드 얘기가 많은데 오늘은 스레드에 대해 알아보자.
일단 프로세스에 대해서 알아보자.
- 프로세스(process)란 단순히 실행중인 프로그램이라고 할 수 있다.
- 즉, 사용자가 작성한 프로그램이 운영체제에 의해서 메모리 공간을 할당받아 실행 중인 것을 말한다.
- 이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성이 된다.
- 스레드(thread)란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
- 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
- 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.
그래서 스레드는 왜 사용하는 것일까??? 3가지의 이유가 있다.
운영체제(OS)마다 다르지만, 무슨 작업을 수행하려고 할 때 JVM은 적어도 32 ~ 64MB 물리 메모리를 점유한다고 한다.
근데 스레드는 1MB 이내의 메모리만 점유한다. 그래서 스레드를 '경량 프로세스'라고도 부른다.
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행하게 되면 프로세스를 생성하여 자원을 할당하는 과정도 줄어들고 프로세스를 콘텍스트 스위칭(Context Switching)하는 것보다 오버헤드를 더 줄일 수 있게 된다.
콘텍스트 스위칭이란?
운영체제(Operating System)의 스케줄러(Scheduler)가 인터럽트(Interrupt)를 진행하여 더 높은 우선순위를 가진 프로세스가 실행되어야 할 때, 스케줄러가 레지스터(Register)에 저장된 기존 프로세스 정보 값이나 기존 프로세스 상태 값을 커널(Kernal) 내부에 존재하는 PCB(Process Control Block)에 저장하고, 새 프로세스의 정보 값이나 새 프로세스 상태 값을 PCB에서 다시 가져와 교체하는 작업이다.
프로세스 간의 통신 비용보다 하나의 프로세스 내에서 여러 스레드 간의 통신 비용이 훨씬 적으므로 작업들 간의 통신 부담을 줄일 수 있게 된다.
프로세스는 완벽히 독립적이기 때문에 메모리 영역을 다른 프로세스와 공유를 하지 않지만
스레드는 해당 스레드를 위한 스택을 생성할 뿐만 아니라 프로세스 내의 메모리를 공유해서 사용할 수 있다.

[출처] https://mooneegee.blogspot.com/2015/01/os-thread.html
아래의 각 스레드 상태들이 JVM에 의해서 생성/관리된다.