프로그램이 실행되는 순서
우리가 더블클릭하여 실행시키는 프로그램은 어떻게 작동이 되고, 그 내부 원리는 어떻게 될까??
우리는 프로그래밍을 하고. exe 등의 실행 파일을 만들게 됩니다. 이러한 실행 파일을 실행시키면 메모리에 로드되면서 코드에 작성한 동작들을 수행함에 따라 메모리를 읽고 사용하게 된다.
조금 더 자세히 프로그램이 실행되는 순서를 이야기하자면,
우리가 프로그래밍을 하고 실행 파일로 이를 디스크에 저장하게 될 것입니다. 이를 사용자가 더블 클릭을 하여 실행하게 하겠죠. 이를 운영체제에 실행파일을 실행하도록 요청하게 됩니다. 그러면 운영체제는 프로그램의 정보들을 읽고 메모리에 공간을 할당해 주게 됩니다. 그러면 코드로 작성된 것들(함수, 변수 등)을 메모리에서 읽고 쓰면서 동작하게 됩니다.
임베디드와 우리가 생각하는 PC의 환경은 조금 다르기 때문에
여기서는 임베디드에서의 환경은 생각하지 않고, PC의 환경에서 설명하겠습니다.
컴퓨터 운영체제에서는 프로그램을 실행시키기 위해 다양한 메모리 공간을 제공하고 있습니다.
프로그램이 운영될 때 대표적인 메모리는
1. 코드(Code) 영역
2. 데이터(Data) 영역
3. 힙(Heep) 영역
4. 스택(Stack) 영역
언어들마다 아마 조금씩 다를 테지만 대표적으로 4개의 영역에 대해 설명하겠습니다.
메모리 영역
코드(Code) 영역
코드 영역은 이름에서 나오는 것처럼 코드를 저장하기 위한 영역입니다. 텍스트(Text) 영역이라고도 하는데 프로그램을 실행시키기 위한 것들이 저장되는 부분입니다. 즉, 명령문들이 저장되는 곳으로 제어문, 함수, 상수들이
즉 중간에 바뀌지 않도록 읽기 전용(Read-only)저장되는 영역입니다.
데이터(Data) 영역
이부분은 초기화시키는 영역이다.
데이터 영역은 우리가 작성한 코드에서 전역 변수, 정적 변수 등이 저장되는 영역입니다.
전역 변수와 정적 변수의 특징으로는 주로 main함수가 실행되기 전부터 선언되어 프로그램이 종료되기 전까지 실행된다는 것입니다.
BSS 영역 (Block Stated Symbol)
이 부분은 그림에는 나와있지 않지만,
bss 영역은 data 영역과 같이 초기화를 시켜주는 영역이다. 단 메모리만 잡아놓고 실제 값은 초기화하지 않습니다.
그 후 런타임 시에 VM에 링크되어 올라간 후 세그먼트로 바뀔 때 메모리 영역이 할당됩니다.
초기화된 변수는 Data 영역에 저장되고, 초기화되지 않은 변수는 BSS (Block Stated Symbol)에 저장됩니다.
Data 영역과 BSS 영역의 차이점은
위 둘의 차이점은 Data 영역은 초기에 사용할 메모리를 초기화하는 반면, BSS는 런타임 이후에야 메모리 영역이 확보됩니다.
즉, BSS 영역을 사용하면 메모리 사용면에서 비교적 효율적이다. 선언 시 초기화할 필요가 없는 변수들을 할당할 때 사용됩니다.
힙(Heap) 영역
동적 메모리 할당
메모리의 힙(Heap) 영역은 사용자가 관리하는 그리고 must '관리해줘야 하는' 메모리 영역입니다.
배열의 크기가 확실하지 않고 변동이 있는 경우 등에 힙 영역을 활용하여 메모리를 할당합니다.
단, 사용한 이후에 메모리를 관리해주지 않으면 메모리 누수(memory-leak)가 발생합니다.
힙 영역은 사용자에 의해 동적으로 메모리가 할당되고 해제됩니다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다. ⬆️
스택(Stack) 영역
정적 메모리 할당
메모리의 스택(Stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역입니다.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료될 시에 소멸됩니다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
이러한 스택은 후입 선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
'Programming' 카테고리의 다른 글
SOLID 원칙 알아보기 (0) | 2023.01.28 |
---|