본문 바로가기
정글

TIL(20일차) 동적 메모리 할당

by 진득한진드기 2023. 5. 14.

 

동적 메모리 할당기는 힙 이라고하는 프로세스의 가상메모리 영역을 관리한다.

 

할당기는 힙을 다양한 크기의 블록들의 집합으로 관리한다.

 

각 블록은 할당되어있거나 가용한 가상메모리의 연속적인 묶음이다.

 

할당된 블록은 응용하기 위해 명시적으로 보존되었다. 가용한 블록은 할당을 위해 사용할 수 있는데,

 

할당된 블록은 응용에 의해 명시적으로 또는 메모리 할당기 자신에 의해 암묵적으로 반환될때 까지 남아있다.

 


Malloc

 

malloc 함수는 블록 내에 포함될 수 있는 어떤 종류의 데이터 객체에 대해서 적절히 정렬된 최소 size 바이트를 갖는 메모리 블록의 포인터를 리턴한다.

 

malloc은 리턴 메모리를 초기화하지 않는다.

 

초기화환 동적 메모리를 원한다면 calloc을 사용할 수 있다. 할당된 메모리를 0으로 초기화하는 calloc 함수가 있다.

 

할당된 크기를 변경하는 함수는 realloc함수를 사용한다.

 

또 malloc 같은 동적 메모리 할당기는 mmap과 munmap함수를 사용해서 명시적으로 힙 베모리를 할당하거나 반환하며, 또는 sbrk함수를 사용할 수 있다.

 

sbrk 함수는 커널의 brk 포인터(힙의 최상단 포인터)에 incr을 거해서 힙을 늘리거나 줄인다.

 


Free

free의 동작은 정의되지 않는다.

 

free는 무엇을 리턴하지 않기때문에 잘못된 점을 알릴 수 없다.

 

free 함수를 간단하게 생각하면 할당된 힙 블록을 반환해서 할당된 곳을 풀어준다고 생각하면 편하다.

 

 


할당기 요구사항 목표

 

만약 명시적 할당기를 만든다고 하면 제한사항들을 지켜야한다.

 

제한사항은 다음과 같다.

 

1. 임의의 요청 순서 처리하기:

각각 가용 블록이 이전의 할당 요청에의해 현재 할당된 블록에 대응되어야하면서 , 임의의 순서로 할당과 반환 요청을 할 수 있어야한다.

 

2. 요청에 즉시 응답하기 :

할당기는 블록들을 이들이 어떤 종루의 데이터 객체라도 저장할 수 있도록 하는 방식으로 정렬해야한다.

 

3. 힙만 사용하기 :

비확장성 자료 구조들은 힙자체에 저장되어야한다.

 

4. 할당된 블록을 수정하지 않기:

할당기는 가용 블록을 조작하거나 변경할수만 있다. 블록이 할당되면 이들을 수정하거나 이동하지 않는다.

 

 


 

단편화

 

나쁜 힙이용도의 이유는 단편화 이다.

 

단편화란 가용 메모리가 할당 요청을 만족시키에 가용하지 않을 때 일어나는데,

 

내부 단편화와 외부 단편화가 존재한다.

 

내부단편화는 할당된 블록이 데이터 자체보다 더 클 때 일어나는 현상을 의미한다.

 

간단하게 보면 할당된 블록의 크기와 이들의 데이터 사이의 차이의 합이다.

 

그래서 어디서든 내부 단편화의 양은 이전에 요청한 패턴과 할당기 구현에만 의존한다.

 

외부 단편화는 할당 요청을 만족 시킬 수 있는 메모리 공간이 병합한 크기는 가능하지만 단일한 가용블록이 없는 경우를 의미한다.

 

외부 단편화는 측정하기 어렵고 예측하기 불가능하기 때문에 더 작은 가용블록 들보다는 더 적은 수의 더 큰 가용 블록들을 유지하려는 방법들을 채택한다.

 

 


 

구현개념

 

가용 블록 구성: 어떻게 가용 블록을 지속적으로 추적하는가?

배치 : 새롭게 할당된 블록을 배치하기 위한 가용블록을 어떻게 선택하는가?

분할 : 새롭게 할당한 블록을 가용 블록에 배치한 후 가용 블록의 부분들로 무엇을 할 것인가?

연결 : 방금 반환된 블록으로 무엇을 할 것인가?

 

 

'정글' 카테고리의 다른 글

(TIL22일차) 저장장치  (0) 2023.05.17
TIL(21일차) 메모리 할당기 제작 기초  (1) 2023.05.17
TIL(19일차) 예외흐름 제어  (1) 2023.05.13
WIL (RB트리 vs AVL트리)  (1) 2023.05.11
TIL(18일차) RB트리 삭제  (0) 2023.05.10