다음을 통해 공유


MapViewOfFileExNuma 함수(winbase.h)

파일 매핑 보기를 호출 프로세스의 주소 공간에 매핑하고 실제 메모리에 대한 NUMA 노드를 지정합니다.

통사론

LPVOID MapViewOfFileExNuma(
  [in]           HANDLE hFileMappingObject,
  [in]           DWORD  dwDesiredAccess,
  [in]           DWORD  dwFileOffsetHigh,
  [in]           DWORD  dwFileOffsetLow,
  [in]           SIZE_T dwNumberOfBytesToMap,
  [in, optional] LPVOID lpBaseAddress,
  [in]           DWORD  nndPreferred
);

매개 변수

[in] hFileMappingObject

파일 매핑 개체에 대한 핸들입니다. CreateFileMappingNumaOpenFileMapping 함수는 이 핸들을 반환합니다.

[in] dwDesiredAccess

페이지의 페이지 보호를 결정하는 파일 매핑 개체에 대한 액세스 유형입니다. 이 매개 변수는 다음 값 중 하나이거나 적절한 경우 여러 값의 비트 OR 조합일 수 있습니다.

의미
FILE_MAP_ALL_ACCESS
파일의 읽기/쓰기 뷰가 매핑됩니다. 파일 매핑 개체는 PAGE_READWRITE 또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.

MapViewOfFileExNuma사용하는 경우 FILE_MAP_ALL_ACCESSFILE_MAP_WRITE동일합니다.

FILE_MAP_READ
파일의 읽기 전용 보기가 매핑됩니다. 파일 뷰에 쓰려고 시도하면 액세스 위반이 발생합니다.

파일 매핑 개체는 PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE_READ또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.

FILE_MAP_WRITE
파일의 읽기/쓰기 뷰가 매핑됩니다. 파일 매핑 개체는 PAGE_READWRITE 또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.

mapViewOfFileExNuma사용하는 경우 FILE_MAP_WRITE동일합니다.

  비트 OR를 사용하여 위의 값을 이러한 값과 결합할 수 있습니다.
의미
FILE_MAP_COPY
파일의 쓰기 복사 보기가 매핑됩니다. 파일 매핑 개체는 PAGE_READONLY, PAGE_EXECUTE_READ, PAGE_WRITECOPY, PAGE_EXECUTE_WRITECOPY, PAGE_READWRITE또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.

프로세스에서 쓰기 복사 페이지에 쓰는 경우 시스템은 원본 페이지를 프로세스에 비공개인 새 페이지로 복사합니다. 새 페이지는 페이징 파일에서 지원됩니다. 새 페이지의 보호는 쓰기에 복사에서 읽기/쓰기로 변경됩니다.

쓰기에 대한 복사 액세스 권한이 지정되면 호출 프로세스가 보기의 모든 페이지에 쓸 수 있으므로 모든 페이지를 비공개로 만들 수 있으므로 전체 보기에 대한 시스템 및 프로세스 커밋 요금이 청구됩니다. 새 페이지의 콘텐츠는 원래 파일에 다시 기록되지 않으며 보기가 매핑 해제되면 손실됩니다.

FILE_MAP_EXECUTE
파일의 실행 가능한 뷰가 매핑됩니다(매핑된 메모리는 코드로 실행할 수 있습니다). 파일 매핑 개체는 PAGE_EXECUTE_READ, PAGE_EXECUTE_WRITECOPY또는 PAGE_EXECUTE_READWRITE 보호를 사용하여 만들어야 합니다.
FILE_MAP_LARGE_PAGES
Windows 10 버전 1703부터 이 플래그는 큰 페이지 지원사용하여 뷰를 매핑해야 한다고 지정합니다. 보기의 크기는 GetLargePageMinimum 함수에서 보고한 큰 페이지 크기의 배수여야 하며 SEC_LARGE_PAGES 옵션을 사용하여 파일 매핑 개체를 만들어야 합니다. lpBaseAddressnull이 아닌 값을 제공하는 경우 값은 GetLargePageMinimum배수여야 합니다.
FILE_MAP_TARGETS_INVALID
매핑된 파일의 모든 위치를 CFG(Control Flow Guard)의 잘못된 대상으로 설정합니다. 이 플래그는 PAGE_TARGETS_INVALID비슷합니다. 실행 액세스 권한 FILE_MAP_EXECUTE함께 이 플래그를 사용합니다. 해당 페이지의 위치에 대한 간접 호출은 CFG 검사에 실패하고 프로세스가 종료됩니다. 할당된 실행 파일에 대한 기본 동작은 CFG에 대한 유효한 호출 대상으로 표시되는 것입니다.
 

