malloc에서는 왜 brk를 사용합니까?왜 그냥 mmap을 사용하지 않습니까?
의 :malloc
사용하다brk
/sbrk
OS에 메모리를 청구하는 주요 수단으로 사용됩니다.e를 사용합니다.mmap
큰 할당을 위해 청크를 얻는 것입니다.까를 하는 것에 ?brk
mmap
요?요로 mmap
?
(참고: 사용합니다.sbrk
그리고.brk
한 Linux다에 서는 서로 할 수 있습니다.brk
.)
여기 로, 를 glibc 를 하는 몇 .malloc
:
GNU C 라이브러리 참조 매뉴얼:GNU 할당자
://
: glibc : Malloc
://
과 같습니다.sbrk
하는 데 mmap
됩니다를 하는 데 됩니다.mmap
또한 큰 객체("페이지보다 큰 much")에 대한 공간을 주장하는 데 사용됩니다.
힙 ( )로 )sbrk
및 ) mmap
됩니다는 한 몇가지 합니다.
할당된 아레나 - 메인 아레나는 응용 프로그램의 힙을 사용합니다.e
mmap
수북이. 적용되는지 알아야 .청크를 힙에 매핑하려면 어떤 경우가 적용되는지 알아야 합니다.이 비트가 0이면 청크는 메인 아레나와 메인 힙에서 나옵니다.가 1됩니다.mmap
할 수 라고 했습니다.
은 [Glibc malloc 는했습니다]에서되었습니다.ptmalloc
, 1987년에 시작된 dlmalloc에서 유래되었습니다.]
jemallloc manpage (http://jemalloc.net/jemalloc.3.html) 는 다음과 같이 말합니다.
다음을
sbrk(2)
인종 조건, 증가된 단편화, 최대 사용 가능한 메모리에 대한 인위적인 제한을 포함한 여러 이유로 최적이 아닌 메모리를 얻기 위해. 만약sbrk(2)
이되며,합니다를 합니다.mmap(2)
그렇지 sbrk(2),대로,면,만.mmap(2)
사용됩니다.
그래서 여기서도 이렇게 얘기를 하죠.sbrk
최적이 아니지만 코드를 작성하는 데 어려움을 겪었음에도 불구하고 코드를 사용하지 않고도 작동합니다.
[제말록의 집필은 2005년에 시작되었습니다.]
업데이트: 이것에 대해 더 생각해보면, "선호하는 순서대로"라는 부분은 제게 문의에 대한 선을 보여줍니다.왜 선호도가 높은가요?그들은 단지 사용하는 것입니까?sbrk
mmap
필요한 나음),할 수 합니다.sbrk
그러나 그렇지는mmap
수 그들의 코드를 보고 그게 무엇을 하는지 알아낼 수 있는지 알아보겠습니다.
수거 을 시행하고 까지 C 에 다른 mmap
게 건 그런데 혹시 제가 놓친 부분이 있는 것은 아닌지 궁금합니다.
할 ().brk
, 내가 사용해야 할 필요가 있을 수도 있다는 거죠.malloc
어느 시점에서.)
중인 mmap(2)
당 (한 할 수 있는 다이기 에 메모리 1회는 범용 한 접근 . 왜냐하면 할당 세분성(한 번에 할당될 수 있는 가장 작은 개별 단위) 때문입니다.mmap(2)
이다.PAGESIZE
(보통 4096 바이트), 그리고 느리고 복잡한 syscall이 필요하기 때문입니다.단편화가 적은 소규모 할당의 할당자 빠른 경로는 시스콜이 필요하지 않습니다.
따라서 어떤 전략을 사용하든 glibc가 메모리 영역이라고 부르는 것의 여러 개를 지원해야 하며, GNU 매뉴얼은 "여러 개의 영역이 있으면 여러 스레드가 개별 영역에서 동시에 메모리를 할당할 수 있으므로 성능이 향상됩니다."라고 언급합니다.
jemallloc manpage (http://jemalloc.net/jemalloc.3.html) 는 다음과 같이 말합니다.
전통적으로, 할당기는 sbrk(2)를 사용하여 메모리를 얻었는데, 이 메모리는 인종 조건, 증가된 단편화, 최대 사용 가능한 메모리에 대한 인위적인 제한 등 여러 가지 이유로 인해 최적이 아닙니다.sbrk(2)가 운영 체제에서 지원되는 경우 이 할당기는 mmap(2)과 sbrk(2)를 모두 사용하며, 선호 순서대로 사용하지 않으면 mmap(2)만 사용됩니다.
중 도 현대의 못합니다.sbrk(2)
로는 로는 상황은 처리됩니다레이스 상황은 스레드 프리미티브에 의해 처리됩니다.됩니다에 됩니다.mmap(2)
가능한 . mmap(2)
다 시 즉시 배포하기 .free(3)
.
애플리케이션 힙(sbrk로 클레임됨)과 mmap을 모두 사용하면 불필요한 추가 복잡성이 발생합니다.
할당된 아레나 - 메인 아레나는 응용 프로그램의 힙을 사용합니다.다른 경기장에서는 mmap'd 더미를 사용합니다.청크를 힙에 매핑하려면 어떤 경우가 적용되는지 알아야 합니다.이 비트가 0이면 청크는 메인 아레나와 메인 힙에서 나옵니다.이 비트가 1인 경우 청크는 mmap'd 메모리에서 가져온 것이고 청크의 주소에서 힙의 위치를 계산할 수 있습니다.
만약 가 이미 ,mmap(2)
로 하는 것이 요?mmap(2)
sbrk(2)
할당 을 사용했는지 특히 인용한 대로 어떤 할당 유형을 사용했는지 추적해야 합니다.다에는 여러 가 있습니다
mmap(2)
지원되지 않을 수 있습니다.sbrk(2)
smmap(2)
추가적인 요구사항을 도입할 것입니다.- glibc wiki는 "요청이 충분히 크다면 mmap()은 운영 체제 [...]에서 직접 메모리를 요청하는 데 사용되며, 한 번에 이러한 매핑의 수는 제한이 있을 수 있습니다."라고 말합니다.
- 으로 된 메모리 입니다.
mmap(2)
쉽게 확장할 수 없습니다.스가 있습니다.mremap(2)
의 용도는 를 그것을 , 즉로 합니다.를 에서의 미리PROT_NONE
액세스 시 가상 메모리를 너무 많이 사용합니다.으로.MMAP_FIXED
이전에 있었을지도 모르는 매핑을 경고 없이 해제합니다.sbrk(2)
는 이러한 문제가 없으며 메모리를 안전하게 확장할 수 있도록 명시적으로 설계되었습니다.
brk()
는 메모리 사용을 추적할 수 있는 데이터 항목이 하나밖에 없다는 장점이 있으며, 이는 힙의 전체 크기와도 직접적인 관련이 있습니다.
이것은 1975년 유닉스 V6 이후로 완전히 동일한 형태입니다.V6는 65,535바이트의 사용자 주소 공간을 지원했습니다.따라서 테라바이트가 아닌 64K 이상을 관리하는 데는 많은 고민이 필요했습니다.
으로.mmap
변경되거나 추가된 가비지 컬렉션이 할당 알고리즘을 다시 작성하지 않고 mmap을 사용할 수 있는지 궁금하기 시작할 때까지 합리적인 것 같습니다.
잘 요?realloc()
,fork()
?? ? ? ? ?
mmap()
유닉스의 초기 버전에는 존재하지 않았습니다.brk()
당시 프로세스의 데이터 세그먼트 크기를 늘릴 수 있는 유일한 방법이었습니다.유닉스의 첫 번째 버전은 다음과 같습니다.mmap()
이었다SunOS
80년대 중반, 최초의 오픈 소스 버전은 1990년 BSD-Reno였습니다.
그리고 사용할 수 있는 것은malloc()
메모리를 백업하기 위해 실제 파일이 필요하지 않습니다.는 1988년에 SunOS되었습니다를 했습니다./dev/zero
고 대 HP-UX를 MAP_ANONYMOUS
깃발을 올리다
의 .mmap()
힙을 할당할 수 있는 다양한 방법을 제공합니다.
확실한 장점은 마지막 할당을 제자리에서 확장할 수 있다는 것입니다. 이는 사용자가 할 수 없는 작업입니다.mmap(2)
(mremap(2)
는 리눅스 확장자이며 휴대용은 아닙니다.
한() 을 하지 않은) 프로그램의 realloc(3)
들어 1인 속도 됩니다;-)은,는 1됩니다 2하려면;-)
리눅스에 대해서는 자세히 모르지만, FreeB에 대해서는 자세히 모릅니다.지금은 몇 년간 SD를 선호하며 FreeB에서 jemalloc를 사용합니다.SD의 libc에는 sbrk()가 완전히 비활성화되어 있습니다. brk()/sbrk()는 arch64 및 risc-v의 최신 포트의 커널에서 구현되지 않습니다.
jemalloc의 역사를 정확히 이해한다면, 원래는 FreeB의 새로운 할당자였습니다.SD가 터져서 휴대용으로 만들어지기 전의 libc.나우 프리비SD는 Jemalloc의 다운스트림 소비자입니다.sbrk()보다 mmap()을 선호하는 것이 FreeB의 특성에서 비롯되었을 가능성이 매우 높습니다.mmap 인터페이스 구현을 중심으로 구축된 SD VM 시스템.
SUS 및 POSIX brk/sbrk에서 사용하지 않는 것으로 간주되며, 이 시점에서 휴대용이 아닌 것으로 간주되어야 한다는 점에 유의할 필요가 있습니다.새 할당자를 작업하는 경우 해당 할당자에 의존하고 싶지 않을 수 있습니다.
언급URL : https://stackoverflow.com/questions/55768549/in-malloc-why-use-brk-at-all-why-not-just-use-mmap
'source' 카테고리의 다른 글
메모리를 영점화하기 (0) | 2023.10.06 |
---|---|
문자열이 NULL 또는 공백이 아닌지 확인합니다. (0) | 2023.10.06 |
C99에서 이상한 배열 크기[*]와 [정적]는 얼마입니까? (0) | 2023.10.06 |
$odd 또는 $even 속성으로 필터링-반복할 수 있습니까? (0) | 2023.10.01 |
=*의 의미는 무엇입니까? (0) | 2023.10.01 |