我有一个现有的程序,我需要通过IPC进行通信.我可以修改它的一小部分,但不能添加任何奇特的解决方案,如共享内存,管道或套接字.所以我想与直接读/写到程序地址空间的函数进行通信:
> linux上的process_vm_writev
> Windows上的WriteProcessMemory
> macOS上的mach_vm_write
如果我使用其中一个函数修改内存中的值,那么旧值的缓存副本可能会失效吗?如果不是一个易于检测到新值的易失性指针?
最佳答案 WriteProcessMemory很乐意完全按照它所说的去做.它写入内存,然后CPU缓存将以逻辑上有效(但未指定)的状态结束.
但是,请注意其他程序没有意识到这些写入.如果它有自己的缓存概念,包括在寄存器中缓存变量值等机制,则不会更新这些副本.操作系统无法知道每种语言如何实现这种缓存机制,但性能问题决定了大多数严肃的编程语言都有这样的机制.
如果写入程序使用C或C易失性指针,则可以部分减轻这种情况.编译器无法完全消除读取.但是,只要不能观察到这些读取,就可以用其他指令重新排序.这可能会影响他们的时间,这会产生类似于缓存的效果 – 您的WriteProcessMemory可能为时已晚.