# ptmalloc2

3개의 포스트

ptmalloc2

이번에 malloc을 구현하는 과제를 시작했다. 메모리 할당자를 구현하려면 고려해야할 부분들이 정말 많다(메모리 절약, 메모리 단편화 최소화, 속도, 지역성, 오류감지 등). 구현하기 앞서 glibc malloc이 어떻게 구현되어 있는지 궁금해서 찾아보았고 알게된 내용들을 정리하고자 한다. ptmalloc2 리눅스 초기에는 dlmalloc을 사용했었다. dlmalloc은 둘 이상의 스레드가 동시에 호출할 경우 메모리가 공유 되었기 때문에 하나의 스레드만 임계 영역에 진입할 수 있었다. 따라서 퍼포먼스가 저하되는 문제가 있었다. ptmalloc2는 스레드마다 별도의 힙 영역을 유지함으로써 이러한 문제를 해결했고 리눅스의 기본 메모리 할당자가 되었다. 큰 틀을 이해하기 위해 전체적인 구조를 먼저 알아보겠습니다. Chunk ptmalloc2는 힙을 여러 개의 청크로 나누어 관리한다. 청크는 메타 데이터를 담고 있는 헤더와 유저 데이터로 구성된다. `prev_si

2023년 7월 17일
·
1개의 댓글
·
post-thumbnail

ptmalloc2 - 1

ptmalloc2? 리눅스에서는 malloc을 통해서 메모리 할당을 할 때에 내부적으로 ptmalloc이라는 함수가 실행된다. 앞으로 편의를 위해 malloc으로 지칭할 것이다. 목표 메모리 낭비 방지 빠른 메모리 재사용 메모리 단편화 방지 구성 요소? chunk 말 그대로 덩어리라는 뜻. malloc을 통해 메모리를 할당하면 생기는 메모리 블럭. 64비트 architecture에서 16바이트 단위로 chunk가 할당된다. 기본적으로 header + data로 구성되어 있다. header의 구성 요소 prev_size address space 상에서의 직전에 할당된 chunk의 크기. size chunk 자신의 할당된 크기. flags A(allocated arena) 자신이 어느 arena에 속해있는지. 후에 서술 예정 M(mmapped) heap 영역인지 mmapped된 메모

2023년 6월 26일
·
0개의 댓글
·
post-thumbnail

ptmalloc2에 관한 정보..

chunk의 크기에 대한 정보.. 할당할 수 있는 메모리 사이즈는 16바이트의 배수로 정렬된다고 한다. 즉, 필요 바이트 수가 32라면 32바이트가 할당되고, 33이 되는 순간 48바이트가 할당되는 식이다. 그런데 malloc에는 헤더가 존재하고, 이 헤더가 가지는 크기가 16바이트이다. 기본 16바이트를 가지고 있기 때문에 32바이트를 할당하려고 하면 48바이트가 할당되게 된다. 이상한 점 그렇다면, 33바이트를 할당시키려고 하면 총 48 < 33 + 16 < 64 이므로 64바이트가 할당되어야 할 텐데, 실제로 할당된 바이트 수를 보면 48바이트가 할당되었다고 나온다. ???? 해결 chunk의 구조를 보면 첫 8바이트는 prev_size에 해당한다. prev_size가 필요한 이유 : chunk가 할당 해제될 때에 이전 chunk 또한 free 상태라면 병합이 되게 된다. (두 번째 8바이트

2023년 5월 10일
·
0개의 댓글
·