首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sync()调用和sync命令有什么不同?

sync()调用和sync命令有什么不同?
EN

Stack Overflow用户
提问于 2013-12-26 16:19:46
回答 2查看 2.7K关注 0票数 0

我使用mmap()和fopen("/dev/mem")来创建到ARM系统中两个处理器核共享的物理内存块的映射。当运行Linux的处理器写入内存时,在另一个非Linux处理器看到所写数据之前,可能会有超过1秒的延迟。如果Linux进程在写入内存后立即进行系统调用,那么长延迟就会消失:

代码语言:javascript
运行
复制
system("sync; echo 3 > /proc/sys/vm/drop_caches" );

我试图在代码中直接复制该逻辑,但长期延迟仍然存在:

代码语言:javascript
运行
复制
int fd;
char* data = "3";
sync();
fd = open("/proc/sys/vm/drop_caches", O_WRONLY);
write(fd, data, sizeof(char));
close(fd);

为什么sync()调用的行为与同步系统命令不同?同步命令是否会影响同步()调用所没有的虚拟内存?

我知道手册上说同步程序只执行同步(2)系统调用,但是我从用户空间调用sync()会影响它的行为吗?它的作用就好像调用从用户空间同步只是调度同步,而不是阻塞直到它完成。

EN

回答 2

Stack Overflow用户

发布于 2013-12-26 17:21:43

你忘了换电话了。

echo 3输出"3\n"

此外,您正在采取一种非常迂回的方式来实现共享内存,并且在这样做时会给操作系统的其他部分带来巨大的成本。

每次调用同步命令或同步系统调用时,都会导致操作系统刷新整个计算机上的每个文件系统;更糟糕的是,您告诉操作系统忘记了它拥有的每个文件系统缓冲区,迫使操作系统重新读取磁盘中的所有内容。在你所能想到的每一种情况下,对整个操作系统的性能都很差。

有一种非常容易的方法。

使用shm_open()创建一个命名共享内存区域。使用mmap访问它。仅在该内存块上使用内存屏障或共享/命名互斥,以确保您可以一致和安全地读写它。

就复杂性而言,当前的方法可能比普通共享内存花费高出100万倍。

票数 0
EN

Stack Overflow用户

发布于 2013-12-26 17:36:23

drop_cachessync在这里都不合适,因为它们都处理文件系统缓存--它们实际上不是您在这里遇到的。sync似乎解决了这个问题,这可能是巧合。(当sync工具启动时,可能是顺带刷新数据缓存。)

您的应用程序很可能在系统上的两个处理器核之间遇到缓存同步问题。尝试使用cacheflush()系统调用来解决以下问题:

代码语言:javascript
运行
复制
#include <unistd.h>
#include <asm/unistd.h>
...
syscall(__ARM_NR_cacheflush, mapping_ptr, mapping_ptr + mapping_length, 0);

请注意,您可能需要在两个进程中刷新缓存才能看到正确的结果。

对映射内存的刷新对于其他映射设备来说通常是必要的,但我认为在这种情况下可能不需要它。不过,尝试msync()也不会有什么害处:

代码语言:javascript
运行
复制
msync(mapping_ptr, mapping_length, MS_SYNC); // on process writing to memory
msync(mapping_ptr, mapping_length, MS_INVALIDATE); // on process reading from memory

最后,确保使用MAP_SHARED标志映射此内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20787815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档