프로세스와 스레드를 한 줄로 설명하면 아래와 같다.
- 프로세스 : 운영제체로부터 자원을 할당받은 작업의 단위
- 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
위 내용을 읽어보면 프로세스가 스레드보다 더 큰 개념임을 알 수 있고 이는 아래 그림에서 확인이 가능하다.
[프로세스마다 최소 1개의 스레드를 소유한다
Code : 실행할 프로그램의 코드가 저장되는 영역
Data : 프로그램의 전역변수와 정적변수가 저장되는 영역으로 프로그램이 실행되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
Stack : 함수의 호출과 관계되는 지역변수 와 매개변수가 저장되는 영역으로, 함수의 호출과 함께 할당되며 호출이 완료되면 소멸한다. Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
Heap : 런타임의 크기가 결정되는 메모리 영역으로, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
위 그림을 보면 스레드 안에 Stack 이 존재하는데 이는 스레드가 독립된 Stack을 할당받기 때문이다.
(Data, Code, Heap은 공유)
그 이유는 스레드는 독립적인 작업을 수행하기 위해 존재하고, 작업을 위해 함수를 호출하여 지역변수와 매개변수를 독립적으로 저장가능해야 독립적인 작업의 수행이 가능하기 때문이다.예를들면 스레드1과 스레드2의 Stack을 공유하게 된다면 스레드1에서 사용해야할 변수1이 스레드2에서 사용되어 에러가 발생할 것이다.
동적으로 할당된다?
위 내용을 보면 Heap은 사용자에 의해 메모리 공간이 동적으로 할당된다는 것을 알 수 있다. 그렇다면 동적으로 할당 된다는 의미는 무엇일까?
정적할당이란 컴파일 단계에서 메모리를 할당받는 것.
동적할당이란 실행 단계에서 메모리를 할당받는 것.
참조형의 데이터는 Heap에 저장해놓고, 프로그램을 사용하는 동안 필요한 메모리만큼 Heap의 영역을 사용해 동적으로 할당된다고 설명할 수 있다.
Stack 은 컴파일 단계에서 메모리를 할당받는데, 이는 컴파일 단계에서 얼마만큼의 메모리가 필요한지 예측 하기 때문이다.
멀티 프로세스와 멀티 스레드
멀티 프로세스란 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 말한다.
안정성이 높은 것이 장점이지만, 각각의 프로세스들이 독립된 메모리 영역을 가지고 있어 작업량이 많을 수록 오버헤드가 발생한다.
멀티 스레드란 하나의 응용프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것을 말한다. 여러개의 스레드가 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해주는데, 이를 통해 시간 과 자원 손실이 감소하고 정적변수에 대한 자료공유가 가능하다. 그러나 하나의 쓰레드가 데이터 공간을 망가뜨리면 모든 스레드가 작동 불능 상태가 되기 때문에 안정성 문제가 발생할 수 있다.