malloc vs mmap in C
두 개의 프로그램을 만들었습니다.하나는malloc 또 다른 을 사용해요.mmap를 사용한 .mmap보다 훨씬 적다malloc.
를를들,, 신그그,,,,를 사용할 때,mmap시스템에 대한 읽기/쓰기 콜을 회피할 수 있습니다.메모리 액세스도 적습니다.
이 에 ,, 용, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, 른, but, but, but, but, ,, , ,mmap에 걸쳐서malloc
고마워요.
여러분, 일반적인 생각과는 달리 mmap은 malloc와 유사한 메모리 할당 함수입니다.
mmaped 파일은 이 파일의 한 가지 용도입니다.파일 기술자로 -1을 전달하는 메모리 할당 함수로 사용할 수 있습니다.
그래서.. 보통 작은 물체는 malloc을 사용하고 큰 물체는 mmap을 사용합니다.
이것은 좋은 전략이다.
함수 범위에만 alloca() to를 사용합니다.
mmap는 실제로 파일을 메모리에 로드하지 않기 때문에 로드는 빨라지지만 편집 속도는 느려집니다.
다른 는 른른른른 another른 른 another another another another another another 。mmap메모리를 사용하지 않지만 주소 공간을 차지합니다.에, 를 들면 큰 을 64비트할 수 .malloc.
이라고 생각됩니다만,mmap ★★★★★★★★★★★★★★★★★」malloc을 사용법알 수 있을 겁니다.
- 를 사용합니다.
fread/fwriteOS os os os 、 os os os os 。 - 를 사용합니다.
mmap한 번의 작업으로 전체 파일에 액세스할 수 있습니다.OS가 파일을 한 번에 한 페이지씩 매핑할 수 있기 때문에 이는 완전히 사실이 아니지만 여전히 훨씬 더 빠릅니다.
malloc도 mmap도 느릴 수 있습니다.주로 사용 패턴에 따라 달라집니다.
mmap: 커널 페이징 서브시스템은 페이지 크기 단위로 동작합니다.즉, 파일에서 전체 페이지를 읽고 반복하고 싶을 때(좋은 현지화) mmap이면 됩니다.반대로 5Gb 파일을 매핑하고 분산 액세스를 하면 커널 스왑 페이지가 많이 들어오고 나갈 수 있습니다.실제 I/O 외에 페이지 관리에도 시간이 걸립니다.지연이 우려되는 경우 이 접근패턴을 피하세요.Linux 페이지 회수 메커니즘은 버스트성이 높고 현저한 지연을 일으키기 쉬우며 캐시 포이즈닝으로 인해 다른 프로세스가 느려지기 때문입니다.
malloc : 페이지 사이즈 단위가 아닌 메모리가 필요한 경우라면 문제 없습니다.하지만 mlock() 같은 것은 제대로 할 수 없습니다.I/O의 경우 속도는 사용자의 방법에 따라 크게 달라집니다.fread/write는 백그라운드에서 페이지를 매핑하거나 사용자 공간에서 버퍼링을 수행합니다.현지화된 액세스는 비교적 빠릅니다.읽기/기입은 커널을 직접 통과하기 때문에 분산된 액세스가 적더라도 캐시 누락으로 인해 I/O가 발생하지만 kernel-> 사용자 공간에서 전송되는 실제 데이터는 약간 줄어듭니다.나는 그것이 측정 가능한지 모르겠다.
mlock()'을 사용하지 않는 한 사용자 페이지는 언제든지 스왑아웃/기입할 수 있습니다.이것도 시간이 걸려요.따라서 메모리가 적은 시스템에서는 가장 적은 메모리를 매핑하는 변종이 이깁니다.Linux 커널에서는 사용되지 않는 페이지가 I/O 캐시에 사용되기 때문에 모든 시스템의 메모리가 너무 적습니다.메모리 사용이나 I/O가 버스트 상태일 경우 커널을 사용할 수 있도록 하는 데 상당한 시간이 걸릴 수 있습니다.
mmap은 실제로 파일을 읽지 않습니다.그냥 어드레스 공간에 매핑하는 거야.그렇기 때문에 실제로 주소 공간에 액세스할 때까지 디스크 I/O가 없습니다.
malloc은 단순히 주소 공간을 메모리에 매핑하는 것입니다.
By mmap RAM은 부여되지 않습니다.주소 공간이 부여됩니다.
주소 공간에 액세스 하면, 페이지 장해가 발생합니다.페이지 사이즈의 페이지 장애(통상은 4096바이트) 중에는 RAM이 제공됩니다.
RAM 콘텐츠도 제공됩니다.파일별로 주소 공간이 백업된 경우 파일 내용이 표시됩니다.MAP_ANNYMONY에 의해 주소 공간이 백업되면 초기화되지 않은 RAM이 표시됩니다.
위의 두 개의 부엉이가 묘사되어 있다.우선, 원하는 대로 RAM을 초기화할 수 있습니다.둘째, 필요한 RAM이 제공되지 않을 때까지입니다.
malloc에 의한 2메가바이트 미만의 주소 요청에 대해서는 프로그램 브레이크가 확장됩니다.프로그램 브레이크에 가까운 주소가 제공되는 동안에는 프로그램 브레이크 계약을 체결할 수 없습니다.따라서 커널 프리 RAM은 반환되지 않을 수 있습니다.유추는 다음과 같다.양말은 신발보다 먼저 벗을 수 있나요?
munmap에 의해 커널 RAM에 대한 호출이 즉시 반환됩니다.mmap 및 munmap에 의해 스왑 가능성이 경감됩니다.malloc 프로그램에 의해 break expansion swap 확률이 유발된다.
malloc별로 페이지 크기보다 작은 메모리를 할당할 수 있습니다.불연속 메모리가 됩니다.커널 메모리도 fragment화할 수 있습니다.둘 다 완벽하지 않다.
커널 RAM에 의한 아이돌 상태의 프로세서에서는 격분할 수 있습니다.2메가바이트 크기의 투명한 거대한 페이지가 생성됩니다.512페이지 폴트가 2M을 제공하는 것에 비해, 1페이지 폴트가 2M을 제공할 수 있는 경우는, 퍼포먼스가 큰 메리트가 됩니다.
mmap에 의해 적어도 하나의 주목할 만한 베인이 존재합니다.mmap 백업의 경우 파이프 파일 설명자를 사용할 수 있습니다.에러는 발생하지 않는다.그러나 메모리 주소에는 제공된 파이프 데이터가 표시되지 않습니다.
단, MAP_ANNYMONY를 사용하면 파이프 파일 기술자에서 mmap 제공 주소로 데이터를 읽을 수 있습니다.효율적이지는 않지만 바람직한 결과는 얻을 수 있습니다.lseek 실패 및 오류에 의해 파이프 첨부 파일 기술자를 식별할 수 있습니다.
전체 메가바이트에 대응하여 디스크 기반 운영 체제를 실행할 수 있는 컴퓨터에서는 malloc 사용이 필수적입니다.C 라이브러리가 제공하는 getline 함수를 사용하는 경우 malloc 및 free가 사용될 수 있습니다.
mmap이 아닌 커널 제어 운영 체제에서 malloc을 사용하는 이유는 무엇입니까?malloc에 비해 mmap은 복잡해?munmap을 호출하려면 이전에 요청한 주소 공간도 제공해야 합니다. malloc 사용이 더 휴대성이 좋습니까? malloc이 더 편리해 보입니까?
그러나 성능이 필요한 경우 mmap을 사용합니다.
마지막으로 MAP_SHARED의 경우 자손 프로세스와 데이터를 공유할 수 있습니다.pthreads를 피하는 것이 가장 중요합니다.클론을 회피할 수도 있습니다.
주관적이지만 가장 선호하는 변수 할당 방식은 register/stack; mmap; global; malloc입니다.서로 다른 부엉이와 베인이 된다.충분히 복잡한 프로그램에 의해 세 가지 또는 네 가지 방법이 모두 사용될 수 있습니다.
언급URL : https://stackoverflow.com/questions/1739296/malloc-vs-mmap-in-c
'source' 카테고리의 다른 글
| VueJs의 로컬 스토리지에서 새로 생성된 행을 '관찰'하는 방법은 무엇입니까? (0) | 2022.07.28 |
|---|---|
| v-for가 개체의 속성과 함께 사용되는 경우 확인란과 함께 v-model 사용 (0) | 2022.07.27 |
| Vue 2.2.0으로 업데이트하는 중입니다. vue-template-compiler 및 vue-loader 버전이 일치하는지 확실하지 않습니다. (0) | 2022.07.27 |
| ":" (콜론) (C structure) - 무슨 뜻이죠? (0) | 2022.07.27 |
| Java에서 적용 가능한 경우 항상 "최종" 수식자 사용 (0) | 2022.07.27 |