Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
msync()是否仅写入已更改的页面或完全缓存的缓冲区?_C_Linux_Posix_Mmap_Memory Mapped Files - Fatal编程技术网

msync()是否仅写入已更改的页面或完全缓存的缓冲区?

msync()是否仅写入已更改的页面或完全缓存的缓冲区?,c,linux,posix,mmap,memory-mapped-files,C,Linux,Posix,Mmap,Memory Mapped Files,我在Linux中使用POSIX函数mmap()。但是,当我执行msync()时,它是将缓存缓冲区完全写入文件,还是在某个地方注意到哪些页面已更改,哪些未更改,并且只写入文件-即msync()是否只写入文件已更改的页面,还是完全写入缓存缓冲区 假设我们使用mmap()来处理1GB的文件,请全部读取(即通过整个文件内存中出现的大量页面错误)。然后我们只更改了一个字节,并调用了msync(),然后它将开始将整个1GB记录到一个文件中,或者以某种方式确定要更改的页面,并且只保留它,而它是如何定义的?它是

我在Linux中使用POSIX函数
mmap()
。但是,当我执行
msync()
时,它是将缓存缓冲区完全写入文件,还是在某个地方注意到哪些页面已更改,哪些未更改,并且只写入文件-即
msync()
是否只写入文件已更改的页面,还是完全写入缓存缓冲区


假设我们使用
mmap()
来处理1GB的文件,请全部读取(即通过整个文件内存中出现的大量页面错误)。然后我们只更改了一个字节,并调用了
msync()
,然后它将开始将整个1GB记录到一个文件中,或者以某种方式确定要更改的页面,并且只保留它,而它是如何定义的?它是如何做到的?

msync
做你想做的事情:它只会编写实际修改过的页面。实际上,
msync
在Linux或任何具有适当虚拟内存和页面缓存系统的系统上基本上都是不可操作的
read
将立即看到写入
mmap
ped页面的任何内容,即使没有
msync
。它在很大程度上类似于fsync,但其参数是内存地址范围,而不是文件描述符。另一个可以观察到的影响是,它会导致文件修改时间被更新。

谢谢!但是他是如何做到的,它是如何确定写入内存的,每次内存写入时,就会发生中断?你说
msync
是不可操作的,然后
msync
fsync
的模拟。后者虽然不是人们通常期望的
msync
所做的,但肯定不是禁止操作。你的意思是说
msync
是禁止操作的,目的是将对mmaped区域的写操作传播到系统的其余部分吗?@user4815162342:就在没有物理故障的系统上可观察到的行为而言,
fsync
是不可行的。@Alex:是的,这就是
mmap
的全部要点。最初,所有映射的页面只是对磁盘上文件中相应页面的引用;如果它们存在于内存中,那么它们是只读的。在第一次写访问时,会发生页面错误,内核会将页面转换为可写页面,并将其标记为脏页面,以便将其写回磁盘。否。当内核将页面写入磁盘时,它将转换回只读,并且该过程将重复。这个答案似乎更切题: