구구단을 출력하는 소스코드를 짯다고 가정해보자.

이 소스코드를 실행하면 "콘솔에 구구단을 출력한다" 라는 결과가 나올 것이다.

눈에 보이는 과정은 간단하지만

코드를 돌린 컴퓨터에서는 안보이는 수많은 과정을 통해 결과가 나타나는 것이다.

 

먼저 프로그램이 실행되기 위해서는 프로그램이 메모리에 로드되어야 한다.

그리고 해당 프로그램 내에서 필요한 여러 변수를 위한 메모리 공간도 필요하다. 

이 예시에서 '프로그램'의 주체는 '구구단 출력 소스코드'가 되고 '메모리'는 RAM이다.

 

 

 

소스코드로 작성된 프로그램이 메모리에 적재되고 실행되는 방법과 순서는 다음과 같다.

소스코드와 변수들이 메모리에 적재되는 과정

 

코드 영역(프로그램 시작->끝까지)

실행할 프로그램 코드가 메모리에 로드된다.

메모리에 적재된 프로그램을 프로세스 라고 한다.

OS에 의해 프로세스는 RAM의 일부 공간을 할당받아 생성된다.

이 영역에는 우리가 작성한 소스코드가 아닌 컴파일 된 기계어가 들어간다.

CPU는 이 코드영역에 저장된 명령어를 하나씩 가져가 처리한다.

 

데이터 영역(프로그램 시작->끝까지)

프로그램의 전역변수, 정적변수, 상수가 저장되는 데이터 영역이 생성된다.

힙 영역

개발자가 직접 관리하는 영역 개발자에 의해 메모리 공간이 할당되고 해제된다.

  • Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다.
  • 애플리케이션의 모든 메모리 중 stack 에 있는 데이터를 제외한 부분이라고 보면 된다.
  • 모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.
  • 몇개의 스레드가 존재하든 단 하나의 heap 영역만 존재한다.
  • Heap 영역에 있는 Object들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.

 

스택영역

함수의 호출과 관계되는 지역변수와 매개변수가 저장

함수의 호출이 완료되면 사라지는 영역.

프로그램이 자동으로 사용하는 임시 메모리 영역. 정적할당 영역이다.

 

동적할당: 프로그램이 실행되는 런타임 동안 사용자가 직접 공간의 크기나 시점을 결정할 수 있다.

정적할당: 프로그램마다 사용할 메모리 크기를 고려해 컴파일 시기에 메모리를 할당

 

소스코드가 실행되는 순서

1.

수행되어야 하는 동작이 담긴 코드들이 코드영역 안으로 들어감

 

2.

레지스터가 코드영역에서 실행되어야 할 부분을 가리키면 해당 순서대로 프로그램이 실행

전역변수는 데이터 영역에 달어감

실행되면 해당 함수는 스택 영역으로 들어감

 

3.

메인 함수 내부에서 또다른 함수가 호출될 때 호출할 함수에 전달할 인자가 역순으로 '스택'에 쌓임(실행이 종료되면 순차적으로 빠져나옴)

스택에 실행할 데이터가 쌓였다 없어졌다를 반복하는 동안 코드 영역과 데이터 영역에 저장된 값은 사라지지 않으며, 모든 연산이 종료되면 

수행했던 프로그램에 관련한 데이터가 메모리에서 사라진다.

복사했습니다!