programing

mmap()이 순차 IO보다 빠른 이유는 무엇입니까?

stoneblock 2023. 6. 18. 10:09

mmap()이 순차 IO보다 빠른 이유는 무엇입니까?

중복 가능성:
mmap() 대 판독 블록

저는 (어디선가 인터넷에서) 그것을 읽었다고 들었습니다.mmap()순차 IO보다 빠릅니다.이거 맞는건가요?만약 그렇다면 왜 그것이 더 빠릅니까?

  • mmap()순차적으로 읽지 않습니다.
  • mmap()에서 디크자체와동일가져합와니야다게하와 .read() 일다
  • 매핑된 영역이 순차적이 아니므로 DMA(?)가 없습니다.

그렇게mmap()는 실로는보느합야니다려다제▁than합▁actually보다 느려야 합니다.read() 파일에서?위의 제 가정 중 틀린 것은 무엇입니까?

저는 mmap()이 순차 IO보다 빠르다고 들었습니다(어디선가 인터넷에서 읽었습니다)이거 맞는건가요?만약 그렇다면 왜 그것이 더 빠릅니까?

그럴 수 있습니다. 아래 나열된 장단점이 있습니다.정말로 신경 써야 이유가 있을 때는 항상 두 가지 모두를 벤치마킹하십시오.

실제 IO 효율성과는 별개로 애플리케이션 코드가 I/O를 수행해야 할 때와 데이터 처리/생성을 추적하는 방식에 영향을 미쳐 성능에 상당한 영향을 미칠 수 있습니다.

  1. mmap()이 순차적으로 읽지 않습니다. 2) mmap()이 read()와 동일하게 디스크 자체에서 가져와야 합니다. 3) 매핑된 영역이 순차적이 아니므로 DMA(?)가 없습니다.

sommap()이 실제로 파일의 read()보다 느려야 합니까?위의 제 가정 중 틀린 것은 무엇입니까?

  1. 틀렸습니다... mmap()파일 내용에 해당하는 가상 주소 공간 영역을 할당합니다...해당 주소 공간의 페이지에 액세스할 때마다 물리적 RAM이 가상 주소를 백업하는 것으로 확인되고 해당 디스크 콘텐츠가 해당 RAM에 장애가 발생합니다.따라서 디스크에서 읽기가 수행되는 순서는 액세스 순서와 일치합니다.이것은 "지루한" I/O 메커니즘입니다.들어 디스크에서 해야 하는과 같이 .mmap파일을 저장하고 액세스를 시작한다는 것은 디스크 I/O가 순차적으로 수행되지 않기 때문에 전체 파일을 메모리에 읽을 때까지 시간이 더 오래 걸릴 수 있지만 검색이 성공하고 종속 작업을 수행할 수 있다는 것을 의미합니다.파일의 일부가 실제로 필요하지 않은 경우 읽기가 불가능합니다(디스크 및 메모리 페이지의 세분화를 위해).또한 많은 OS에서 메모리 매핑을 사용하는 경우에도 계획된 액세스 패턴에 대한 몇 가지 성능 향상/메모리 효율성 팁을 지정할 수 있기 때문에 사용자가 메모리로 돌아갈 가능성이 낮다는 것을 알고 사전에 읽거나 메모리를 보다 적극적으로 해제할 수 있습니다.)

  2. 전적으로 사실인

  3. "지도된 영역이 순차적이 아닙니다"는 모호합니다.메모리 매핑된 영역은 가상 주소 공간에서 "연속적"(순차적)입니다.위에서 디스크 I/O가 순차적인 것에 대해 논의했습니다.아니면 다른 생각을 하고 계십니까?어쨌든 페이지에 오류가 발생하는 동안 DMA를 사용하여 전송할 수 있습니다.

