write后不fsync,为什么仍然能read成功?

会飞的猪猪萌萌哒 2013-10-03 02:09:40
理论上write进缓冲区高速缓存,要过一段时间等待update或者缓冲区满才写磁盘吧。为什么我write以后,直接read一点问题都没有呢?看别人做APUE上面这个地方的测试,fsync后read都无效,我的怎么不fsync,read都OK,给跪啊。。。
没有O_*SYNC等标志。
Linux version 3.10.12-100.fc18.x86_64 (mockbuild@bkernel02) (gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC) ) #1 SMP Mon Sep 16 13:05:36 UTC 2013
...全文
238 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
事实上,linux 2.4之前的内核,buffer cache和page cache就不在一起,读写是不能直接同步的。
引用
2.4的改进:page cache和buffer cache耦合得更好了。在2.2里,磁盘文件的读使用page cache,而写绕过page cache,直接使用buffer cache,因此带来了同步的问题:写完之后必须使用update_vm_cache()更新可能有的page cache。2.4中page cache做了比较大的改进,文件可以通过page cache直接写了,page cache优先使用high memory。而且,2.4引入了新的对象:file address space,它包含用来读写一整页数据的方法。这些方法考虑到了inode的更新、page cache处理和临时buffer的使用。page cache和buffer cache的同步问题就消除了。原来使用inode+offset查找page cache变成通过file address space+offset;原来struct page 中的inode成员被address_space类型的mapping成员取代。这个改进还使得匿名内存的共享成为可能(这个在2.2很难实现,许多讨论过)。
这段话在很多英文资料里面也提到了。我现在知道读写同步和是否写磁盘是没有关系的了,不过和缓冲区同步有关系,只不过现在使用page dirty write back,避免了这个问题。我觉得不能因为POSIX要求就认为所有linux系统会遵从这个。事实上wiki里面说,linux属于“Mostly POSIX-compliant”而不是“Fully POSIX-compliant”。
qq120848369 2013-10-04
  • 打赏
  • 举报
回复
sync是写入磁盘,不是写入缓冲,我认为这个概念没有什么诡异的问题。 write返回就已经表明写入缓冲了,read必须能读到,读不到这系统就没法用了。
  • 打赏
  • 举报
回复
仔细查了下,APUE第二版用的是Linux 2.4内核,而恰好在2.4后,Linux内核的缓冲区高速缓存合并进了页高速缓存,如果还存在独立的缓冲区高速缓存和页高速缓存,write写的数据在缓冲区高速缓存的时候,read还能读到么?
  • 打赏
  • 举报
回复
是不是说只要写入内核了不管有没有进永久介质都可以read呢?那fsync的一般什么时候用呢?
qq120848369 2013-10-03
  • 打赏
  • 举报
回复
POSIX requires that a read(2) which can be proved to occur after a write() has returned returns the new data. Note that not all filesystems are POSIX conforming. 楼主说的现象应该是完全不存在的,write只要返回值表明已经写入内核,那么read就可以读到。至于内核何时将数据写入磁盘,那是pdflush另一码事。

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