问题标签 [virtualalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
372 浏览

windows - VirtualAlloc中lpAddress为null时操作系统如何确定分配哪个区域

当函数调用的lpAddress参数VirtualAlloc为空时,操作系统如何确定分配哪个虚拟地址空间区域?

0 投票
2 回答
9471 浏览

c++ - 我需要使用 VirtualAlloc/VirtualAllocEx 做什么?

我需要使用 VirtualAlloc/VirtualAllocEx 做什么?

一个例子,我发现的一个案例——如果我分配了 4 GB 的虚拟内存,那么如果我不使用所有这些,那么我就不会花费物理内存,如果我调整数组的大小,我不需要做 new将旧数据分配和复制到新数组。

如果我使用标准分配器,我需要在调整大小时复制数据:

或者使用标准分配器,我必须花费 4GB的物理内存:

但是,为什么这比 realloc() 更好? http://www.cplusplus.com/reference/cstdlib/realloc/

还有其他使用 VirtualAlloc[Ex] 的情况吗?

0 投票
1 回答
279 浏览

windows - 确定VirtualAlloc中分配区域的地址?

根据这个VirtualAlloc 允许 address 参数的值为 null 并且“系统确定在哪里分配区域”。

问题是,有没有办法知道分配的地址?如果是,如何?

0 投票
1 回答
4393 浏览

c# - 在c#中写入进程内存

我想向进程内存的某个地址写入偏移量,但我无法分配内存或将内存地址类型更改为“可写”。所以我不能将任何偏移量或值写入我的进程内存。我不确定,但我认为我的进程内存是可读的!请帮我解决这个问题。

这是我尝试过的:

0 投票
1 回答
770 浏览

windows - BaseAddress 和 AllocationBase 以及 _MEMORY_BASIC_INFORMATION 结构中的 AllocationProtect 和 Protect 有什么区别?

_MEMORY_BASIC_INFORMATION包含描述地址空间的字段。BaseAddress我想知道和 A 有什么区别llocationBaseBaseAddress是区域的基地址,什么是AllocationBase

AllocationProtect另外,我想知道和之间的区别Protect。我有点明白,但不确定,我认为AllocationProtect 是我们保留区域时的保护属性,并且是我们使用参数Protect调用时的保护属性。如果是这样,当我们只保留区域时,字段是什么?VirtualAllocMEM_COMMITProtect

0 投票
2 回答
1335 浏览

c++ - VirtualAlloc 的内存使用率高于预期;这是怎么回事?

重要提示:在您在这里投入太多时间之前,请向下滚动至“最终更新”。事实证明,主要的教训是要提防单元测试套件中其他测试的副作用,并在得出结论之前始终孤立地重现事物!


从表面上看,下面的 64 位代码使用VirtualAlloc(总共 4GByte)分配(和访问)一兆 4k 页面:

但是,在执行它时,Windows 任务管理器中报告的“工作集” (并由“峰值工作集”列中的“粘着”值确认)从基线 ~200,000K (~200MByte) 增加到超过 6,000,000 或 7,000,000K (在 64 位 Windows7 以及 ESX 虚拟化的 64 位 Server 2003 和 Server 2008 上进行了测试;不幸的是,我没有注意到观察到的各种数字发生在哪些系统上)。

同一个 unittest 可执行文件中的另一个非常相似的测试用例测试了一个兆 4k mallocs(随后是 frees),并且在运行时仅扩展了预期的 4GByte 左右。

我不明白:VirtualAlloc 是否有相当高的 per-alloc 开销?如果是这样,它显然是页面大小的很大一部分;为什么需要这么多额外的东西,它有什么用?还是我误解了“工作集”报告的实际含义?这里发生了什么?

更新:参考汉斯的回答,我注意到这在第二页访问中出现访问冲突而失败,所以无论发生什么都不像分配被四舍五入到 64K“粒度”那么简单。

更新:现在在安装了 VisualStudioExpress2013 的 AWS/EC2 Windows2008 R2 实例上,我无法用这个最小的代码(编译 64 位)重现问题,它的顶部显然是无开销的峰值工作集 4,335,816K,即我原本希望看到的那种数字。因此,要么我正在运行的其他机器有所不同,要么之前测试中使用的基于 boost-test 的 exe 有所不同。 比扎罗,待续……

最后更新:抱歉!如果可以的话,我会删除这个问题,因为事实证明,观察到的问题完全是由于测试套件中立即出现的单元测试使用 TBB 的“可扩展分配器”来分配/释放几个 GByte 的东西。似乎可扩展分配器实际上将此类分配保留在它自己的池中,而不是将它们返回给系统(参见例如此处此处)。一旦我单独运行测试并Sleep在他们之后观察他们在任务管理器中完成时的工作集时变得明显(是否可以对 TBB 行为做任何事情可能是一个有趣的问题,但这里的问题是红色的-鲱鱼)。

0 投票
2 回答
1229 浏览

c++ - malloc如何分配小于4KB的内存?

如果 malloc 调用 VirtualAlloc() 函数分配内存(分配最小 4Kb),malloc 如何为 int 分配 4 个字节?

0 投票
2 回答
6059 浏览

c# - c#中的VirtualAlloc分配大内存

我正在尝试调整供应商的 c# 示例代码以与 PCI-Express 设备连接。该代码基本上将一个大缓冲区分配为一个 int 数组,然后通过 fixed 关键字将其固定,然后将其交给硬件以填充数据。

这很好用,但最终失败了,因为 .Net 被限制在一个数组中约 20 亿个元素。我可以通过使用 Long 和 gcAllowVeryLargeObjects 关键字的数组将限制推到 16 GB,但最终我仍然遇到 .Net 限制。

在非托管代码中,我可以调用 VirtualAlloc 并直接请求 40 或 50GB,但是我不清楚这在 c# 中是否可行,而且我找不到任何好的示例代码。我意识到我可以用不同的语言来做这件事,但至少在 Windows 上我更熟悉.Net,除了程序的这个相对较小的部分之外,几乎没有特定于硬件的代码,所以我想尝试并坚持我所拥有的。

0 投票
1 回答
5386 浏览

memory - VirtualAlloc MEM_COMMIT 和 MEM_RESERVE

我对 VirtualAlloc 有点困惑,

我们可以使用 MEM_RESERVE 保留内存,然后使用 MEM_COMMIT 提交它,但我对以下两个函数之间使用时的区别并不感到困惑:

第二种选择有什么好处?

我可以使用下面的函数来获取缓冲区:

没有错误

0 投票
1 回答
316 浏览

c++ - VirtualAlloc 的顺序似乎很重要(c++)

使用 virtualalloc 时我有一些奇怪的行为。我在 c++,Visual Studio 2010 中。

我有两件事要分配,我正在使用 VirtualAlloc(我有我的理由,与问题无关)

1 - 存放 x86 汇编代码缓冲区的
空间 2 - 存放 x86 代码所需数据结构的空间

在我的代码中,我正在做:

在 DEBUG 模式下:
在 RELEASE 模式下工作正常:旋转的线程接收 null 作为其输入数据。通过调试验证,当我调用 createThread 时指针是正确的

如果我切换 VirtualAlloc,以便在数据空间之前分配函数空间,那么 DEBUG 和 RELEASE 模式都可以正常工作。

任何想法为什么?我已经验证了我所有的 VS 构建设置在 DEBUG/RELEASE 之间都是相同的