mmap 예제

mmap(2)ing 파일은 동일한 파일에 액세스하는 응용 프로그램의 메모리 오버헤드를 크게 줄일 수 있습니다. 파일에 액세스하려는 각 응용 프로그램에 대해 파일을 로드하는 대신 파일이 포함하는 메모리 영역을 공유할 수 있습니다. 즉, mmap(2)은 때때로 IPC(프로세스 간 통신)에 사용됩니다. 최신 운영 체제에서 mmap(2)은 일반적으로 시스템 V IPC 공유 메모리 시설에 선호됩니다. 위의 구현은 최소한의 예일 뿐이므로 오류를 제대로 확인하지 못합니다. 예! 간단한 예로 몇 바이트만 예약하고 자식 프로세스를 종료할 때 공유 메모리의 값을 변경할 수 있습니다. 익명 메모리를 공유하는 것은 복사, 시스템 호출 또는 디스크 액세스 오버헤드가 없기 때문에 프로세스 간 통신의 매우 효율적인 형태입니다. 그러나 mmap을 사용하면 프로세스에서 페이지 캐시에 저장된 실제 메모리에 직접 액세스할 수 있습니다. 프로세스 페이지 테이블 항목을 디스크 캐시에 있는 동일한 페이지 프레임에 매핑하여 이 작업을 수행합니다. 반면에 읽기는 먼저 디스크에서 페이지 캐시로 데이터를 로드한 다음 페이지 캐시에서 사용자 공간 버퍼로 데이터를 복사해야 합니다(쓰기는 동일하지만 반대 방향으로 수행). 리눅스, 맥 OS X 및 BSD에서 mmap매핑의 여러 유형을 만들 수 있습니다. 다른 운영 체제는 이러한 하위 집합만 지원할 수 있습니다., 예를 들어, 공유 매핑 글로벌 VFS 또는 I/O 캐시 없이 운영 체제에서 실용적이지 않을 수 있습니다.

mmap()으로 매핑된 메모리는 동일한 속성으로 포크(2)에 걸쳐 유지됩니다. System V 공유 메모리(shmem)와 메모리 매핑된 I/O(mmap)의 주요 차이점은 SystemV 공유 메모리가 지속된다는 것입니다. mmap`d 메모리는 응용 프로그램 실행 간에 영구적이지 않습니다(파일이 백업하지 않는 한). 컴퓨팅에서 mmap(2)은 파일이나 장치를 메모리에 매핑하는 POSIX 호환 유닉스 시스템 호출입니다. 메모리 매핑 된 파일 I / O의 방법입니다. 파일 내용이 디스크에서 직접 읽히지 않고 처음에는 물리적 RAM을 전혀 사용하지 않기 때문에 요구 페이징을 구현합니다. 디스크에서 실제 읽기는 특정 위치에 액세스한 후 “지연” 방식으로 수행됩니다. 메모리가 더 이상 필요하지 않은 후에는 포인터를 문맵(2)하는 것이 중요합니다.

보호 정보는 mprotect(2)를 사용하여 관리할 수 있으며, madvise(2)를 사용하여 특별한 처리를 시행할 수 있습니다. 1단계: 파일 크기 가져옵니다. mmap을 호출하기 전에 알고 있어야하지만 하위 집합만 mmap 할 수도 있습니다. 자세한 mmap() 참조에 대 한, 참조 는 mmap에 오픈 그룹 페이지 높은 수준의 래퍼에만 관심이 있다면, 이 부스트에서 봐 주세요::iostreams mmap 예제 및 부스트::iostreams mmap 참조. 그러나 boost:iostreams는 mmap() 수행 및 부스트를 제공하지 않습니다::iostreams는 상당히 큰 종속성입니다(라이브러리를 연결해야 함!). 그러나 유닉스가 아닌 시스템에 대한 이식성을 높이는 것이 최선의 선택이 될 수 있습니다. 이 예제에서는 현재 컴파일 중인 파일의 현재 줄 번호와 파일 이름을 포함하는 전처리기 상수 “LINE” 및 “FILE”도 보여 주며, 이 예제에서는 현재 컴파일중인 파일의 현재 줄 번호와 파일 이름을 보유합니다. mmap()은 유연한 메모리 매핑을 제공하며 사용할 매개 변수가 많이 있습니다. 어쨌든 mmap()에서 반환되는 값이 == MAP_FAILED인지 적어도 확인해야 합니다.

자세한 내용은 mmap의 열기 그룹 페이지를 참조하십시오.

This entry was posted in Uncategorized. Bookmark the permalink.