source

파일 액세스에는 언제 mmap을 사용해야 합니까?

lovecheck 2022. 10. 30. 17:58
반응형

파일 액세스에는 언제 mmap을 사용해야 합니까?

POSIX 환경에서는, 적어도 2개의 방법으로 파일에 액세스 할 수 있습니다.표준 시스템 호출이 있습니다.open(),read(),write(), 및 친구, 단, 를 사용하는 옵션도 있습니다.mmap()파일을 가상 메모리에 매핑합니다.

어떤 경우에 사용하는 것이 다른 것보다 더 좋습니까?2개의 인터페이스를 포함한 각각의 장점은 무엇입니까?

mmap 여러 프로세스가 같은 파일에서 읽기 전용 방식으로 데이터에 액세스하는 경우 매우 유용합니다. 이는 내가 쓰는 서버 시스템에서 흔히 볼 수 있습니다. mmap모든 프로세스가 동일한 물리 메모리 페이지를 공유할 수 있어 메모리를 대폭 절약할 수 있습니다.

mmap에서는, operating system이 페이징 조작을 최적화할 수도 있습니다.예를 들어, 두 가지 프로그램, 즉 프로그램A라고 쓰여 있다1MB로 작성하다malloc프로그램 B는 다음과 같습니다.mmaps1MB 파일을 메모리에 저장합니다.운영체제가 다음 중 일부를 스왑해야 하는 경우A메모리 아웃.스왑할 버퍼의 내용을 기입한 후에 메모리를 재사용할 수 있습니다.- 아니, 아니에요! - 왜요?B의 케이스는 수정되지 않았습니다.mmap'd 페이지는 OS가 기존 파일에서 복원하는 방법을 알고 있기 때문에 즉시 재사용할 수 있습니다.mmapd from. (OS는 처음에 쓰기 가능으로 표시함으로써 수정되지 않은 페이지를 검출할 수 있습니다.mmap읽기 전용 페이지 및 세그먼트 폴트 캐치(Copy on Write 전략과 유사)

mmap프로세스통신에도 도움이 됩니다.넌 할 수 있다.mmap통신해야 하는 프로세스에서 읽기/쓰기된 파일로서, 그 후 에서 동기 프리미티브를 사용해야 합니다.mmap'd지역(이것은,MAP_HASSEMAPHOREflag는 for)입니다.

한 곳mmap32비트 머신에서 매우 큰 파일을 취급할 필요가 있는 경우입니다.그 이유는mmap는 매핑되는 파일의 전체 범위에 맞도록 충분히 큰 주소 블록을 프로세스의 주소 공간에서 찾아야 합니다.이 문제는 주소 공간이 분할되어 2GB의 사용 가능한 주소 공간이 있지만 개별 범위가 1GB 파일 매핑에 맞지 않는 경우 발생할 수 있습니다.이 경우 원하는 것보다 작은 청크로 파일을 매핑해야 할 수 있습니다.

또 하나의 잠재적인 불편함mmap읽기/쓰기 대신 페이지 크기의 오프셋에서 매핑을 시작해야 합니다.오프셋으로 데이터를 가져오려면X이 오프셋을 수정해야 합니다.이 오프셋은mmap.

마지막으로, 읽기/쓰기만이 일부 유형의 파일로 작업할 수 있는 유일한 방법입니다. mmap파이프나 타이 같은 에는 사용할 수 없습니다.

구글의 전문가인 Robert Love가 작성한 Linux 시스템 프로그래밍에서 인용한 기타 좋은 답변:

장점mmap( )

경유로 파일 조작mmap( )표준보다 몇 가지 이점이 있다read( )그리고.write( )시스템 콜그 중 하나는 다음과 같습니다.

  • 메모리 매핑된 파일 읽기 및 쓰기를 통해 다음 파일을 사용할 때 발생하는 외부 복사를 방지합니다.read( )또는write( )사용자 공간 버퍼 간에 데이터를 복사해야 합니다.

  • 잠재적인 페이지 장애를 제외하고 메모리 매핑파일 읽기 및 쓰기에서는 시스템콜 또는 컨텍스트스위치의 오버헤드가 발생하지 않습니다.이것은 메모리에 액세스하는 것만큼이나 간단합니다.

  • 여러 프로세스가 동일한 개체를 메모리에 매핑하면 데이터가 모든 프로세스 간에 공유됩니다.읽기 전용 및 공유 쓰기 가능 매핑은 모두 공유됩니다. 프라이빗 쓰기 가능 매핑에는 아직 COW(쓰기 시 복사) 페이지가 공유됩니다.

  • 매핑 주변을 탐색하려면 사소한 포인터 조작이 필요합니다.는 필요 없습니다.lseek( )시스템 콜을 실행합니다.

이러한 이유로.mmap( )는 많은 어플리케이션에 있어서 현명한 선택입니다.

의 단점mmap( )

