CSAPP 9.9 동적 메모리 할당(808~822) 내용 정리
Heap
이라는 가상메모리 영역을 다양한 크기의 블록들의 집합
으로 관리한다.할당된 블록
과 가용 블록(free block)
으로 나뉜다.명시적 할당기
와 묵시적 할당기
로 나뉜다.malloc
이 있다. 명시적으로 할당된 블록을 반환해줄 것을 요구한다.garbage collector
가 있다 . 더 이상 프로그램에 의해 사용되지 않는 블록을 자동 반환시켜준다.: 프로그램을 실제 실행시키기 전에는 자료의 크기를 알 수 없는 경우가 빈번하기 때문에
: 런타임 시, 필요한 자료의 크기를 파악한 후 동적 할당해주면 된다.
=> 배열의 최대 크기는 가용한 가상메모리 양에 한해서 제한.
: 처리량 극대화와 메모리 이용도 최대화(서로 상충하는 가치)
** swap : 프로그램을 많이 실행하여 물리적 메모리(RAM)의 용량이 가득차면, 하드 디스크 공간을 메모리 공간처럼 교환(swap)하여 사용한다. 이후, 메모리가 다시 여유가 생기면 하드디스크에서 메모리로 옮겨온다.
: 가용 메모리가 할당 요청을 만족시키지 못하는 현상
: 할당된 블록이 데이터 자체보다 더 클 때 발생
: 내부 단편화 정도 = 할당된 블록 크기 - 데이터 크기
: 메모리 전체적으로는 할당에 필요한 공간이 충분하지만, 이 요청을 처리할 단일한 가용블록은 없는 경우
: 측정의 어려움(미래의 요청에 의존하기 때문 = 예상이 어렵다)
: 처리량을 극대화하면서 메모리 이용도를 최대화하기 위해 고려해야할 이슈
글의 플로우를 음미하며 읽어보자. 최대한 술술 읽히도록 노력했다.
: 할당기는 할당된 블록과 가용 블록을 구분하는 데이터 구조(묵시적 가용 리스트 or 명시적 가용 리스트)를 필요로 한다.
헤더(1워드)
: 블록 크기(최소 블록 크기 조건에 따름), 할당 여부
: 마지막 3비트는 다른 정보를 인코드하기 위해 남겨둔다.
데이터
: malloc이 요구한 데이터
패딩
: 패딩의 존재 이유
1) 외부 단편화 극복
: (내 생각) 데이터 할당 시 조금 씩 남는 메모리가 쌓여 요구한 데이터 크기에 충분한 만큼 쌓이게 되지만 단일한 가용 블록은 존재하지 않는 상황이 발생할 수 있다. 따라서 패딩을 통해 조금씩 남는 메모리들을 모두 할당시켜버리면 외부 단편화를 극복할 수 있다.
2) 정렬 요구사항 만족
: (내 생각) 위 그림을 보면 알 수 있듯이 각 블록의 헤더에 파일 크기를 보고 암묵적으로 다음 블록의 위치를 파악할 수 있기 때문에 묵시적 연결이라고 말한다.
: 단순성
: 할당 블록과 가용 블록의 헤더를 모두 확인해서 할당되어 있는 지 확인해봐야 하기 때문에 탐색에 있어서 전체 블록 수에 비례한다.
: k바이트의 블록 요청 시, 할당기는 요청 블록의 데이터 크기에 충분한 가용 블록을 리스트에서 검색한다.
First Fit
: 가용 리스트를 처음부터 검색하여 크기가 맞는 첫번째 가용 블록 선택
: 장점
- 리스트의 마지막에 가장 큰 가용 블록을 남긴다.
: 단점
- 리스트의 앞에 작은 가용 블록들을 남긴다 => 검색시간 늘어난다(크기가 맞지도 않은데 헤더 정보를 다 확인해야해서)
Next Fit
: 이전 검색이 종료된 지점에서 검색 시작
: 장점
- First Fit 보다 빠름
: 단점
- First Fit 보다 안좋은 메모리 이용도
Best Fit
: 모든 가용 블록을 검사하여 크기가 맞고 가장 작은 블록 선택
: 장점
- 앞의 두 배치 방식 보다 메모리 이용도 좋음
: 단점
- 힙을 모두 검색해야한다
: 크기가 맞는 가용 블록을 찾고 나면 가용 블록의 어느 정도를 할당할 지 결정하는 과정
: 총 2 옵션이 존재한다.
: 할당기가 할당한 블록을 반환할 때, 인접한 가용 블록들이 있다면 그 블록들과 연결할 수 있다.
: 각 블록의 끝 부분에 푸터(footer, 경계태그) 추가한다.
: 푸터는 헤더를 복사한 것이다.
: 반환할 블록의 인접한 가용 블록의 푸터에 블록 사이즈를 갱신해주는 것으로 쉽게 연결할 수 있는 방법이다. (CSAPP 821page 그림 9.40 참고)
: 할당기가 요청한 블록을 찾을 수 없을 때 두 옵션이 있다.
: 모든 가용 블록을 물리적으로 연결하여 큰 가용 블록을 만든다.
: 그래도 블록 보다 데이터 크기가 크면, 추가적인 힙 메모리를 요청(sork 함수)
할 수 있다.