CS/컴퓨터 구조

[컴퓨터 구조](27)[동적 메모리]

황올뱀 2025. 3. 6. 18:43

동적 메모리 할당: 실행 중에 메모리를 할당
heap공간의 메모리 영역이 할당됨

  • 명시적 할당: 프로그래머가 직접 메모리 할당 관리
    예) C의 malloc & free
  • 묵시적 할당: 시스템이 메모리 할당 관리
    예) JAVA의 가비지 컬렉션

C의 동적 메모리 함수

  • malloc(size): size만큼의 동적 메모리 할당
    성공하면 메모리 블록 포인터 리턴
    실패하면 Null 리턴 후 errno 설정
  • free(포인터): 포인터에 있는 공간을 할당 해제
    malloc 등의 동적 메모리를 쓰고 나서 반드시 해야됨. (안하면 계속 공간 차지 -> 메모리 누수)
  • 기타
    calloc: 블록을 할당하고 0으로 초기화함
    realloc: 이전에 할당된 블록의 크기 변경
    sbrk: 힙을 늘리거나 줄이기 위해 사용

메모리 할당의 제약

    • 할당된 블록의 수, 크기 제어 불가능 & 할당 요청에 즉시 응답해야 함. (요청하면 무조건 따라야 함.)
    • 가용메모리에 블록을 할당해야 함. (malloc으로 할당된 공간 사용 불가)
    • 한번 malloc된다면 그 부분은 이동 불가

-> 메모리 할당의 제약으로 메모리 효율 하락

단편화: 메모리 공간이 비효율적으로 사용되는 현상

  • 내부 단편화: 실제 사용 공간보다 할당된 공간이 클 때 (할당받은 것 다 안씀) -> 고치기 간단
    예) 패딩을 위한 빈 공간, 자료 특성 고려하지 않은 일괄적 할당
  • 외부 단편화: 힙 메모리는 충분하나 할당된 공간으로 인해 공간이 작게 찢어져 큰 가용메모리가 없음 -> 향후 메모리 상황이 어떻게 될 지 모르므로 함부로 이동 못함 -> 고치기 어렵
    예) 할당된 블록: ■ 할당되지 않은 블록: □
    p1 = (int)malloc(4*sizeof(int));
    p2 = (int
    )malloc(3sizeof(int));
    p3 = (int
    )malloc(5*sizeof(int));
    여기까지 상태: ■■■■■■■■■■■■□□
    -----------------------------------------------
    free(p2);
    여기까지 상태: ■■■■□□□■■■■■□□
    -----------------------------------------------
    p4 = (int)malloc(4sizeof(int)); //문제 발생(공간이 모자름)
    실제로 힙 공간엔 크기 5의 여유가 있으나, 크기 4의 데이터를 저장 못함.
728x90
반응형