我已经将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系统命令不同? sync命令是否会影响虚拟内存刷新,而不刷新sync()调用?
我知道手册说同步程序除了执行sync(2)系统调用外什么也不做,但是我从用户空间调用sync()的事实会影响它的行为吗?好像从用户空间进行同步的调用只是安排同步,而不是阻止同步直到完成。
最佳答案
您忘了换行符。echo 3
输出"3\n"
。
此外,您将采用异常circuit回的方法来实现共享内存,并在此过程中给其余的操作系统带来了沉重的成本。
每次调用sync-the-command或sync-the-system-call时,都会导致OS刷新整个计算机上的每个文件系统。更糟糕的是,您要告诉操作系统忘记其拥有的每个文件系统缓冲区,从而迫使操作系统重新读取磁盘上的所有内容。几乎以您能想到的所有方式来提高整个操作系统的性能都是非常糟糕的。
有一种非常简单的方法。
使用shm_open()创建一个命名的共享内存区域。使用mmap进行访问。仅在那块内存上使用内存屏障或共享/命名互斥锁,以确保您可以一致且安全地读取和写入它。
就复杂性而言,您当前的方法可能比普通共享内存贵1,000,000倍。