Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确保内存映射页位于内存中_C++_C_Winapi - Fatal编程技术网

C++ 确保内存映射页位于内存中

C++ 确保内存映射页位于内存中,c++,c,winapi,C++,C,Winapi,我有一个只读的Win32内存映射文件,没有打开共享。有没有办法告诉Windows将一些页面加载到内存中,确保它已成功加载,并将其保留在内存中,直到我释放它 我之所以希望这样做,是因为如果由于磁盘/网络故障而无法加载页面,则从内存映射内存读取会引发异常。在代码中的任何地方处理这种情况都是不切实际的,所以我想确保至少有一些块可以安全地读取,然后逐块读取 我知道PrefetchVirtualMemory,但这严格来说是一种性能优化;当我开始阅读这些页面时,它不能保证这些页面将成功加载或仍在内存中 另外

我有一个只读的Win32内存映射文件,没有打开共享。有没有办法告诉Windows将一些页面加载到内存中,确保它已成功加载,并将其保留在内存中,直到我释放它

我之所以希望这样做,是因为如果由于磁盘/网络故障而无法加载页面,则从内存映射内存读取会引发异常。在代码中的任何地方处理这种情况都是不切实际的,所以我想确保至少有一些块可以安全地读取,然后逐块读取

我知道PrefetchVirtualMemory,但这严格来说是一种性能优化;当我开始阅读这些页面时,它不能保证这些页面将成功加载或仍在内存中


另外,我不一定要阻止寻呼,寻呼是可以的。我主要关心的是网络驱动器。因此VirtualLock似乎不是正确的选择。

除非您运行的帐户具有seu-LOCK\u-MEMORY\u-NAME权限,否则不行。这是确保特定内存段不会被分页的唯一方法。

除非您运行的帐户具有seu-LOCK\u-MEMORY\u-NAME权限,不可以。这是确保某个特定内存块不会被分页的唯一方法。

如果您只需要保证不会有网络访问,您可以使用“可以异步完成”将所需区域读取到专用内存


另一种黑客方法是使用写时复制映射,并导致伪造页面修改。这允许您拥有一个可能更容易导航的连续内存映射,但某些页面保留在私有内存中。由于操作系统为整个映射保留内存,这会导致内存压力增加。

如果您只需要保证不会有网络访问,您可以使用“可能异步”将所需区域读取到专用内存


另一种黑客方法是使用写时复制映射,并导致伪造页面修改。这允许您拥有一个可能更容易导航的连续内存映射,但某些页面保留在私有内存中。由于操作系统为整个映射保留内存,这会导致内存压力增加。

您在混合语言吗?你同时标记了C和C++。我建议不要把它们混在一起。像继承和函数重载这样的事情会使接口更加困难。另外,窗口的许多API都是用C语言编写的。注意:C和C++是不同的语言,C++有继承,C没有。我知道,THOMAASMATHOWS,但这是无关的,因为我问Win32 API。我之所以给它们加上标签,是因为我不想使用一些包装器,比如c库之类的东西来回复。你在自相矛盾。首先,您说您希望页面位于内存中,然后您似乎希望分页……因为您似乎不想利用文件映射,即按需读取,所以您可以继续将整个文件读取到内存中,然后让Windows的分页从那里接管。除非您想利用文件映射的其他方面。@StaceyGirl我希望页面在某个地方,至少在某种程度上保证我可以在有限的时间内读取它。所以,在内存中,或者在分页文件中。但我不希望它出现在网络设备上。你在混合语言吗?你同时标记了C和C++。我建议不要把它们混在一起。像继承和函数重载这样的事情会使接口更加困难。另外,窗口的许多API都是用C语言编写的。注意:C和C++是不同的语言,C++有继承,C没有。我知道,THOMAASMATHOWS,但这是无关的,因为我问Win32 API。我之所以给它们加上标签,是因为我不想使用一些包装器,比如c库之类的东西来回复。你在自相矛盾。首先,您说您希望页面位于内存中,然后您似乎希望分页……因为您似乎不想利用文件映射,即按需读取,所以您可以继续将整个文件读取到内存中,然后让Windows的分页从那里接管。除非您想利用文件映射的其他方面。@StaceyGirl我希望页面在某个地方,至少在某种程度上保证我可以在有限的时间内读取它。所以,在内存中,或者在分页文件中。但我不希望它位于网络设备上。它可能仍会转到交换,但如果windows无法从交换中翻页,您可能会遇到麻烦。@user1937198是的,交换很好。。。我想这是Win32支持的最好的。谢谢它可能仍会转到交换,但如果windows无法从交换中翻页,则您可能有麻烦。@user1937198是的,交换很好。。。我想这是Win32支持的最好的。谢谢