사용자가 직접 관리할 수 있는 영역으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해체된다.
메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
런타임 시에 크기가 결정된다.
할당, 해제 작업으로 인해 속도의 저하가 일어날 수 있다.
Java에서는 가비지 컬렉터가 자동으로 해제해준다.
스택 영역
함수의 호출과 관계되는 함수, 지역변수와 매개변수가 저장되는 영역이다.
함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
메모리의 높은 주소에서 낮은 주소의 방향으로 할당 된다.
컴파일 시에 크기가 결정 된다.
힙 영역과 스택 영역
두 영역은 같은 공간을 공유한다.
힙이 메모리 위쪽 주소부터 할당되면 스택은 아래쪽부터 할당된다.
각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데, 이를 각각 heap overflow, stack overflow라 한다.
힙 영역이 크면 클수록 스택 영역이 작아지고, 스택 영역이 크면 클수록 힙 영역이 작아진다.
프로세스와 쓰레드
프로세스
하나 이상의 쓰레드에 의해 실행되는 프로그램
운영체제로부터 자원을 할당받은 작업의 단위
프로세스는 독립된 메모리 영역을 할당받는다.
프로세스가 다른 프로세스의 자원에 접근하려면 **IPC(프로세스간의 통신)**를 사용해야 한다.
프로세스가 생성되면, PCB라는 프로세스 제어 블록이 생성됩니다. 여기에는 PID, 프로세스 상태, PC 등의 정보가 저장되어 있으며, Context switching이 발생하면 현재 작업 정보를 저장하고, 다시 CPU를 할당받게 된다면, PCB로부터 이전의 작업 정보를 불러옵니다.
쓰레드
프로세스 내에서 실행되는 흐름의 단위
프로세스가 할당받은 자원을 이용하는 실행의 단위
쓰레드 간의 자원을 공유할 수 있다.
프로세스와 쓰레드의 차이
프로세스는 운영체제로부터 자원을 할당받아 실행하고, 스레드는 프로세스로부터 자원을 할당받아 실행
하나의 프로세스 안에서 여러 스레드 생성이 가능
쓰레드는 각각의 **register(PC)**와 stack 영역을 가지고 있다.
쓰레드는 프로세스의 code, data, heap 영역을 공유한다.
code영역을 공유하기 때문에 한 프로세스 내부의 쓰레드들은 프로세스가 가지고 있는 함수를 모두 호출할 수 있다.
data, heap영역을 공유하기 때문에 IPC없이도 쓰레드간의 통신이 가능하다.
멀티 프로세스
각 프로세스간 독립적으로 동작하기 때문에 서로 영향을 끼치지 않습니다.
각각 독립된 메모리 영역을 가지고 있어 다른 프로세스와 데이터 공유 간 IPC를 해야 하는 등 오버헤드가 있으며, Context switching에 대한 오버헤드도 존재합니다.
멀티 스레드
전역 변수와 정적 변수에 대한 자료를 공유할 수 있습니다.
하나의 스레드가 다른 스레드의 영향을 끼칠 수 있습니다. 또한 동기화에 신경을 써야합니다.