파일이 저장장치에만 올라가있고, 메모리에는 올라가있지 않은 정적인상태이다.
보조기억장치 (하드디스크,SSD)에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이다. 즉, 코드덩어리

ex) 윈도우 프로그램, 맥 프로그램 같이 컴퓨터에서 실행 할 수 있는 파일.
아직 실행하지 않은 상태라서, 정적 프로그램(static Program) 이라고 부르기도 한다.
운영체제로부터 자원을 할당 받은 작업의 단위를 의미한다.

가상 메모리 공간, 코드, 데이터, 시스템 자원의 집합체로,
메모리에 적재되고 CPU(프로세서) 자원을 할당 받아 실행중이거나 대기중인 프로그램이다. 즉, 코드덩어리를 실행할 것.

ex) 윈도우는 작업관리자를 열어보면 프로세스에 나오는 게 실행되고 있는 프로그램.
맥은 응용 프로그램 강제 종료 열어보면 실행되고 있는 프로그램.
프로그램이 여러개 실행된다면 각 프로그램별 메모리에 프로세스들이 담길 주소 공간이 생성되게 되고 그 안에 Code, Data, Stack, Heap 공간이 만들어지게 된다.

코드 영역(Code / Text)
프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석 가능한 기계어 형태로 저장되어 있는 곳 (명령어, 실행코드들 집합장소)
데이터 영역(Data)
코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여있는 곳
데이터영역은 .data ,.rodata, .bss 영역으로 세분화 된다.
힙 영역(Heap)
로그램 실행 중 사용자에 의해 동적으로 메모리 공간이 할당되는 데이터들을 위해 존재하는 곳
스택 영역(Stack)
지역 변수와 같은 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간
Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
만일 stack 영역을 초과하면 stack overflow 에러가 발생한다.

New(생성)
프로세스가 생성될 예정이지만 아직 생성되지 않은 상태. 보조 메모리에 존재함
Ready(준비)
프로세스가 생성되어 CPU에서 실행할 준비가 된 상태. 이때, 메인 메모리로 로드된다.
Running(수행)
실행을 위해 CPU에 의해 선택되어 현재 수행 중인 프로세스.
Blocked/Waiting(블록/대기)
프로세스 실행 중간에 저장매체를 access해서 더 이상 실행이 불가능한 상태. (특정 이벤트 발생 대기 상태)
Exit/Terminated(종료)
프로세스 수행이 완료되거나, 어떤 이유로 중단되었을 때 프로세스 풀에서 방출된 상태
과거 여러개의 프로세스가 동시에 실행될 수 있는 멀티태스킹이 불가능했던 프로세스의 한계를 해결하기 위해 등장항 스레드(Thread)
ex) 과거에는 파일을 다운 받으면 실행 시작부터 실행 끝까지 프로세스 하나만을 사용했어서 다운이 완료 될때까지 하루종일 기다렸다.
하지만, 똑같은데 여러 개의 프로세스로 만들면, 메모리 차지 ⬆️ CPU에서 할당 받는 자원이 중복된다.
하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위
프로세스를 처리하는 것
프로세스 생성시 기본적으로 main 스레드가 생성되는데, 현재 운영체제에서 한 프로세스는 하나 이상의 스레드를 가진다!
다중처리 시스템에서 여러 스레드가 병렬로 실행될 수 있다!

ex) 하나의 크롬브라우저가 실행되면 프로세스 하나 생성된다.
해당 브라우저에서 파일다운과 서치가 동시에 가능하다.
이유는 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능하다.
이러한 일련의 작업 흐름들을 스레드라고하며 여러개가 있는 스레드를 멀티스레드라고 한다.

프로세스는 컴퓨터에서 현재 실행되고 있는 프로그램으로 독립적인 메모리 공간
스레드는 프로세스 내에서 실행되는 흐름으로 프로세스 자원을 공유함
하나의 하드웨어 부품으로, 프로그램을 기억 장치로부터 읽어 데이터를 처리하고, 각종 장치를 구동하는 역할을 담당한다.
연산 처리, 비교처리, 데이터 전송, 편집, 변환, 테스트와 분기 등의 데이터를 처리한다.
하나의 CPU를 가지고 있는 컴퓨터는 프로세스를 동시에 실행시킬 수 없다. 따라서 CPU는 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다. 이러한 CPU 할당 순서 및 방법을 결정하는 과정을 프로세스 스케줄링이라고 하며 CPU 스케줄러가 이를 담당한다.
단일 CPU에서 여러 응응 프로그램이 동시에 실행되는것처럼 보이도록 하는 시스템이다.
컴퓨터가 발전하면서 멀티태스킹을 이용하여 프로세스는 여러개가 동시에 실행될 수 있다.
프로세스를 실행하는 프로세서(CPU)가 실행할 프로세스를 빠른속도로 교체하고 있기 때문이다.
멀티 태스킹 vs. 멀티 프로세싱