SEC_IMAGE 특성으로 만든 파일 매핑 개체의 경우 dwDesiredAccess 매개 변수는 효과가 없으며 FILE_MAP_READ같은 유효한 값으로 설정해야 합니다.

파일 매핑 개체에 대한 액세스에 대한 자세한 내용은 파일 매핑 보안 및 액세스 권한참조하세요.

[in] dwFileOffsetHigh

보기가 시작될 파일 오프셋의 상위 DWORD.

[in] dwFileOffsetLow

낮은 순서의 DWORD는 뷰가 시작될 파일 오프셋의. 높음 및 낮음 오프셋의 조합은 파일 매핑 내에서 오프셋을 지정해야 합니다. 또한 시스템의 메모리 할당 세분성과 일치해야 합니다. 즉, 오프셋은 할당 세분성의 배수여야 합니다. 시스템의 메모리 할당 세분성을 가져오려면 SYSTEM_INFO 구조체의 멤버를 채우는 GetSystemInfo 함수를 사용합니다.

[in] dwNumberOfBytesToMap

뷰에 매핑할 파일 매핑의 바이트 수입니다. 모든 바이트는 CreateFileMapping지정된 최대 크기 내에 있어야 합니다. 이 매개 변수가 0이면 매핑이 지정된 오프셋에서 파일 매핑의 끝까지 확장됩니다.

[in, optional] lpBaseAddress

매핑이 시작되는 호출 프로세스 주소 공간의 메모리 주소에 대한 포인터입니다. 시스템 메모리 할당 세분성의 배수여야 합니다. 그렇지 않으면 함수가 실패합니다. 시스템의 메모리 할당 세분성을 확인하려면 GetSystemInfo 함수를 사용합니다. 지정된 주소에 주소 공간이 충분하지 않으면 함수가 실패합니다.

lpBaseAddress 매개 변수가 NULL경우 운영 체제에서 매핑 주소를 선택합니다.

지금은 안전한 주소(운영 체제에서 사용되지 않음)를 지정할 수 있지만 시간이 지남에 따라 주소가 안전하게 유지된다는 보장은 없습니다. 따라서 운영 체제에서 주소를 선택할 수 있도록 하는 것이 좋습니다. 이 경우 메모리 매핑된 파일에 포인터를 저장하지 않습니다. 모든 주소에서 매핑을 사용할 수 있도록 파일 매핑의 기준에서 오프셋을 저장합니다.

[in] nndPreferred

실제 메모리가 상주해야 하는 NUMA 노드입니다.

의미
NUMA_NO_PREFERRED_NODE
0xffffffff
NUMA 노드가 선호되지 않습니다. 이는 MapViewOfFileEx 함수를 호출하는 것과 같습니다.

반환 값

함수가 성공하면 반환 값은 매핑된 뷰의 시작 주소입니다.

함수가 실패하면 반환 값은 NULL. 확장 오류 정보를 얻으려면 GetLastError 함수를 호출합니다.

발언

파일을 매핑하면 호출 프로세스의 주소 공간에 파일의 지정된 부분이 표시됩니다.

주소 공간보다 큰 파일의 경우 파일 데이터의 작은 부분만 한 번에 매핑할 수 있습니다. 첫 번째 보기가 완료되면 매핑을 해제하고 새 보기를 매핑합니다.

보기의 크기를 가져오려면 VirtualQueryEx 함수를 사용합니다.

페이지 파일에서 지원되는 파일 매핑 개체의 페이지 초기 콘텐츠는 0입니다.

제안된 매핑 주소가 제공되면 지정된 주소에 충분한 주소 공간이 있는 경우 지정된 주소(가장 가까운 64KB 경계로 반올림됨)에 파일이 매핑됩니다. 주소 공간이 충분하지 않으면 함수가 실패합니다.

