The heap.
1.About heap.
일단 힙(Heap)이란 스택과는 달리 사용자가 직접 관리하는 메모리 영역.
Ex)
int* a; // stack에 저장.
a = (int *)malloc(sizeof(int) * 10); //heap에 저장.
위 코드에서 int형 포인터 변수 a를 선언했고, 이건 일반적인 포인터형 변수이다.
따라서 stack 영역에 저장된다.
다음줄의 malloc()함수는 힙 영역에 int형(4byte) 10개의 공간만큼을 할당.
그 영역에 대한 주소값을 리턴한다. 이 리턴값을 a라는 변수에 저장한다.
-----------------------------------------------
| | |
| a < = 4 * 10(40bytes) |
| | |
대략적으로 이런 모양이다. 중요한 것은 사용자가 힙 영역에 이처럼 메모리를 할당한 경우 필요없을 경우에는
무조건 사용자가 직접 해제해줘야 한다. 그렇지 않으면, 프로그램을 종료해도 메모리 공간은 계속 할당된 상태로
남아있어 다른 프로그래이 사용할 수 없게 된다.
cf)free(a); // 메모리 해제.
메모리를 해제하고 나면 위 그림의 영역은 다시 깨끗한 상태로 되며, 왼쪽 스택 영역의 a변수가 그대로 남아있다.
신경쓸 필요가 없는 게 스택 영역은 OS가 알아서 관리한다.
즉 힙 영역에 저장된 데이터의 목숨은 사용자가 관리한다.
2.mmap.
mmap은 메모리의 내용을 파일이나 디바이스에 대응하기 위해 사용하는 시스테 호출.
2-1 메모리 관리와 mmap
각각의 프로세스는 프로세스마다 다른 프로세스와 중복되지 않는 주소공간을 가지게 된다.
주소 공간은 논리적인 3개의 세그먼트로 분할된다.
프로세스 메모리는 기본적으로 다른 프로세스 메모리와 공유되지 않는다. 프로세스의 데이터를 보호하기 위해서
반드시 필요한 기능이지만, 다른 프로세스와 특정 데이터를 공유하기 위해서는 불필요하는 기능이 되기도 한다.
그래서 IPC를 사용하게 된다. mmap은 메모리의 특정 영역을 파일로 대응시킬 수 있도록 도와준다.
파일은 시스템 전역적인 객체이므로 다른 프로세스에서 접근가능하도록 할 수 있고, 이런 mmap의 특징 때문에 IPC로 사용가능하다.
cf) mmap이 IPC용도로 사용가능하지만 IPC 설비는 아니다. mmap는 프로세스의 주소 공간을 파일에 대응시킨다. 파일은 운영체제
전역적인 자원이므로 다른 프로세스와 공유해서 사용할 수 있다.
3.malloc
malloc()은 size 크기만큼 메모리를 동적으로 할당하기 위해서 사용한다.
malloc()은 호출에 성공한 뒤 할당된 메모리 영역을 가르키는 포인터를 반환한다.
malloc()을 이용해서 할당된 메모리 영역은 자동으로 clear 되지 않는다.
더 이상 사용하지 않는 메모리 영역은 반드시 free()를 이용해서 clear 해줘야 하고,
그렇지 않을 경우 메모리 누수가 일어날 수 있다.
cf)
calloc()는 size 크기를 가지는 nmemb 요소 만큼의 공간을 할당한다. 메모리는 0으로 설정된다.
realloc()는 ptr가 가르키는 메모리 영역의 크기를 size만큼 조절한다.
메모리 영역에 있던 데이터는 그대로 남아 있게 된다. 만약에 ptr가 NULL을 가리키고 있었다면 malloc(size)와
동일한 수행을 보여준다. size가 0이라면 free(ptr)과 동일한 수행을 보여준다.
free()는 ptr가 가르키는 메모리 영역을 해제한다 malloc(), calloc(), realloc()를 사용한 메모리 영역을 더 이상 사용하지 않는다면
free()를 호출해서 자원의 낭비를 막도록 한다. ptr가 NULL이라면 아무런 일도 수행하지 않는 경우가 된다.
malloc()는 할당된 메모리를 가리키는 포인터를 리턴한다. 실패했다면 NULL를 리턴한다.
Ex)
4.brk,shrk.
시스템 콜 ---> brk() - sbrk()
즉 데이터 세그먼트 영역을 넓혀준다. 즉 세그먼트 끝을 연장한다.
brk(), sbrk()의 반환형의 차이를 보면
#includeint main() { printf("brk(0) : %d \n", brk(0)); printf('sbrk(0) : %p \n", sbrk(0)); return 0; } ====================================== [allblack@test] ./a.out brk(0) : 0 sbrk(0) : 0x8efe000
출처. https://www.youtube.com/watch?v=HPDBOhiKaD8&list=PLhixgUqwRTjxglIswKp9mpkfPNfHkzyeN&index=21
'#Tip' 카테고리의 다른 글
Process & Thread. (0) | 2018.04.07 |
---|---|
The heap 2. (0) | 2018.04.07 |
PLT and GOT (0) | 2018.04.06 |
Function Prologue & Epilogue. (0) | 2018.04.06 |
Gdb basic command. (0) | 2018.04.05 |