programing

malloc()는 내부적으로 어떻게 구현됩니까?

goodcopy 2022. 8. 30. 23:59
반응형

malloc()는 내부적으로 어떻게 구현됩니까?

누가 설명 좀 해줄래?malloc()사내에서 작동합니까?

나는 가끔 했다.strace program그리고 나는 많은 것을 봅니다.sbrk시스템 콜, 실행man sbrk에 사용되는 것에 대해 이야기하다malloc()그 이상은 아니야

심플하게malloc그리고.free다음과 같이 동작합니다.

malloc는 프로세스의 힙에 대한 액세스를 제공합니다.힙은 C 코어 라이브러리(일반 libc)의 구성체이며, 이를 통해 객체는 프로세스 힙의 일부 공간에 대한 배타적 액세스를 얻을 수 있습니다.

그 체제의 각각의 할당이 산더미 같이 쌓여 세포라고 불린다.이 일반적으로 세포 크기뿐만 아니라 다음 더미 세포에 대한 포인터에 정보를 저장한 헤더로 구성되어 있다.이 산적한 효과적으로 연결된 목록을 만들고 있었다.

때 프로세스를 시작하면 승자 그것은 모든 더미 우주가 시작할 때 할당된 단일 세포가 포함되어 있습니다.이 세포 그 체제의 무료 입장자 명부에 존재한다.

하나를malloc, 메모리에 의해 반환되는 큰 더미 세포에서 따온 것이다.malloc. 그리고 남은 자들은 기억의 모든 나머지로 구성된 새로운 더미 세포로 형성된다.

한 메모리를 비운 다음 해제합니다, 그 체제 세포 그 체제의 무료 목록의 끝에 추가됩니다.마친 뒤malloc걸어 무료 입장자 명부;면세품 목록 적당한 크기의 세포를 찾고 있다.

당연할 수 있는 힙 및 그 체제 관리자 시간이 되는 인접한 더미 세포 통합하기 위해 노력하고 세분화되어 얻을 수 있다.

없을 때 기억을 면세품 목표에 원하는 allocation, 남아 있지 않다.malloc전화brk또는sbrk어느 것이 시스템은 운영 체제에서 더 많은 메모리 페이지 요청 요구가 있고.

이제 몇가지 수정 히프 운항을 최적화하는 있다.

  • 대용량 메모리 할당(일반적으로 512바이트 초과)의 경우 힙 매니저는 OS로 직접 이동하여 전체 메모리 페이지를 할당할 수 있습니다.
  • 힙은 대량의 단편화를 방지하기 위해 최소 할당 크기를 지정할 수 있습니다.
  • 힙은 또한 큰 할당을 빠르게 하기 위해 작은 할당용과 큰 할당용 빈으로 나눌 수 있습니다.
  • 멀티 스레드 힙 할당을 최적화하는 현명한 메커니즘도 있습니다.

sbrk시스템 호출은 데이터 세그먼트의 "경계"를 이동합니다.즉, 프로그램이 데이터를 읽고 쓸 수 있는 영역의 경계를 이동하는 것입니다(AFIK는 데이터 크기를 늘리거나 줄일 수 있지만,malloc이 방법으로 메모리 세그먼트를 커널로 되돌립니다).그리고 또...mmap이는 파일을 메모리에 매핑하는 데 사용되지만 메모리 할당에도 사용됩니다(공유 메모리를 할당해야 하는 경우,mmap방법을 가르쳐 주세요).

커널에서 메모리를 늘리는 방법은 다음 두 가지가 있습니다.sbrk그리고.mmap커널에서 얻은 메모리를 정리하는 방법에는 다양한 전략이 있습니다.

한 가지 간단한 방법은 종종 "버킷"이라고 불리는 특정 구조 크기 전용 구역으로 분할하는 것입니다.예를 들어,malloc구현에서는 16, 64, 256 및 1024 바이트 구조에 대한 버킷을 생성할 수 있습니다.물어보면malloc지정된 크기의 메모리를 제공하기 위해 해당 숫자를 다음 버킷 크기로 반올림하고 해당 버킷의 요소를 제공합니다.더 넓은 영역이 필요한 경우malloc할 수 있다mmap커널에 직접 할당할 수 있습니다.특정 크기의 버킷이 비어 있는 경우malloc할 수 있다sbrk새 양동이를 넣을 공간을 더 확보할 수 있습니다.

여러 가지가 있다malloc설계 및 구현의 진정한 방법은 존재하지 않는 것이 바람직합니다.malloc속도, 오버헤드, 단편화/공간 효율의 회피 사이에서 타협이 필요하기 때문입니다.예를 들어, 구현에서 요소가 부족할 경우 요소를 더 큰 버킷에서 가져올 수 있습니다. 요소를 다 쓴 버킷에 요소를 분할하여 추가합니다.이것은 공간 효율이 매우 높지만 모든 디자인에서 가능한 것은 아닙니다.양동이를 하나 더 가져오면sbrk/mmap더 빠르고 더 쉬울 수 있지만 공간 효율은 그리 높지 않습니다.또, 이 설계에서는, 「공짜」라고 하는 것은, 다음과 같은 장소를 이용할 수 있도록 할 필요가 있는 것을 고려할 필요가 있습니다.malloc어떻게든 다시.기억을 재사용하지 않고 그냥 나눠주는 게 아니에요.

관심 있는 경우 OpenSER/Kamailio SIP 프록시에는 2가지 기능이 있습니다.malloc구현(공유 메모리와 시스템을 많이 사용하기 때문에 자체 구현 필요)malloc공유 메모리를 지원하지 않습니다).참조: https://github.com/OpenSIPS/opensips/tree/master/mem

GNU libc 구현에 대해서도 살펴볼 수 있지만, 매우 복잡한 IIRC입니다.

프로그램 브레이크 포인터를 단순히 움직이면brk그리고.sbrk실제로 메모리를 할당하는 것이 아니라 주소 공간만 설정합니다.예를 들어 Linux에서는 주소 범위에 액세스할 때 실제 물리적 페이지에 의해 메모리가 "백업"되어 페이지 장애가 발생하고 커널이 페이지 할당자를 호출하여 백업 페이지를 얻습니다.

언급URL : https://stackoverflow.com/questions/3479330/how-is-malloc-implemented-internally

반응형