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

时间:2018-11-07 15:07:34

标签: c++ c ipc

我有一个现有程序,需要通过IPC与之通信。我可以修改其中的一小部分,但是不能添加共享存储,管道或套接字之类的奇特解决方案。因此,我想与直接读取/写入程序地址空间的函数进行通讯:

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

如果我使用以下功能之一修改内存中的值,旧值的可能缓存的副本是否无效?可变指针是否足以立即检索新值?

1 个答案:

答案 0 :(得分:1)

WriteProcessMemory会很乐意按照所告诉的去做。它写入内存,然后CPU缓存将以逻辑上有效(但未指定)的状态结束。

但是,请注意,其他程序没有意识到这些写操作。而且,如果它有自己的缓存概念,包括在寄存器中缓存变量值之类的机制,则这些副本将不会被更新。操作系统无法知道每种语言如何实现这种缓存机制,但是出于性能方面的考虑,大多数严肃的编程语言都具有这种机制。

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