또한 메모리 매핑이 일반 I/O를 능가하는 다른 이유도 있습니다.

  • 복사가 적습니다.
    • 종종 OS 및 라이브러리 레벨 루틴은 애플리케이션별 버퍼에 도달하기 전에 하나 이상의 버퍼를 통해 데이터를 전달하고, 애플리케이션은 스토리지를 동적으로 할당한 다음 I/O 버퍼에서 해당 스토리지로 복사하여 파일 읽기가 완료된 후 데이터를 사용할 수 있도록 합니다.
    • 메모리 매핑은 장소 내 사용을 허용하지만 강제하지는 않습니다(포인터와 길이만 기록할 수 있음).
      • 데이터에 계속 액세스하면 캐시 누락 및/또는 나중에 스왑이 증가할 위험이 있습니다. 파일/메모리 맵은 구문 분석할 수 있는 데이터 구조보다 더 장황할 수 있으므로 데이터에 대한 액세스 패턴이 더 많은 메모리 페이지에서 오류를 발생시킬 수 있습니다.
  • 메모리 매핑은 다른 버퍼를 가득 채울 때를 걱정하는 대신 응용 프로그램이 전체 파일 내용을 액세스 가능한 것으로 처리하도록 함으로써 응용 프로그램의 구문 분석 작업을 단순화할 수 있습니다.
  • 애플리케이션은 특정 시점에 물리적 RAM에 있는 페이지 수를 OS의 현명한 판단에 더 의존하므로 애플리케이션과 직접 액세스 Disk 캐시를 효과적으로 공유할 수 있습니다.
  • "메모리 매핑을 사용하면 일반적으로 시스템 호출을 적게 사용할 수 있습니다."
  • 여러 프로세스가 동일한 파일에 액세스하는 경우 물리적 백업 페이지를 공유할 수 있어야 합니다.

또한 그 이유는mmap더 느릴 수 있습니다 - 여기에 있는 리누스 토르발드의 게시물을 읽으십시오.mmap:

...페이지 테이블 게임과 장애(또는 TLB 누락) 오버헤드는 멋진 스트리밍 방식으로 페이지를 복사하는 데 드는 비용보다 훨씬 큽니다.

그리고 의 다른 게시물에서:

  • 상당히 눈에 띄는 설치 및 해체 비용.그리고 에 띄는 것 말입니다.페이지 테이블을 따라 모든 것의 매핑을 깨끗하게 해제하는 것과 같습니다.이것은 모든 매핑 목록을 유지하기 위한 부기입니다.매핑 해제 후 필요한 TLB 플러시입니다.
  • 페이지 폴트링은 비용이 많이 듭니다.이렇게 매핑이 채워지고 속도가 상당히 느립니다.

Linux에는 "엄청난 페이지"(따라서 4kb당 TLB 항목이 아닌 2MB당 TLB 항목 하나)가 있으며, 애플리케이션 코드가 명시적으로 사용하도록 작성되지 않았더라도 OS가 사용을 시도하는 투명한 거대 페이지도 있습니다.

FWIW, 직장에서 마지막으로 이 문제가 발생했을 때 메모리 매핑된 입력은 다음보다 80% 더 빠릅니다.fread기타 파일이 170GB인 64비트 Linux에서 이진 데이터베이스 레코드를 독점 데이터베이스로 읽기 위한 기능.

  1. mmap()프로세스 간에 공유할 수 있습니다.
  2. DMA는 가능할 때마다 사용됩니다. DMA는 연속적인 메모리를 필요로 하지 않습니다. 많은 하이엔드 카드는 산란 수집 DMA를 지원합니다.
  3. 가능한 경우 메모리 영역을 커널 블록 캐시와 공유할 수 있습니다.그래서 베끼기가 덜합니다.
  4. 메모리:mmap커널에 의해 할당되며 항상 정렬됩니다.

절대적인 용어로 "더 빠른"은 존재하지 않습니다.제약 조건과 상황을 지정해야 합니다.

mmap()가 순차적으로 읽지 않습니다.

무엇이 당신을 그렇게 생각하게 합니까?실제로 매핑된 메모리에 순차적으로 액세스하는 경우 시스템은 일반적으로 해당 순서대로 페이지를 가져옵니다.

mmap()는 read()와 동일하게 디스크 자체에서 가져와야 합니다.

물론입니다. 하지만 OS가 시간과 버퍼 크기를 결정합니다.

매핑된 영역이 순차적이 아니므로 DMA(?)가 없습니다.

위를 보다

무엇을mmap는 추가적인 사용자 공간 버퍼가 없다는 점에서 도움이 되며, "읽기"는 OS 커널이 적합하고 최적화될 수 있는 청크에서 발생합니다.이것은 속도 면에서 장점일 수 있지만, 우선 이것은 사용하기 쉬운 인터페이스일 뿐입니다.

특정 설정(하드웨어, OS, 사용 패턴)에 대한 속도를 알고 싶다면 측정해야 합니다.

언급URL : https://stackoverflow.com/questions/9817233/why-mmap-is-faster-than-sequential-io