← All Posts

[TIL] 261001 공부기록

malloc 공부시작

TIL#

오늘은 목요일이라 어제 준비한 발표를 진행했다 아쉽게도 너무 긴장을 많이 해서 준비한거에 비해 말하고자 준비한 내용이 새하얗게 되는바람에 제대로 못했다.. 지난주 퀴즈부터 좀 쉽지않은것같기도..; 발표이후엔 차주과제가 시작됐는데 malloc구현이였고 지금까지 만들어져있는함수를 쓰기만했고 malloc을 제대로 공부해본적이 없어서 구현하기전에 잠깐 공부해보기로 했다

배운점#

malloc은 c표준 라이브러리에서 제공하는 명시적 동적 메모리 할당자의 대표적인 함수인데 프로그램중에 필요한 메모리를 동적으로 요청받아 힙영역에 할당하는 원리를 가지고있다

기본역할은 힙영역에서 동작을 하는데 가상메모리 공간에서 미초기화 데이터 영역 바로 다음에 위치하고 높은주소 방향으로 성장하는 힙영역의 메모리를 관리한다. 커널은 힙의 최상단을 가리키는 브레이크 포인터를 유지하고, 다른 역할로는 포인터를 반환하는데 사용자가 요청한 크기 이상의 메모리 블록을 할당한 후에 해당블록 첫번째 바이트를 가리키는 포인터를 반환한다.

마지막으로는 힙확장을 할수있는데 가용메모리 요청을 충족할수없을때 커널의 sbrk의 시스템콜을 호출해서 brk포인터를 올려 힙공간을 확장한다

malloc은 블록 형태로 메모리를 구성하는데 헤더와 payload, padding,alignment(정렬제약)이있다. 헤더는 블록의 맨앞에 위치하고 블록 전체 크기와 할당여부를 저장하는 메타 데이터다 payload는 사용자가 malloc을 통해 실제로 요청하여 데이터를 저장하는공간이고 패딩은 정렬조건에 맞춰 외부 단편화를 방지하기위해 블록 뒤쪽에 빈공간을 추가한다 마지막으로 alignment 정렬제약은 환경에 따라 바이트 크기에 맞춰 최소 블록 크기와 정렬을 유지한다

malloc의 처리과정으로는 요청크기를 보정하고 가용블록을 탐색하는데 가요이블록은 힙 내부의 가용블록목록을 순회하면서 보정된 크기를 수용할수있는 가용블록을 찾는다. 블록분할은 찾은 가용브록이 요청한 크기보다 크다면 필요한 크기만큼 할당블록으로 바꾸고 남은부분은 새로운 가용블록으로 분할한다 힙확장은 시스템 콜을 호춣서 힙공간 확장을 요청하고 새 가용블록을 확보한다

느낀점#

malloc 힙영역을 이번기회에 제대로 공부를 시작하고 커널이 어떤 역할을 하는지 조금알게됐다. 더공부하고 malloc에 대한 글을 정리해볼까 한다.. 발표가 아쉬웠는데 다음 발표는 제대로 준비해보기로..ㅠㅠ