메모리 매핑 파일은 표준 I/O 시스템 호출에 비해 어떻게 성능을 크게 향상합니까?

메모리 매핑 파일은 표준 I/O 시스템 호출에 비해 어떻게 성능을 크게 향상합니까?

운영 체제 개념

디스크의 파일을 순차적으로 읽는 것을 고려하십시오.표준 시스템 호출 open(), read() 및 write() 사용.모든 파일 액세스에는 시스템 호출과 디스크 액세스가 필요합니다..

또는 지금까지 설명한 가상 메모리 기술을 사용하여 파일 I/O를 일반 메모리 액세스로 처리할 수 있습니다. 이 방법은 메모리 매핑 파일, 가상 주소 공간의 일부를 파일과 논리적으로 연관시킬 수 있습니다. 앞으로 살펴보겠지만 이는 다음과 같은 결과로 이어질 수 있습니다.대폭 향상된 성능. 파일의 메모리 매핑은 디스크 블록을 메모리의 하나 이상의 페이지에 매핑하여 수행됩니다. 파일에 대한 초기 액세스는 일반 요청 페이징을 통해 발생하므로 페이지 오류가 발생합니다. 그러나 파일의 페이지 크기 부분은 파일 시스템에서 실제 페이지로 읽혀집니다(일부 시스템은 한 번에 페이지 크기보다 더 많은 메모리 블록을 읽도록 선택할 수 있음). 파일에 대한 후속 읽기 및 쓰기는 일반 메모리 액세스로 처리됩니다. read() 및 write() 시스템 호출을 사용하여 오버헤드를 발생시키는 대신 메모리에서 파일을 작동함으로써 파일 액세스 및 사용을 단순화하고 가속화할 수 있습니다.

메모리 매핑된 파일의 성능을 분석할 수 있습니까?

내 말이 맞다면 메모리 매핑 파일은 다음과 같이 작동합니다. 메모리 맵을 생성하려면 시스템 호출이 필요합니다. 그런 다음 매핑된 메모리에 액세스하면 페이지 폴트가 발생합니다. 페이지 폴트에도 오버헤드가 있습니다.

메모리 매핑 파일은 표준 I/O 시스템 호출에 비해 어떻게 성능을 크게 향상합니까?

답변1

메모리 매핑 파일은 호출 시 발생하는 복사 read()및 버퍼링을 직접 방지합니다. 데이터가 저장된 프로세스 주소 공간의 버퍼에 대한 포인터를 write()호출 read()하고 포함합니다. write()커널은 이러한 위치 간에 데이터를 복사해야 합니다. Use는 mmap()파일을 프로세스의 주소 공간에 매핑하므로 프로세스는 복사하지 않고 파일 주소를 직접 지정할 수 있습니다.

