process vs process
실제 작동하는 상태이냐 아니냐.
동적이냐 아니냐의 차이!
1. program
- 어떤 데이터를 사용해서 어떤 작업을 할지 절차를 담은, 실행이 가능한 파일
- 저장 장치(하드디스크)에 저장되어 있음
2. process
- 프로그램을 메모리에 올린 동적인 상태
- 프로그램이 실행되면 "프로세스 인스턴스"가 생성됨
- OS가 프로그램을 메모리에 올리고 CPU를 위한 PCB(Process Control Block)을 할당한 상태
- 프로세스란 프로그램 + PCB
- 스케줄러의 입장에서는 "task"
3. Thread
- CPU 관점에서 처리하는 실행 단위
- 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야할 일을 CPU에 전달. 이 때 단위가 스레드. (CPU는 프로세스로부터 전달받은 스레드를 수행)
- OS 입장에서 작업은 프로세스, CPU 작업은 프로세스 내의 스레드.
- 프로세스는 최소한 1개의 스레드를 가지며, 2개 이상의 스레드를 가진 경우 멀티 스레드
4. 메모리 영역
- stack 영역을 독립적으로 소유. 기능 면에서 독립
- 정적: static data, code
- 동적: stack, heap

4.1 code 영역
4.2 data 영역
- 전역 변수와 정적 변수가 저장되는 영역
- 초기화되지 않은 변수는 BSS에 저장 -> BSS?
- 코드가 실행되면서 사용하는 변수나 파일 등의 자원을 모아놓는 영역
4.3 stack 영역
thread 단위로 소유
compile 시점에 크기 결정
- 프로세스에서 순간적으로 처리해야 하는 정보를 위한 임시 메모리 영역
- 함수 안에 선언된 지역변수, 매개 변수, 리턴 값, 돌아올 주소 등을 저장
- 함수 호출 시 해당 정보를 기록(push), 종료되면 제거(pop)
- LIFO Stack 자료구조 사용
- 메모리의 높은 주소에서 낮은 주소로 할당되는 방식
- 무한하게 할당할 수 X
- thread 별로 stack을 독립적으로 소유하여 독립적인 함수 호출이 가능해짐. 독립적인 실행 흐름을 소유
- 프로세스가 가지는 스레드의 개수만큼 실행 단위를 가지는 것. 개별 스택을 통해 CPU로 하여금 독립적인 단위로 처리하게 해주는 것.
4.4 heap 영역 (보충)
- 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간
- JAVA에서는 객체 데이터 영역에 해당. ex. new 연산자로 생성된 객체가 heap영역을 사용
- FIFO로 가장 먼저 들어온 데이터가 가장 먼저 인출되는 방식
- 메모리의 관점에서 보면 낮은 주소에서 높은 주소의 방향으로 할당
5. thread가 필요한 이유
5.1 응답성 향상
- 입출력으로 인해 작업이 막혀도 다른 스레드들이 작업을 계속해 응답
5.2 자원의 공유(heap, data, code)
- 프로세스가 가진 자원을 스레드들이 공유해 작업은 원활하게 진행
- 불필요한 자원의 중복을 막아주어 효율성 향상
5.3 다중 CPU 지원 시 멀티 스레드로 처리 가능
- 2개 이상의 CPU를 가진 컴퓨터를 사용해 CPU 사용량을 높일 수도
6. Program Counter