c++ - WriteProcessMemory 和类似函数是否会使可能缓存的数据无效?

标签 c++ c ipc

我有一个现有程序需要通过 IPC 进行通信。我可以修改它的一小部分,但不能添加任何花哨的解决方案,如共享内存、管道或套接字。所以我想与直接读取/写入程序地址空间的函数进行通信:

  • process_vm_writev 在 Linux 上
  • WriteProcessMemory 在 Windows 上
  • mach_vm_write 在 macOS 上

如果我使用这些函数之一修改内存中的值,旧值的可能缓存拷贝是否失效?如果不是,volatile 指针是否足以立即检索新值?

最佳答案

WriteProcessMemory 会很高兴地完全按照它告诉的去做。它写入内存,之后 CPU 缓存将以逻辑上有效(但未指定)的状态结束。

但是,请注意其他程序并不知道这些写入。如果它有自己的缓存想法,包括在寄存器中缓存变量值等机制,那么这些拷贝将不会被更新。操作系统无法知道每种语言如何实现这种缓存机制,但性能问题决定了大多数严肃的编程语言都具有这样的机制。

如果写入的程序使用 C 或 C++ volatile 指针,则可以部分缓解这种情况。编译器无法完全消除读取。但是,只要这些指令不可可观察,就可以使用其他指令对此类读取进行重新排序。这可能会影响它们的计时,从而产生类似于缓存的效果 - 您的 WriteProcessMemory 可能来不及了。

关于c++ - WriteProcessMemory 和类似函数是否会使可能缓存的数据无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192201/

相关文章:

c - C 中的混洗多维数组

c - 多线程udp服务器/客户端

javascript - 使用 IPC 实现连续 headless (headless)页面自动化

python - 从命名管道读取连续数据

c++ - 在 Ubuntu 14.04 中启动我的应用程序时出现非法指令(核心转储)错误,如何查看转储

c++ - 在一行中获取整数的 (const char*) 表示

c++ - 如何有效地从给定另一个 vector 的 vector 中删除元素

c++ - 来自 std 的 unordered_set

c - 为什么这个快速排序算法的实现代码会出现 Segmentation fault 错误?

c# - 什么是IPC?我该如何使用它?