파일이 처음에 메모리에 로드되면 초기 호출 후 메모리 매핑된 파일에 액세스할 때 시스템 호출 오버헤드도 없습니다 mmap(). 매핑된 파일의 페이지가 메모리에 없으면 액세스 시 오류가 발생하고 커널이 페이지를 메모리에 로드해야 합니다. 파일을 읽는 동안 많은 오류가 발생 하는 경우 큰 청크를 읽는 것이 이 경우보다 더 빠를 read()수 있습니다 . (미리 커널에 알릴 수 있습니다.mmap()mmap()madvise()커널이 페이지에 액세스하기 전에 미리 페이지를 로드할 수 있도록 합니다.

자세한 내용은 Stack Overflow에 대한 관련 질문을 참조하세요.mmap() 및 읽기 블록

답변2

첫째, 대부분의 IO 작업에서 기본 스토리지 하드웨어의 특성이 성능을 결정합니다. 블록 크기가 일치하지 않고 파일 시스템이 잘못 정렬된 S/W RAID를 사용하는 느리고 메모리가 부족한 시스템에서 잘못 구성된 RAID5 어레이(29개의 느린 5400rpm SATA 디스크로 구성) 구성은 SSD RAID 1+0 성능을 저하시킵니다. 어떤 소프트웨어 조정을 시도하더라도 고성능 컨트롤러를 사용할 수 있습니다.

mmap()하지만 속도를 크게 높이는 유일한 방법은 동일한 데이터를 여러 번 읽는 것입니다.그리고메모리 부족으로 인해 읽은 데이터는 읽기 사이에 페이징되지 않습니다.

메모리 매핑 단계:

  1. 가상 지도를 생성하기 위한 시스템 호출 - 매우 비용이 많이 듭니다.
  2. 프로세스가 처음으로 메모리에 액세스하여 페이지 오류가 발생하면 비용이 많이 듭니다(호출되면 반복해야 할 수 있음).
  3. 프로세스는 실제로 메모리를 읽습니다.

프로세스가 읽는 각 데이터 비트에 대해 2단계와 3단계만 한 번만 수행하거나 메모리 부족으로 인해 데이터가 메모리에서 제거되는 경우에는 mmap()속도가 느려집니다 .

read()속도:

  1. 디스크에서 페이지 캐시로 데이터를 복사하는 시스템 호출(페이지 결함이 있을 수도 있고 없을 수도 있고, 데이터가 이미 페이지 캐시에 있을 수 있으므로 이 작업을 건너뛸 수 있음)
  2. 페이지 캐시에서 프로세스 메모리로 복사된 데이터(페이지 오류가 발생할 수도 있고 발생하지 않을 수도 있음)

메모리 매핑은 페이지 캐시에서 프로세스 메모리로의 추가 복사로 인해 성능 측면에서 이보다 더 뛰어납니다. 그러나 지도 설정 비용을 줄이려면 메모리의 한 페이지(또는 그 이하)를 여러 번 복사해야 합니다. 아마도 그럴 것입니다. 횟수는 시스템에 따라 다릅니다. 메모리 대역폭, 전체 시스템이 사용되는 방식 등 모든 것. 예를 들어, 커널 메모리 관리에서 맵을 설정하는 데 사용하는 시간을 다른 프로세스에서 사용하지 않을 경우 맵을 만드는 데 드는 비용은 실제로 그리 높지 않습니다. 반대로, 많은 가상 메모리 맵 생성/파괴(즉, 많은 단기 프로세스)와 관련된 시스템 처리량이 많은 경우 메모리 매핑된 IO의 영향이 상당할 수 있습니다.

그런 다음 read()직접 IO를 사용하십시오.

  1. 디스크에서 프로세스 메모리 공간을 읽는 시스템 호출입니다. (페이지 오류가 발생할 수도 있고 발생하지 않을 수도 있음)

직접 IO 읽기는 성능 측면에서 거의 불가능합니다. 하지만 성능을 극대화하려면 IO 패턴을 하드웨어에 맞게 조정해야 합니다.

데이터 읽기로 인해 프로세스가 읽기 위해 사용하는 버퍼에 페이지 오류가 발생하는 경우 프로세스는 거의 제어할 수 없습니다.

그렇다면 메모리 매핑된 파일 액세스가 더 빠를까요? 그럴 수도 있고 아닐 수도 있고.

이는 액세스 패턴에 따라 다릅니다. 하드웨어 및 IO 경로의 다른 모든 것.

4GB RAM이 장착된 컴퓨터에서 30GB 비디오 파일을 스트리밍하고 다시 돌아가서 데이터를 다시 읽지 않는 경우 메모리 매핑된 파일은 아마도가장 나쁜읽는 방법.

반대로, 처리 중에 무작위로 수십억 번 액세스되는 일부 데이터에 대한 100MB 조회 테이블이 있고 파일이 페이지 아웃되지 않을 만큼 충분한 메모리가 있는 경우 메모리 맵은 다른 액세스 방법의 모든 것을 압도합니다.

메모리 매핑 파일의 큰 장점 중 하나

메모리 매핑 파일은 다른 형태의 IO에 비해 큰 이점이 있습니다. 코드가 간단합니다. 파일에 접근하는 것이 메모리에 접근하는 것만큼 쉽다는 사실과 비교하는 것은 정말 어렵습니다. 대부분의 경우 메모리 매핑된 파일과 개별 IO 작업 수행 간의 성능 차이는 그다지 크지 않습니다.

관련 정보