메모리 매핑 파일을 사용할 때 데이터 전송 경로는 무엇입니까?

메모리 매핑 파일을 사용할 때 데이터 전송 경로는 무엇입니까?

파일에서 read()/write()를 사용하는 것과 mmap()을 사용하는 것 사이에 데이터 전송 경로에 차이가 있나요?

"커널"은 "커널"을 의미합니다https://stackoverflow.com/a/41419353?

mmap에는 다음의 파일 데이터 사본이 필요하지 않습니다.핵심사용자 공간으로.

read()가 파일에서 커널 공간의 버퍼로 데이터를 복사한 다음 커널 버퍼에서 사용자 공간의 버퍼로 데이터를 복사하는 것이 맞습니까?

파일에서 mmap()이 호출되면 중간에 아무 것도 없이 가상 메모리 주소를 파일에 직접 매핑합니까(예: 커널 공간의 버퍼)?

mmap()이 반환한 가상 메모리 주소에 접근할 때 데이터 전송 경로는 무엇인가? 무대 뒤의 중간에 관련된 커널 공간에 버퍼가 있습니까?

mmap()은 데이터 전송 경로 측면에서 read()/write()보다 장점이 있습니까?

답변1

파일에서 read()/write()를 사용하는 것과 mmap()을 사용하는 것 사이에 데이터 전송 경로에 차이가 있나요?

예, 자세한 내용은 아래를 참조하세요.

"커널"은 "커널"을 의미합니다https://stackoverflow.com/a/41419353?

mmap에는 다음의 파일 데이터 사본이 필요하지 않습니다.핵심사용자 공간으로.

이는 커널 주소 공간에 매핑된 메모리를 나타냅니다.

read()가 파일에서 커널 공간의 버퍼로 데이터를 복사한 다음 커널 버퍼에서 사용자 공간의 버퍼로 데이터를 복사하는 것이 맞습니까?

read예, 정렬 제약 없이 사용자 공간에서 제공하는 버퍼로 읽어야 하며 , 읽은 후에는 데이터가 파일 설명자에서 완전히 분리되어야 합니다. 따라서 커널은 이를 만족시키는 데 필요한 모든 데이터를 읽은 다음 read(있는 경우 데이터가 이미 페이지 캐시나 파이프 버퍼에 있거나...) 요청된 데이터를 제공된 공간의 사용자 공간에 복사합니다. 완충기.

mmap()이 반환한 가상 메모리 주소에 접근할 때 데이터 전송 경로는 무엇인가? 무대 뒤의 중간에 관련된 커널 공간에 버퍼가 있습니까?

매핑이 파일 백업되면 데이터가 페이지 캐시로 읽히고 커널은 mmapping 프로세스가 별도의 페이지 맵을 통해 메모리의 해당 물리적 ​​페이지에 직접 액세스할 수 있도록 허용합니다. 적어도 프로세스가 페이지에 쓰지 않는 한(그리고 동작은 flags 에 따라 다릅니다 mmap) 배후에는 버퍼가 없습니다.

mmap()은 데이터 전송 경로 측면에서 read()/write()보다 장점이 있습니까?

이에 대해서는 에서 자세히 논의한 바 있다.당신이 링크한 SO 질문. mmap일부 사본은 피하지만 전체적으로 read더 나은지 여부는 write호출자가 수행하는 작업에 대한 세부 사항에 따라 다릅니다.

어떤 경우에는 Linux의 다른 시스템 호출이 더 나은 성능을 제공합니다.sendfile,copy_file_range, 그리고splice.

관련 정보