사용자가 프로그램을 실행하면, 운영체제는 해당 프로그램의 실행 파일을 찾는다.
운영체제는 해당 프로그램을 실행하기 위해 새로운 프로세스를 실행한다.
이때, 프로세스는 실행 중인 프로그램의 인스턴스를 말한다.
운영체제는 새로운 프로세스에 대해 메모리 공간을 할당한다. -> 프로세스 메모리 구조

프로세스의 메모리 구조는 스택(stack), 힙(heap), BSS, GVAR, TEXT 영역으로 나뉜다.
프로그램 실행될 때
프로그램 실행중
❗ 프로그램 카운터
- CPU의 중요한 레지스터 중 하나로, 현재 실행중인 명령어의 주소를 저장하고 다음에 실행할 명령어의 주소를 가리키는 역할
- CPU가 프로그램의 명령어를 순차적으로 실행하기 위해 필수적인 요소
❗ 스택 포인터
- 현재 스택의 최상단(가장 최근에 추가된 데이터)를 가리키는 레지스터
- 함수 호출과 반환, 지역 변수 할당 시 동적으로 변한다.
❗ 스택프레임
- 함수 호출 시마다 스택에 생성되는 데이터 블록
- 함수의 실행 컨텍스트를 저장하며, 함수가 종료될 때 스택에서 제거된다.
❗ 프레임 포인터
- 각 스택 프레임마다 하나의 프레임 포인터가 존재하며, 해당 함수의 스택 프레임의 기준 주소 역할
- 스택 프레임의 시작 지점을 가리키며, 함수 실행중에는 변경되지 않고 고정
❗ 힙 영역 관리
- 프리 리스트(Free List)관리를 통해 할당되지 않은 메모리 블록을 추적하고 새로운 메모리 할당 요청이 들어오면 프리 리스트에서 적절한 크기의 블록을 찾아 할당한다.
❗ 가비지 컬렉션
- 힙 메모리를 자동으로 관리하는 가비지 컬렉션 시스템을 사용
- 참조되고 있는 객체를 추적하고 더 이상 참조되지 않는 객체를 자동으로 해제하여 메모리 누수를 방지