问题标签 [memory-access]

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 投票
6 回答
169256 浏览

c++ - 我可以在 GDB 中的“内存访问”上设置断点吗?

我正在通过 gdb 运行应用程序,并且我想在任何时候访问/更改特定变量时设置断点。有没有这样做的好方法?我也对在 C/C++ 中监视变量以查看它是否/何时更改的其他方法感兴趣。

0 投票
4 回答
12764 浏览

windows - Windows 上的共享内存访问权限

我开发了一个使用共享内存的 Windows 应用程序——即——用于进程间通信的内存映射文件。我有一个 Windows 服务,它进行一些处理并定期将数据写入内存映射文件。我有一个单独的 Windows 应用程序,它从内存映射文件中读取并显示信息。该应用程序在 Windows XP、XP Pro 和 Server 2003 上按预期工作,但在 Vista 上却不行。

我可以看到 Windows 服务正在正确地写入内存映射文件的数据,因为我可以使用文本编辑器打开文件并查看存储的消息,但“消费者”应用程序无法从文件中读取。这里要注意的一件有趣的事情是,如果我关闭消费者应用程序并重新启动它,它会使用之前写入内存映射文件的消息。

另外,另一个奇怪的事情是,当我使用远程桌面连接到 Windows 主机并通过远程桌面调用/使用消费者应用程序时,我得到了相同的行为。但是,如果我调用远程桌面并使用以下命令连接到目标主机的控制台会话:mstsc -v:servername /F -console,一切正常。

所以这就是为什么我认为问题与权限有关。任何人都可以对此发表评论吗?

编辑:

我用来创建内存映射文件和同步访问的 Mutex 对象的 ACL 如下:

我认为这可能是问题的一部分。

0 投票
3 回答
911 浏览

variables - 如何访问堆栈上的变量?

假设我们有这些局部变量:

据我所知,这些将分配在系统堆栈上,如下所示:

这是否意味着为了得到a的值,必须首先将d、c和b的值从堆栈中弹出?如果是这样,这些值在哪里?这是否意味着访问最近声明的变量会更快?还是我错过了什么(我怀疑是这种情况),而整个事情以其他方式起作用?

编辑:谢谢,伙计们!

0 投票
8 回答
35501 浏览

c - L1 缓存未命中的成本是多少?

编辑:出于参考目的(如果有人偶然发现这个问题),Igor Ostrovsky 写了一篇关于缓存未命中的精彩文章。它讨论了几个不同的问题并显示了示例编号。 结束编辑

我做了一些测试<long story goes here>,想知道性能差异是否是由于内存缓存未命中造成的。以下代码演示了该问题并将其归结为关键时序部分。以下代码有几个循环以随机顺序访问内存,然后以升序地址顺序访问内存。

我在 XP 机器(用 VS2005 编译:cl /O2)和 Linux 机器(gcc –Os)上运行它。两者都产生了相似的时间。这些时间以毫秒为单位。我相信所有循环都在运行并且没有优化(否则它会“立即”运行)。

