【发布时间】:2014-01-14 06:51:04
【问题描述】:
我使用 mmap() 和 fopen("/dev/mem") 来创建一个映射到 ARM 系统中两个处理器内核之间共享的物理内存块。当运行 Linux 的处理器写入内存时,在其他非 Linux 处理器看到写入的数据之前可能会有超过一秒的延迟。如果 Linux 进程在写入内存后立即进行此系统调用,那么长时间的延迟就会消失:
system("sync; echo 3 > /proc/sys/vm/drop_caches" );
我尝试直接在代码中复制该逻辑,但长时间的延迟仍然存在:
int fd;
char* data = "3";
sync();
fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
write(fd, data, sizeof(char));
close(fd);
为什么 sync() 调用与同步系统命令的行为不同?同步命令是否会影响同步()调用不影响的虚拟内存刷新?
我知道手册说同步程序除了执行 sync(2) 系统调用之外什么都不做,但是我从用户空间调用 sync() 的事实会影响它的行为吗?它的作用就像从用户空间调用同步只是安排同步而不是阻塞直到完成。
【问题讨论】:
-
这感觉有点远,但是您的
echo将2 个字节(3和\n)写入drop_caches,而您的其他代码只写入3。会不会有区别? -
@WumpusQ.Wumbley
sizeof(char) == 1 -
我尝试了这两种方法,没有尾随换行符,但没有区别。在我的示例中编码的系统回显命令会输出(隐含的)换行符。