我有两个进程:
进程A正在将一个大文件(~170 GB - 内容不停变动)通过 MAP_NONBLOCK 和 MAP_SHARED 标记映射到内存中进行写入。
这个部分工作正常。当进程B试图从进程A映射的同一文件中读取时,进程A不会响应约20秒钟。进程B正在尝试使用
这个问题的原因是什么?与页面分配有关吗?如何解决?
顺便说一下,当我在进程B中使用
MyDataType *myDataType; = (MyDataType*)mmap(NULL, sizeof(MyDataType), PROT_WRITE, MAP_NONBLOCK | MAP_SHARED , fileDescriptor, 0);
每秒钟我都调用msync:
msync((void *)myDataType, sizeof(MyDataType), MS_ASYNC);
这个部分工作正常。当进程B试图从进程A映射的同一文件中读取时,进程A不会响应约20秒钟。进程B正在尝试使用
fread()
和fseek()
读取文件大约1000次,每次使用小块(每次大约4字节)。该进程正在读取的大部分内容都相互靠近。这个问题的原因是什么?与页面分配有关吗?如何解决?
顺便说一下,当我在进程B中使用
mmap()
而不是简单的fread()
时,会出现同样的问题。
vmstat
是否显示任何异常情况? - Andrew Henle