/* ----------- 시스템 할당을 다루기 위한 함수이다. -------------- */ /* sysmalloc은 시스템으로부터 더 많은 메모리를 요구하는 경우(즉 top chunk의 크기가 부족할 때) 실행된다. 시작부분에, av->top(top chunk)이 요청한 크기를 할당하기에 충분한 크기가 없다고 추정된다. 그러므로 av->top(top chunk)가 확장되거나 대체될 필요가 있다. */ static void * sysmalloc (INTERNAL_SIZE_T nb, mstate av) { mchunkptr old_top; /* incoming value of av->top */ INTERNAL_SIZE_T old_size; /* 그것의 크기 */ char *old_end; /* 그것의..
static void _int_free (mstate av, mchunkptr p, int have_lock) { INTERNAL_SIZE_T size; /* free시킬 크기 */ mfastbinptr *fb; /* 관련된 fastbin */ mchunkptr nextchunk; /* 인접한 청크 */ INTERNAL_SIZE_T nextsize; /* 인접한 청크의 크기 */ int nextinuse; /* 물리적으로 다음 청크가 사용줄일 때 셋팅 */ INTERNAL_SIZE_T prevsize; /* 물리적으로 이전 청크의 크기 */ mchunkptr bck; /* 링킹을 위한 임시 변수 */ mchunkptr fwd; /* 링킹을 위한 임시 변수 */ size = chunksize (p); //..
2019/08/09 - [분류 전체보기] - _int_malloc 함수 분석 (2) _int_malloc 함수 분석 (2) 2019/08/09 - [힙(heap)] - _int_malloc 함수 분석 (1) _int_malloc 함수 분석 (1) INTERNAL_SIZE_T nb; /* 요청한 크기를 알맞게 가공한 변수*/ unsigned int idx; /* 연관된 bin의 index */ mbinptr bin; /* 연.. youngsouk-hack.tistory.com 이 글과 이어지는 내용입니다. 안보셨으면 보고 오시는 것을 추천드립니다. } /* place chunk in bin */ if (in_smallbin_range (size)) { victim_index = smallbin_index ..
2019/08/09 - [힙(heap)] - _int_malloc 함수 분석 (1) _int_malloc 함수 분석 (1) INTERNAL_SIZE_T nb; /* 요청한 크기를 알맞게 가공한 변수*/ unsigned int idx; /* 연관된 bin의 index */ mbinptr bin; /* 연관된 bin */ mchunkptr victim; /* 검사할 or 선택된 청크 */ INTERNAL_SIZE_T size;.. youngsouk-hack.tistory.com 이 글과 이어지는 내용입니다. 이 글을 안보신 분들은 저 글을 먼저 봐주세요. #if USE_TCACHE /* While we're here, if we see other chunks of the same size, stash the..
INTERNAL_SIZE_T nb; /* 요청한 크기를 알맞게 가공한 변수*/ unsigned int idx; /* 연관된 bin의 index */ mbinptr bin; /* 연관된 bin */ mchunkptr victim; /* 검사할 or 선택된 청크 */ INTERNAL_SIZE_T size; /* 그것의 크기 */ int victim_index; /* 그것의 bin index */ mchunkptr remainder; /* 분할하고 남은 나머지 */ unsigned long remainder_size; /* 그것의 크기*/ unsigned int block; /* bit map traverser */ unsigned int bit; /* bit map traverser */ unsigned i..
mstate ar_ptr; mchunkptr p; /* chunk corresponding to mem */ 필요한 변수 선언 void (*hook) (void *, const void *) = atomic_forced_read (__free_hook); if (__builtin_expect (hook != NULL, 0)) { (*hook)(mem, RETURN_ADDRESS (0)); return; } 이전 글과 마찬가지로 더 공부한 뒤 나중에 설명하겠습니다. if (mem == 0) /* free(0) has no effect */ return; NULL 메모리를 free하는 것은 효과가 없다, p = mem2chunk (mem); if (chunk_is_mmapped (p)) /* release ..
mstate ar_ptr; void *victim; 필요한 변수를 선언한다. void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) return (*hook)(bytes, RETURN_ADDRESS (0)); calloc때와 마찬가지로 더 공부한 뒤에 따로 설명하겠습니다, ㅠ.ㅠ #if USE_TCACHE /* int_free also calls request2size, be careful to not pad twice. */ size_t tbytes; checked_request2size (bytes, tbytes); size_t tc_idx = csiz..
malloc관련 문서나 커널 문서에 가면 많이 보이는 이 함수들은 기능이 결과적으로 보면 비슷하다. 다 if문을 좀 더 효율적으로 동작시키기 위한 장치이다. 기본적으로 __builtin_expect는 __builtin_expect(조건식, 예상되는 값)이렇게 사용하는데 보통 if문의 조건식에 저 __builtin_expect함수를 넣어준다. 이 함수의 장점은 단순 if문보다 실행속도가 빨라진다는 것이다. https://stackoverflow.com/questions/7346929/what-is-the-advantage-of-gccs-builtin-expect-in-if-else-statements What is the advantage of GCC's __builtin_expect in if else ..