정적 프로그램 (Static Program)
프로그램은 컴퓨터에서 실행 할 수 있는 파일을 통칭한다.
단, 아직 파일을 실행하지 않은 상태이기 때문에 정적 프로그램(Static Program)을 줄여서 '프로그램'이라고 부른다.
어떠한 프로그램을 개발하기 위해선 java나 c언어 등을 사용해 코드를 작성하여 완성한다.
프로그램은 쉽게 말해서 그냥 코드 덩어리인 것이다.
프로세스 (Process)
프로세스는 코드 덩어리인 프로그램을 실행 시져 프로그램이 '동적'으로 변하게 하여 프로그램이 돌아가고 있는 상태이다.
컴퓨터에서 작업 중인 프로그램을 의미하는 것이다.
=> 결국 똑같은 어플리케이션을 실행 하냐 안 하냐의 차이.
프로세스의 한계
기술이 발전함에 따라 프로그램이 복잡해지면서 프로세스 작업 하나만으로 프로그램을 실행하지 못하게 되었다.
그렇다고 동일 프로그램을 여러 개의 프로세스로 만들게 되면 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다.
스레드(Thread)
스레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다.

하나의 프로세스 안에 여러 개의 스레드가 들어 있으므로 스레드 수가 많을 수록 프로그램 속도와 동시에 하는 작업이 많아져 성능이 올라간다.
프로세스의 자원 구조
프로그램이 실행되어 프로세스가 만들어지면 메모리를 할당 받게 된다.
이 메모리는 다음과 같은 영역으로 나뉘어져 있다.

- 스택 영역 (Stack)
: 지역변수와 같은 임시적인 자료를 저장하는 공간.
stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 stack영역을 초과하면 stack overflow 에러가 발생한다.
- 힙 영역 (Heap)
: 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 저장하는 공간.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
=>스택 영역과 힙 영역은 프로세스가 실행되는 동안 크기가 변하는 동적 영역
- 코드 영역 (Code / Text)
: 개발자가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있다.
- 데이터 영역 (Data)
: 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있다.