프로그램
: 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태프로세스
: 운영체제로부터 자원을 할당받은 작업의 단위스레드
: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위프로세스란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램으로 정의할 수 있으며, 프로그램을 실행하는 순간 해당 파일이 컴퓨터 메모리에 올라가게 되는데 이 상태의 프로그램을 프로세스라고 한다.
프로세스는 운영체제로부터 각각의 독립된 메모리 영역(Code, Data, Stack, Heap) 을 할당받기 때문에 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다. 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 (IPC, inter-process-communication)을 사용할 수 있지만 자원 부담이 크다.
스레드란 프로세스 내에서 실행되는 여러 흐름의 단위이며 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행 경로이다.
스레드는 프로세스 내에서 각각 Stack만 할당 받고 Code, Data, Heap 영역은 공유한다. 이와 같은 이유로 스레드는 프로세스와 달리 프로세스 내의 주소공간이나 자원들을 스레드끼리 공유하며 실행된다. 그래서 한 스레드가 프로세스 자원을 변경하면 다른 이웃 스레드도 그 변경 결과를 즉시 볼 수 있다.
스택의 후입선출(LIFO)이라는 특성과 연관이 있다. 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되어 더 복잡해지기 때문에 원활한 실행 흐름을 위해 스택은 독립적으로 존재하게 된다.
자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다. 일반 스레드와 거의 차이가 없으며 JVM이 운영체제의 역할을 하여 스레드 스케줄링과 스레드 정보에 대한 관리도 JVM이 수행한다.
프로세스는 최소 하나 이상의 스레드를 포함하기 때문에 프로세스와 스레드는 개념의 범위부터 다르다.
운영체제 관점에서는 프로세스가 최소 작업 단위가 되며, CPU 관점에서는 스레드가 최소 작업 단위가 된다. 프로세스는 다른 프로세스와 정보를 공유하려면 IPC를 사용하는 등의 번거로운 과정을 거쳐야 하지만, 스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.
프로세스를 실행하다가 오류가 발생해서 프로세스가 강제로 종료된다면, 다른 프로세스에게 영향을 주지 않는다. 반면에 스레드의 경우는 일부 메모리영역을 공유하고 있기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html