일반적으로 제안된 주소는 여러 프로세스에서 동일한 주소에 파일을 매핑하도록 지정하는 데 사용됩니다. 이렇게 하려면 모든 관련 프로세스에서 주소 공간 영역을 사용할 수 있어야 합니다. VirtualAllocExNuma 함수를 사용하여 메모리를 예약하는 등 매핑에 사용되는 지역에서 다른 메모리 할당을 수행할 수 없습니다.

lpBaseAddress 매개 변수가 기본 오프셋을 지정하면 지정된 메모리 영역이 호출 프로세스에서 아직 사용되지 않으면 함수가 성공합니다. 시스템은 다른 32비트 프로세스의 메모리 매핑 파일에 동일한 메모리 영역을 사용할 수 있도록 보장하지 않습니다.

파일(또는 파일 매핑 개체 및 매핑된 파일)의 여러 보기는 지정된 시간에 동일한 데이터를 포함하는 경우 일관된 . 이 문제는 파일 뷰가 동일한 파일 매핑 개체에서 파생되는 경우에 발생합니다. 프로세스는 DuplicateHandle 함수를 사용하여 파일 매핑 개체 핸들을 다른 프로세스로 복제하거나, 다른 프로세스는 OpenFileMapping 함수를 사용하여 이름으로 파일 매핑 개체를 열 수 있습니다.

한 가지 중요한 예외를 제외하고 동일한 파일에서 지원되는 파일 매핑 개체에서 파생된 파일 뷰는 특정 시간에 일관되거나 동일합니다. 일관성은 프로세스 내의 뷰 및 다른 프로세스에 의해 매핑되는 뷰에 대해 보장됩니다.

예외는 원격 파일과 관련이 있습니다. MapViewOfFileExNuma 원격 파일에서 작동하지만 일관되게 유지되지는 않습니다. 예를 들어 두 컴퓨터가 모두 파일을 쓰기 가능으로 매핑하고 둘 다 동일한 페이지를 변경하는 경우 각 컴퓨터는 페이지에 대한 쓰기만 볼 수 있습니다. 디스크에서 데이터가 업데이트되면 병합되지 않습니다.

파일의 매핑된 뷰는 ReadFile 또는 WriteFile 함수에서 액세스하는 파일과 일관성이 보장되지 않습니다.

EXCEPTION_IN_PAGE_ERROR 예외를 방지하려면 구조적 예외 처리를 사용하여 페이지 파일이 아닌 파일의 메모리 매핑 보기에서 쓰거나 읽는 코드를 보호합니다. 자세한 내용은 파일 보기읽기 및 쓰기 참조하세요.

매핑된 보기를 통해 파일을 수정하는 경우 마지막 수정 타임스탬프가 자동으로 업데이트되지 않을 수 있습니다. 필요한 경우 호출자는 SetFileTime 사용하여 타임스탬프를 설정해야 합니다.

실행 권한이 있는 파일을 사용하려면 애플리케이션이 PAGE_EXECUTE_READWRITE 또는 PAGE_EXECUTE_READCreateFileMappingNuma 함수를 호출한 다음 FILE_MAP_EXECUTE | FILE_MAP_WRITE 또는 FILE_MAP_EXECUTE | FILE_MAP_READMapViewOfFileExNuma 함수를 호출해야 합니다.

Windows Server 2012에서 이 함수는 다음 기술에서 지원됩니다.

기술 지원
SMB(서버 메시지 블록) 3.0 프로토콜
SMB 3.0 TFO(투명한 장애 조치(failover)
SO(스케일 아웃 파일 공유)가 있는 SMB 3.0
CsvFS(클러스터 공유 볼륨 파일 시스템)
ReFS(복원 파일 시스템)

요구 사항

요구
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winbase.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

CreateFileMappingNuma

DuplicateHandle

파일 매핑 함수

GetSystemInfo

mapViewOfFileEx

NUMA 지원

OpenFileMapping

ReadFile

SYSTEM_INFO

UnmapViewOfFile

VirtualAlloc

WriteFile