Bin.
bin 종류는 다음과 같다.
1.Fast bin
2.Small bin
3.Large bin
4.Unsorted bin
bin 정보는 "malloc_sttate" 구조제에서 관리된다.
==>FastbinsY==>"Fast bin"을 관리한다.
==>Bins==> "Unsorted bin, Small bin, Large bin"을 관리한다.
===> Bins의 구성 ===> index 1 ==> Unsorted bin
index 2 ~ 63 ==> Small bin
index 64 ~ 146 ==> Large bin
1-1 Fast bin.
==>LIFO 방식을 사용.
==>10개의 bin 사용
==>해제된 Fast chunk를 보관.
==>속도 향상을 위해 single-linked list로 구성
==> 처리하는 메모리의 최대 크기는 "global_max_fast"에 의해 결정된다.
==> Free chunk가 서로 인접해 있어도 하나의 Free chunk로 병합되지 않는다.
2-1 Small bin.
==> FIFO 방식을 사용.
==> 62개의 bin 사용.
==> 해제된 Small chunk를 보관.
==> doubly-linked list로 구성된다.
==> 512byte 미만의 크기를 가지는 chunk를 위한 bin.
==> 2개의 Free chunk가 서로 인접해 있을 수 없고, 2개의 서로 인접해 있는 경우 하나의 Free chunk로 병합된다.
3-1 Large bin.
==> 63개의 bin을 사용.
==> 해제된 Large chunk를 보관.
==> doubly-linked list로 구성된다.
==> 512byte 이상의 크기를 가지는 chunk를 위한 bin.
==> Small bin처럼 동일한 크기의 chunk만을 포함하지 X.
==> 해당 index(일련번호)가 나타내는 크기보다 작은 크기의 chunk들도 모두 포함.
cf) 할당의 효율성을 높이기 위해 해당 bin내에서 크기 별로 정렬된다.
이 때 fd_nextsize와 bk_nextsize 필드가 이용된다.
==> 2개의 Free chunk가 서로 인접해 있을 수 없다.
==> 2개의 Free chunk가 서로 인접해 있을 경우 하나의 Free chunk로 병합된다.
4-1 Unsorted bin.
==> 1개의 bin만 사용.
==> doubly-linked-list로 구성된다.
==> 해제된 Small,Large chunk를 보관.
==> 적절한 bin을 찾는 시간이 적기 떄문에 할당과 해제의 처리 속도가 빠름.
==> Chunk 크기에 대한 제한이 없기 때문에 다양한 크기의 청크가 해당 bin에 저장될 수 있다.
==> free()된 chunk는 unsorted bin에 보관되며, 메모리 할당시 동일한 크기의 영역을 다시 요청하는 재사용.
==========> 즉 다시 요청하는 경우 bin은 FIFO 방식을 사용.
==========> chunk는 재할당 or 원래의 bin으로 돌아간다.
==========> 즉 해제한 chunk를 재사용하기 위해 chunk 해제 후 바로 동일한 크기의 chunk를 생성해야 한다.
'#Tip' 카테고리의 다른 글
About IDA shortcut. (0) | 2018.04.07 |
---|---|
Heap unlink. (0) | 2018.04.07 |
Chunk. (0) | 2018.04.07 |
Arena. (0) | 2018.04.07 |
Process & Thread. (0) | 2018.04.07 |