STACK : history기능을 가짐,
Heap : 메모리를 빌려줄 수 있음
stack, heap : 전역변수 배열로 선언되어있음
Stack : 뭔가를 쌓는 구조의 Memory 영역
Stack : LIFO (Last In, First Out) 자료 구조
Push : Stack에 자료를 집어 넣음
Pop : Stack에서 자료를 빼는 것
ex 1) DOS, UNIX, LINUX cmd 창에서 쓸 수 있는 history기능
↑ 위쪽 화살표 키를 계속 누르면 가장 최근에 입력했던 command에서부터 다시 보여주줌
ex 2) 우 Window Application 등에서 ctrl - z (취소) 버튼을 계속 누르면 가장 최근에 작업했던 것부터 점점 차례대로 취소해줌
> Stack : history기능을 포함
구현)
push (0x1);
push (0x2);
push (0x3);
pop (); /* 0x3 */
pop (); /* 0x2*/
pop (); /* 0x1 */
Heap : Heap도 Stack 처럼 쌓아 올린 더미라는 뜻
: 동적 할당에 사용 > Linked List, Tree구조
동적 할당 : 가변적인 양만큼의 Data를 처리하기 위함
ex)
메모리를 얼마나 쓸지 모름
> 모두다 공통으로 쓸만한 메모리 영역을 미리 확보해 놓음
> 필요한 녀석만 필요할 때마다 필요한 만큼씩만 공통으로 확보해 놓은 메모리 영역에서 잠시 빌려다씀
alloc, free
malloc : 메모리를 빌려올 때 (할당 받을 때, allocation),
free(해제 할 때) : 빌려온 메모리를 다시 돌려줄 때. (C++에서는 new )
ex)
Size를 미리 알 수 없는 integer Array를 쓰고 싶을 때 그 크기를 입력 받아 Array를 선언하는 방법
void HEAP (int n)
{
int *p;
p = (int *)malloc((sizeof(int))*n);
// int * n
// 곱셈임
........어쩌구 저쩌구..........
}
integer size를 n개 만큼 연속적인 Memory 영역을 heap으로 부터 가져 오는데,
*p : array의 첫번째
*(p+1) : array의 두 번째
~= array
Heap 메모리 영역 : Run Time동안 가변적인 크기의 기억장소를 할당, 해제가 되풀이 되는 영역
<>Stack과 달리 빌려가고 돌려주는 Memory의 양이나 회수는 일정한 규칙 없음
> 100 byte, 2 byte, 10 byte를 순서대로 heap 영역에서 빌린 후
> 2 byte짜리를 먼저 갚음 > 중간에 2byte 구멍이 생김 // 자투리공간
ex)
void *p4 = malloc(20); 추가할당
> p2 로안들어가고 p4라는 새로운공간 만듬
: p2는 빈공간으로 남아버림 >재활용 x
> Fragmentation (단편화) > 비효율
> 누가 빌려가고 누가 돌려 주었는지를 시시각각 monitoring 해주어야함
free를 안해준다면..
>메모리 부족현상 // 빌려오면 꼭 갚아야 하는 것이 세상이치!
"메모리 누수 현상 (Memory Leakage)"
할당을 받을 pointer를 local로 선언 > free X > 함수 return
> 다시 돌려줄 방법도 없음
+ 계속 누적시 메모리 공간이 꽉차버림
'임베디드 > 임베디드 레시피' 카테고리의 다른 글
stack : 함수를 불렀을때 (1) | 2024.12.06 |
---|---|
stack initialization (0) | 2024.12.05 |
struct , packed (0) | 2024.12.05 |
Pointer (0) | 2024.12.04 |
Context와 AAPCS (0) | 2024.12.03 |