这些数字有意义吗?差异主要是由于 L1 缓存未命中还是还有其他原因?有 20,000^2 次内存访问,如果每个都是缓存未命中,则每次未命中大约为 3.2 纳秒。我测试的 XP (P4) 机器是 3.2GHz,我怀疑(但不知道)有 32KB L1 缓存和 512KB L2。对于 20,000 个条目 (80KB),我假设没有大量的 L2 未命中。所以这将是(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss。这对我来说似乎很高。也许不是,或者我的数学不好。我尝试用 VTune 测量缓存未命中,但我得到了一个 BSOD。现在我无法让它连接到许可证服务器(grrrr)。

0 投票
1 回答
1080 浏览

pointers - 内存 (sbrk) 指针访问时 16 字节对齐移位

我使用 sbrk 编写了一个相当基本的内存分配器。我要求一块内存,比如 65k,并根据需要将其划分为请求动态内存的变量。我通过将内存添加回 65k 块来释放内存。65k 块源自 union sizeof(16-bytes)。然后我将块沿偶数 16 字节边界对齐。但我有不寻常的行为。

当我分配并开始填充我的数据结构时,访问内存看起来不错该成员的地址。

例如,这个特定成员的真实地址恰好是:0x100313d50,但在执行特定函数(没有什么特别之处)时,该成员的地址被表示为 0x100313d70。在调试器内部,我可以查询真实地址,并且在它出现的函数内部时它看起来是正确的。这也不是第一个被访问的成员,它是第三个,所以之前的两次内存访问都很好,但是在第三次访问期间,我看到了这种不寻常的转变。

我是否有可能通过未对齐的块访问此内存?这是可能的,但我希望会引发 SIGBUS 异常(SPARC 芯片)。我正在使用 -memalign=16s 进行编译,因此它应该使用 SIGBUS 而不是捕获和修复错位。

我所有的结构都填充在 16 字节的倍数上:sizeof(structure)%16 = 0。有没有人有过这种行为的经验?一般来说,什么类型的东西/东西/等等。可能会导致指针错误表示内存地址?

干杯,特蕾西。

现代 SPARC 处理器上的 Solaris 10、SunStudio-12、C 语言(如果有帮助的话)。

0 投票
14 回答
49529 浏览

c - 效率:数组与指针

据说通过指针访问内存比通过数组访问内存更有效。我正在学习 C,以上内容在 K&R 中有所说明。他们特别说

任何可以通过数组下标实现的操作也可以用指针来完成。指针版本通常会更快

我使用 Visual C++ 反汇编了以下代码。(我的是 686 处理器。我已禁用所有优化。)

令我惊讶的是,我看到通过指针访问内存需要 3 条指令,而通过数组访问内存需要 3 条指令。下面是对应的代码。

请帮我理解。我在这里想念什么?


正如许多答案和评论所指出的那样,我使用编译时间常数作为数组索引,因此可以说更容易通过数组进行访问。下面是以变量为索引的汇编代码。我现在有相同数量的指令用于通过指针和数组进行访问。我的更广泛的问题仍然有效。通过指针访问内存并不能提高效率。

0 投票
3 回答
10524 浏览

concurrency - 如果两个线程读取和写入同一块内存会发生什么

我的理解是,如果两个线程正在从同一块内存中读取,并且没有线程正在写入该内存,那么操作是安全的。但是,我不确定如果一个线程正在读取而另一个线程正在写入会发生什么。会发生什么?结果是不确定的吗?或者读出来的东西会过时吗?如果过时的读取不是问题,是否可以对变量进行不同步的读写?或者数据是否可能被破坏,读取和写入都不正确,在这种情况下应该始终同步?

我想说我已经了解到这是后一种情况,即内存访问竞赛导致状态未定义......但我不记得我可能在哪里学到的,而且我很难找到在谷歌上回答。我的直觉是变量在寄存器中被操作,并且真正的(如在硬件中)并发是不可能的(或者是它),所以可能发生的最坏的情况是陈旧的数据,即以下:

此时读取线程具有陈旧数据。

0 投票
2 回答
428 浏览

latency - 从远程网络内存映射文件或设备块读取是否比从本地 7200rpm HDD 读取更快?

或者更确切地说,远程 RAM 与本地磁盘访问相比如何?如果答案是“视情况而定”,条件是什么?数据访问模式、读写比率、距离等。

最后,如果本地磁盘是 NetApp 文件管理器怎么办?

谢谢。

0 投票
1 回答
1379 浏览

performance - 单核能否使 CPU 的内存 IO 带宽饱和?

假设一个理想的情况:没有任何内容被分页,所有代码都写得很好并且适合缓存,调度程序永远不会中断你,等等:多核 CPU 中的单个内核能否产生足够的写入流量以使 IO 总线饱和DIMM?

以更具体的形式:如果我要启动一个memset在一个线程中执行 16GB 的程序,它的运行速度会比一对不重叠memset的 8GB 慢吗?(选择的尺寸足够大以达到稳定状态。)

0 投票
2 回答
1210 浏览

arm - ARM Cortex-A8:一次内存读取会获取多少字节?

我正在尝试改进在 ARM cortex-a8 处理器上运行的图像处理项目。

我正在从内存中访问 8 位灰度图像数据。在我的函数中,现在我正在逐字节访问单个像素值。

我认为通过使用 NEON,我可以通过一次从内存中访问 128/8 = 16 个字节来改进这一点,然后在我的函数中使用它们。但是在运行更改后的版本时,我发现这实际上比逐字节访问要花费更多时间。我认为我使用 NEON 的获取正在成为一个瓶颈,花费的时间比我的计算时间还多。

ARM Cortex-A8 的数据总线大小是多少?在一次内存提取中从内存中访问了多少字节?