특정 작업을 수행하는 일련의 명령어 및 작업들의 모음이다.
실행중인 프로그램을 말하며 os로부터 할당받은 메모리에서 실행되고 있는 프로그램의 인스턴스다.
os로부터 자원을 할당받는 작업의 단위이다.
프로세스는 한 개 이상의 스레드를 가지고 있고 스레드 단위로 스케줄링을 한다. 기본적으로 프로세스 당 하나의 스레드가 같이 생성된다.
코드 영역
프로그램의 코드가 저장되며 읽기전용이다.
데이터 영역
전역변수, static변수가 할당된다.
힙 영역
사용자가 동적으로 할당하는 영역으로 인스턴스 생성시 할당되며 자바에서는 GC에 사용되고 있지 않는 메모리는 회수된다. 낮은주소에서 높은주소로 데이터를 쌓아 올린다.
스택 영역
지역변수, 매개변수가 할당되며 함수 종료시 반환된다. 높은주소에서 낮은주소로 데이터를 쌓아올린다.
코드영역과 데이터영역은 컴파일 시에 위치와 크기가 결정되는 정적할당영역으로 프로세스가 종료될 때 까지 계속 유지된다.
힙영역과 스택영역은 런타임동안 위치와 크기가 결졍되는 동적할당 영역으로 사용이 종료되면 메모리를 반환한다.
프로세스의 실행단위다. 하나의 프로세스에 스레드가 한 개 일땐 싱글스레드, 두 개 이상일땐 멀티스레드라고 한다.
스레드는 각각의 스택과 레지스터를 가지며 코드, 데이터, 힙영역은 서로 공유한다.
스레드마다 각각의 스택을 가지고 있기 때문에 독립적인 함수 호출이 가능하고 따라서 스레드가 독립적으로 실행될 수 있다.
또한 스레드마다 각각의 프로그램 카운터를 가지고 있기 때문에 스케줄러에 의해 스레드가 context switching되었을 때 어떤 명령어 까지 수행했는지 기억할 수 있다.
스레드: CPU관점에서의 최소 작업단위
프로세스: OS관점에서의 최소 작업단위
멀티스레드는 멀티프로세스보다 적은 메모리를 사용하며 context switching이 빠르다.
- 스레드는 스택을 제외한 모든 메모리를 공유하기 때문에 교체할 영역이 적다.
- 프로세스의 경우 공유하는 메모리가 없기 때문에 교체할 영역이많고 캐시도 비우고 새로 쌓아햐 한다. 따라서 context switching 비용이 높다.
스레드간의 통신비용이 프로세스간 통신 비용보다 작다. 스레드간에는 메모리를 공유하기 때문에 값을 공유할 수 있지만, 프로세스는 독립된 메모리 영역을 사용하므로 다른 프로세스의 메모리에 직접 접근할 수 없다. (통신하기 위해서는 IPC사용)
멀티프로세스는 하나의 프로세스에서 오류가 나더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티스레드는 하나의 스레드에서 오류가 나면 전체 스레드에 영향을 끼칠수 있다.
멀티 스레드는 자원을 공유하기 때문에 동기화 문제가 발생한다. 따라서 주의 깊은 설계가 필요하고 디버깅이 어렵다.
추가할것: context switching, multi thread, 프로세스 상태변화, 동시성/병렬성, thread-safe