사용할 때 주의할 점이 몇 가지 있습니다.mmap( ):

  • 메모리 매핑은 항상 페이지 크기가 정수입니다.따라서 백업 파일의 크기와 페이지 수의 차이는 slack space로 "wasted"됩니다.작은 파일의 경우 매핑의 상당 부분이 낭비될 수 있습니다.예를 들어 4KB 페이지의 경우 7바이트 매핑은 4,089바이트를 낭비합니다.

  • 메모리 매핑은 프로세스의 주소 공간에 맞아야 합니다.32비트 주소 공간에서는 다양한 크기의 매핑이 매우 많으면 주소 공간의 단편화가 발생하여 큰 빈 인접 영역을 찾기 어려울 수 있습니다.물론 이 문제는 64비트주소 공간에서는 거의 발생하지 않습니다.

  • 커널 내에서 메모리 매핑 및 관련 데이터 구조를 만들고 유지하는 데 오버헤드가 발생합니다.이러한 오버헤드는 일반적으로 이전 섹션에서 언급한 이중 복사를 제거함으로써, 특히 더 크고 자주 액세스하는 파일의 경우 더 이상 발생하지 않습니다.

이러한 이유로 인해mmap( )는 맵 파일이 큰 경우(따라서 낭비되는 공간은 전체 매핑의 작은 비율) 또는 맵파일의 총 사이즈가 페이지사이즈로 균등하게 분할되는 경우(따라서 낭비되는 공간이 없는 경우)에 가장 크게 실현됩니다.

mmap()이 장점이라고 생각되지 않는 부분은 작은 파일(16K 미만)을 읽을 때였습니다.전체 파일을 읽기 위한 페이지 장애의 오버헤드는 단일 read() 시스템 호출을 실행하는 것에 비해 매우 높았습니다.이는 커널이 타임슬라이스 내의 판독치를 완전히 만족시킬 수 있기 때문에 코드가 전환되지 않을 수 있습니다.페이지 장애로 인해 다른 프로그램이 예약되어 파일 작업이 지연 시간이 길어질 가능성이 높아졌습니다.

mmap에서는 대용량 파일에 랜덤으로 액세스할 수 있는 이점이 있습니다.또 다른 장점은 버퍼링 없이 메모리 연산(memcpy, 포인터 연산)으로 액세스할 수 있다는 것입니다.버퍼보다 큰 구조를 가진 경우 버퍼를 사용할 때 일반 I/O가 매우 어려울 수 있습니다.일반적으로 mmap이라는 코드를 올바르게 처리하기가 어렵습니다.즉, 이 명령어를 사용할 때 특정 트랩이 있습니다.mmap사람들이 이미 언급했듯이mmap셋업에는 비용이 많이 들기 때문에 특정 크기(머신에서 머신으로 이동)에만 사용할 수 있습니다.

파일에 대한 순수한 순차적 액세스의 경우 이 솔루션이 항상 더 나은 솔루션인 것은 아닙니다.madvise는 문제를 완화할 수 있습니다.

읽기/쓰기 IO에서는 종종 버퍼가 올바르게 정렬되어 캐스트된 포인터를 참조할 때 트랩되지 않도록 아키텍처(SPARC, Itanium)의 정렬 제한에 주의해야 합니다.

또한 지도 밖으로 접근하지 않도록 주의해야 합니다.지도에서 문자열 함수를 사용하고 파일 끝에 0이 없으면 쉽게 발생할 수 있습니다.마지막 페이지가 0으로 채워져 있기 때문에 파일 크기가 페이지 크기의 배수가 아닐 때 대부분 작동합니다(매핑된 영역은 항상 페이지 크기의 배수가 됩니다).

아직 나열되지 않은 장점은 다음과 같은 기능을 사용할 수 있다는 것입니다.mmap()읽기 전용 매핑을 깨끗한 페이지로 유지합니다.프로세스의 주소 공간에 버퍼를 할당하면,는read()파일로부터 버퍼를 채우려면 , 그 버퍼에 대응하는 메모리 페이지가 기입되고 나서 더러워져 있습니다.

더티 페이지는 커널에 의해 RAM에서 드롭할 수 없습니다.스왑 영역이 있는 경우 스왑하기 위해 호출할 수 있습니다.그러나 이는 비용이 많이 들고 플래시 메모리만 있는 소형 임베디드 기기 등 일부 시스템에서는 스왑이 전혀 이루어지지 않습니다.이 경우 버퍼는 프로세스가 종료될 때까지 RAM에 고정되어 있거나 또는 버퍼를 반환할 수 있습니다.madvise().

비기입처mmap()페이지는 깨끗합니다.커널이 RAM을 필요로 하는 경우는, 간단하게 드롭 해, 페이지가 있던 RAM 를 사용할 수 있습니다.매핑된 프로세스가 다시 액세스하면 커널이 원래 파일에서 페이지를 다시 로드하는 페이지 장애가 발생합니다.애초에 거주했던 것과 같은 방식으로요

이렇게 하면 매핑된 파일을 사용하는 프로세스가 두 개 이상 필요하지 않습니다.

메모리 매핑은 기존 IO에 비해 큰 속도의 이점을 얻을 수 있습니다.메모리 맵 파일의 페이지가 터치되면 운영 체제가 소스 파일에서 데이터를 읽을 수 있습니다.이것은, 장해 페이지를 작성하는 것으로 동작합니다.이 페이지를 OS가 검출하고 나서, OS가 대응하는 데이터를 파일로부터 자동적으로 로드합니다.

이 기능은 페이징 메커니즘과 동일하게 동작하며, 일반적으로 대부분의 파일 시스템 캐시가 최적화되는 크기인 시스템 페이지 경계 및 크기(일반적으로 4K)의 데이터를 읽음으로써 고속 I/O에 최적화됩니다.

언급URL : https://stackoverflow.com/questions/258091/when-should-i-use-mmap-for-file-access

반응형