파일이 저장 장치에 저장되어 있지만 메모리에는 올라가지 않은 정적인 상태를 말한다.
프로그램이라는 단어는 아직 실행되지 않은 파일 그 자체를 가리키는 말이다. = 코드 덩어리 !
프로그램에게 의미를 부여하기 위해 프로그램을 실행해 보자.
실행하면 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스 라고 한다.
프로세스는 운영체제로부터 자원을 할당받은 작업의 단위이다
- 실행되고 있는 컴퓨터 프로그램, 스케줄링 단계에서의
작업과 같은 단어라고 봐도 무방함.
-> 위키피디아
프로그램은 코드 덩어리 파일 , 그 프로그램을 실행한 게 프로세스
스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다
과거에는 프로그램을 실행할 때 실행 시작부터 실행 끝까지 프로세스 하나만을 사용해서 진행했다고 한다.
하지만 시간이 흐를수록 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기는 벅차게 되었
다. 실제로 이제는 프로그램 하나가 단순히 한 가지 작업만을 하는 경우는 없다. 그러면 이제 어떻게 해야할까?
운영체제는 안전성을 위해서 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 정보에 접근하려면 오류가 발생하기 때문에 불가능하다.
이것이 스레드.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.

운영체제는 프로세스가 메모리에 올라갈 때, 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap 의 형식으로 할당해 준다.
각각의 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.

이미지 출처 : 티스토리
이와 다르게 스레드는 같은 프로세스 내의 메모리를 서로 공유할 수 있다.
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역을 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리영역을 공유한다.
따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

개념의 범위부터 다르다. 스레드는 프로세스 안에 포함되어 있기 때문이다.
프로세스는 프로그램을 실행하는 순간 해당 파일이 컴퓨터 메모리에 올라가게 되고, 이 동적인 상태의 프로그램을 프로세스라고 한다.
스레드는 프로세스를 구성하는 더 작은 실행 단위의 개념이다.
프로세스는 메모리에 올라갈 때 운영체제로부터 독자적인 시스템 자원을 할당 받는 반면, 스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.