mmap
mmap 컴퓨팅에서 는 파일 또는 디바이스를 메모리에 매핑하는 POSIX 준거 UNIX 시스템콜입니다메모리 매핑된 파일 I/O 방식입니다.디스크에서 파일 내용을 직접 읽지 않고 처음에는 물리적 RAM을 전혀 사용하지 않기 때문에 요구 페이징을 구현합니다.디스크에서 실제 읽기는 특정 위치에 액세스한 후 "게으른" 방식으로 수행됩니다.메모리가 필요 없게 된 후,munmap(2)그 힌트입니다.보호 정보는 다음 방법으로 관리할 수 있습니다.mprotect(2), 및 특수 처리는 다음을 사용하여 시행될 수 있습니다.madvise(2).
Linux, macOS 및 BSD에서는mmap는 여러 유형의 매핑을 작성할 수 있습니다.다른 운영체제는 이들 중 일부만 지원할 수 있습니다.예를 들어 글로벌 VFS 또는 I/O 캐시가 없는 운영체제에서는 공유 매핑이 실용적이지 않을 수 있습니다.
역사
메모리 맵 파일의 원래 설계는 TOPS-20 운영 체제에서 비롯되었습니다. mmap 및 관련 시스템 콜은 Unix의 BSD(Berkeley Software Distribution) 버전의 일부로 설계되었습니다.API는 이미 4.2에 기술되어 있습니다.BSD 시스템 매뉴얼(그 릴리스나 4.3에서는 구현되지 않았습니다)BSD.[1]Sun Microsystems는 SunOS 운영체제에 바로 이 API를 구현했습니다.U.C. Berkeley의 BSD 개발자들은 Sun에게 이 구현을 기부할 것을 요청했지만, 이 회담은 코드 전송으로 이어지지 않았습니다; 4.3대신 BSD-Reno는 [2]마하 가상 메모리 시스템에 기반한 구현과 함께 출하되었습니다.
파일 백업 및 익명성
파일 백업 매핑은 프로세스의 가상 메모리 영역을 파일에 매핑합니다.즉, 메모리 영역을 읽으면 파일이 읽힙니다.기본 매핑 유형입니다.
익명 매핑은 파일로부터 백업되지 않은 프로세스의 가상 메모리 영역을 매핑합니다.내용이 [3]0으로 초기화됩니다.이 점에서 익명 매핑은malloc, 및 일부에서 사용됩니다.malloc(3)특정 할당에 대한 구현입니다.그러나 익명 매핑은 POSIX 표준의 일부가 아닙니다.다만, 거의 모든 operating system에 실장되어 있습니다.MAP_ANONYMOUS그리고.MAP_ANON플래그를 설정합니다.
메모리 가시성
매핑이 공유되어 있는 경우(MAP_SHARED플래그가 설정되어 있는 경우).이 플래그는 포크(2) 시스템콜 전체에 보존됩니다.즉, 한 프로세스에서 매핑된 영역에 대한 쓰기가 관련된 모든 프로세스(부모, 자식 또는 형제) 프로세스에서 즉시 표시됩니다.매핑이 공유되고 파일에 의해 백업되는 경우(비매핑)MAP_ANONYMOUS기본 파일 미디어는 msync (2)'ed 후에만 쓰도록 보증됩니다.
매핑이 프라이빗한 경우(MAP_PRIVATE플래그가 설정되어 있습니다).다른 프로세스에서는 변경 내용이 표시되지 않으며 파일에 기록되지 않습니다.
파일의 세그먼트는 RAM에 복사되어 디스크에 정기적으로 플래시되기 때문에 기본 파일에서 읽거나 쓰는 프로세스에서는 파일을 매핑한 프로세스와 동일한 데이터가 항상 표시되는 것은 아닙니다.동기는, 와 강제적으로 실시할 수 있습니다.msync시스템 콜을 실행합니다.
mmap(2)ing 파일은 같은 파일에 액세스하는 응용 프로그램의 메모리 오버헤드를 크게 줄일 수 있습니다.파일에 액세스 하고 싶은 각 응용 프로그램의 파일을 로드하는 대신 파일이 포함하는 메모리 영역을 공유할 수 있습니다.즉, mmap(2)이 프로세스 간 통신(IPC)에 사용되는 경우가 있습니다.최신 운영 체제에서는 일반적으로 시스템 V IPC 공유 메모리 [4]기능보다 mmap (2)가 선호됩니다.
시스템 V 공유 메모리(shmem)와 메모리 매핑 I/O(mmap)의 주요 차이점은 System V 공유 메모리는 영속적이라는 것입니다.프로세스에 의해 명시적으로 삭제되지 않는 한 메모리에 저장되어 시스템이 셧다운될 때까지 사용 가능한 상태로 유지됩니다.mmap'd 메모리는 (파일로 백업되지 않는 한) 애플리케이션 실행 간에 영속적이지 않습니다.
C 프로그래밍 언어에서의 사용 예
#실패하다 < sys / types >h> #실패하다 < sys / mman >h> #실패하다 <err.h> #실패하다 <fcntl.h> #실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <문자열>h> #실패하다 <리스트 없음.h> /* 다음 예시는 /dev/zero의 mmap이 다음과 같은 값을 갖는 방법을 보여 줍니다. 어떤 파일에도 접속되지 않은 익명 메모리(MAP_ANON)를 사용합니다. N.B. MAP_ANNYMON 또는 MAP_ANON은 대부분의 UNIX에서 지원됩니다. 버전, /dev/zero의 원래 목적을 삭제합니다. */ /* OS X 또는 MacOS에서는 동작하지 않습니다.이 OS에서는 /dev/zero를 mmap 할 수 없습니다*/ 인트 주된(무효) { 컨스턴트 차 str1[] = '문자열 1'; 컨스턴트 차 str2[] = '문자열 2'; pid_t 엷은 빛깔의 = 초조해하다(), 어린이용; 인트 fd = -1; 차 *이상, *영; 한다면 ((fd = 열다.("/dev/zero", O_RDWR, 0)) == -1) 에러(1, "열려 있다"); 이상 = (차*)mmap(특수한 순서, 4096, PROT_READ PROT_WRITE, 맵_ANON MAP_공유, -1, 0); 영 = (차*)mmap(특수한 순서, 4096, PROT_READ PROT_WRITE, MAP_공유, fd, 0); 한다면 (이상 == MAP_FAILED 영 == MAP_FAILED) 에러(1, "mmap 중 하나"); 스트럭시(이상, str1); 스트럭시(영, str1); 인쇄물("PID %d:\t익명 %s, 제로백 %s\n", 엷은 빛깔의, 이상, 영); 전환하다 ((어린이용 = 포크())) { 사례. -1: 에러(1, "실패"); /* 노트르치 */ 사례. 0: 어린이용 = 초조해하다(); 인쇄물("PID %d:\t익명 %s, 제로백 %s\n", 어린이용, 이상, 영); 수면.(3); 인쇄물("PID %d:\t익명 %s, 제로백 %s\n", 어린이용, 이상, 영); 지도(이상, 4096); 지도(영, 4096); 가까운.(fd); 돌아가다 종료_SUCCESS; } 수면.(2); 스트럭시(이상, str2); 스트럭시(영, str2); 인쇄물("PID %d:\t익명 %s, 제로백 %s\n", 엷은 빛깔의, 이상, 영); 지도(이상, 4096); 지도(영, 4096); 가까운.(fd); 돌아가다 종료_SUCCESS; } 출력 예:
PID 22475: 어나니머스 스트링 1, 제로백스트링 1 PID 22476: 어나니머스 스트링 1, 제로백스트링 1 PID 22475: 어나니머스 스트링 2, 제로백스트링 2 PID 22476: 어나니머스 스트링 2, 제로백스트링 2
「 」를 참조해 주세요.
레퍼런스
- ^ William Joy; Eric Cooper; Robert Fabry; Samuel Leffler; Kirk McKusick; David Mosher (1983). 4.2BSD System Manual (PDF) (Report). Computer Systems Research Group, University of California, Berkeley.
- ^ McKusick, Marshall Kirk (1999). "Twenty Years of Berkeley Unix: From AT&T-Owned to Freely Redistributable". Open Sources: Voices from the Open Source Revolution. O'Reilly.
- ^ "mmap(2) - Linux manual page".
- ^ Kerrisk, Michael (2010). The Linux programming interface : a Linux and UNIX system programming handbook. San Francisco: No Starch Press. p. 1116. ISBN 978-1-59327-291-3. OCLC 728672600.
추가 정보
- POSIX 표준 기술
- 차이점:
- 창문들
- MapViewOfFile win32 함수는 mmap과 다소 동일합니다.
- 기타 소스 코드 예시:
- Shared Hash File: mmap()을 사용하여 구현된 오픈 소스 공유 메모리 해시 테이블입니다.