흔히 말하는 프로그램이 실행된다는 것은 프로세스 인스턴스가 생성된다는 것을 의미한다
여기서 인스턴스 생성이란 프로그램 실행에 필요한 내용이 컴퓨터 메모리에 적재된다는 것을 뜻한다
= 실행중인 프로그램
프로그램 -> 프로세스
프로그램이란 파일이 저장 장치에 저장되어 있지만 메모리에는 올라와 있지 않은 정적인 상태를 뜻한다 (어떤 작업을 위해 실행할 수 있는 명령어의 집합)
메모리에 올라와있지 않은 : 아직 운영체제가 프로그램에게 독립적인 공간 할당해주지 않았다 ( 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행가능하다 )
정적인 상태란 아직 실행되지 않고 가만히 있는 상태를 뜻한다
=> 프로그램 : 아직 실행되지 않은 파일 그 자체 ( 코드 덩어리 )
=> 실행하면 프로세스가 된다
Code : 코드 자체를 구성하는메모리 영역 (프로그램 명령), 프로그래머가 작성한 프로그램이 코드영역에 작성된다
Data : 전역변수, 정적변수, 배열 등 코드가 실행되면서 사용한 변수와 파일들의 각종 데이터들이 모여있다
Heap : 동적 할당 시 사용 (new mallo 등 동적으로 할당되는 데이터들을 위해 존재하는 공간이다)
Stack : 지역변수, 매개변수, 리턴 값(임시 메모리 영역), 호출한 함수가 종료되면 되돌아올 메모리의 주소를 스택에 저장하고 변수사용 범위에 영향을 미치는 영역을 구현할 때 사용된다
정적영역: 데이터 선언할 때 그 크기가 결정된다 (코드/데이터 영역)
동적영역: 프로세스가 실행되는 동안 크기가 늘어났다 줄어들었다 한다 (스택/힙영역)
= 프로세스의 실행 단위, 프로세스의 부분집합
프로세스는 실행 중 오류가 발생해도 프로세스에는 아무런 영향을 주지 않는다
반면 스레드는 메모리 영역 (Code Heap Data)을 공유하기 때문에 오류가 발생하면 프로세스 내 다른 스레드 모두 오류가 발생하게 된다
프로세스는 무겁고 실행이 오래걸린다. 또한 자원을 할당받아 사용하며 독립적이다(데이터 공유 안함)
반면에 스레드는 가볍고 실행이 빠르며 데이터와 자원을 서로 공유하며 사용한다
쓰레드는 흐름의 단위이기에 CPU 입장에서 최소 작업 단위이다
각각의 스텍 데이터가 있고 데이터를 공유 가능하다보니 operational cost 낮고 통신 비용 또한 낮다는 장점이 있다
프로세스는 자원의 소유인데 반해 스레드는 실행 단위라고 생각할 수 있다
하나의 프로세스를 다수의 실행단위 (스레드)로 구분/구성하여 자원을 공유하며 자원의 생성/관리 중복성 최소화와 수행 능력을 향상시킬 수 있다
스레드는 1MB 이내의 메모리를 점유하기에 경량 프로세스라고도 불리며 메모리 절약이 가능하다
출처
guru99.com
velog.io/@raejoonee/프로세스와-스레드의-차이
velog.io/@hoyun7443/프로세스-스레드
devuna.tistory.com/21
www.geeksforgeeks.org/difference-between-multitasking-multithreading-and-multiprocessing/