ipwn

[memory] 메모리 구조 본문

Programming

[memory] 메모리 구조

ipwn 2018. 1. 8. 09:40
프로그램이 실행 되려면 프로그램이 메모리에 먼저 로드가 되어야 한다.

또, 프로그램에 사용되는 변수들을 저장할 메모리 공간도 필요하다.

메모리 구조에는 대표적으로 

1. 코드 (code)영역

2. 데이터 (data)영역 + BSS (Block Stated Symbol) 영역

3. 스택 (stack)영역

4. 힙 (heap)영역 

이런 식으로 크게 네 가지, 세세하게 다섯 가지 정도가 있는데, 설명하기에 앞서 

먼저 다음 그림은 운영체제가 제공하는 메모리 공간을 표현한 그림이다.




1. 코드 (code) 영역

메모리 낮은 주소에 속하는 코드 영역은 실행할 프로그램의 코드를 저장하는 영역으로 텍스트 영역이라고도 부른다.

CPU는 코드 영역에 저장된 명령어를 하나 하나 씩 가져가서 처리하는데, 이러한 코드 영역은 Hex파일이나 Bin파일 

메모리 영역이다.


2. 데이터 (data) 영역

데이터 영역은 프로그램의 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장되는 

메모리 영역이며, 프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환 되는 메모리 영역이다.

초기화 된 데이터는 data 영역에 저장되고초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.

함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될 때 초기화 된다.



3. 스택 (stack) 영역


프로그램이 자동으로 사용하는 임시 메모리 영역이며, 지역(local) 변수, 매개변수(parameter), 리턴 값 등 


잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다. stack memory는 함수 호출 시 생성되고, 함수가 끝나면 


시스템에 반환 된다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.


스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 


스택 사이즈를 바꿀 수는 없다. 명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.


스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. 이러한 스택은 


후입선출(LIFO, Last-in First-Out) 방식에 따라 동작하기 때문에 가장 늦게 저장된 데이터가 가장 먼저 인출된다.



4. 힙 (heap) 영역



힙 영역은 필요에 의해 동적으로 메모리를 할당 하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며, 


메모리 주소값에 의해서만 참조되고 사용되는 영역이다. C에서는 이 영역에 데이터를 저장하기 위해서


malloc,calloc,realloc 같은 함수를 사용한다. 힙 영역은 스택 영역과는 반대로 메모리의 낮은 주소에서 높은 


주소의 방향으로 할당된다. 메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 


메모리 영역이라고 할 수 있다.


이러한 메모리 구조들을 C 코드로 표현하자면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
 
#include<stdlib.h>
 
int n = 0;//n은 초기화 된 전역변수로써 데이터 영역에 저장
 
int multi(int n1) {// n1은 매개변수로써 스택에 저장
 
    static int test;//test는 초기화 되지 않은 정적변수로써 BSS에 저장
 
    int n2 = 3;//n2는 지역변수로써 스택에 저장
 
    return n1 * n2;//리턴 값도 스택에 저장
 
}
int main() {
 
    scanf("%d"&n);//scanf와 같은 코드는 코드 영역에 저장
 
    int *pArr= (int *)calloc(1sizeof(int* n);//동적할당된 메모리는 힙에 저장
 
    printf("%d", multi(n));//printf와 같은 코드는 코드 영역에 저장, 반환 된 + 출력 될 multi(n)의 값은 데이터 영역에 저장
 
}
cs


위와 같이 설명 및 표현 할 수 있다.



'Programming' 카테고리의 다른 글

C) 포인터, 문자와 문자열 처리 함수, 구조체  (0) 2017.12.27
C) 코드업 함수문제 풀이  (0) 2017.12.18
C) swap 함수 구현  (0) 2017.12.18
C) 포인터  (0) 2017.12.18
C) strlen, strcmp, strcpy 함수 조사 및 구현  (0) 2017.12.18
Comments