임베디드/임베디드 레시피

Stack , Heap

twoweeks-within 2024. 12. 5. 20:36

 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