write *** 作底层调用

write *** 作底层调用,第1张

open标志位

O_DIRECT绕过page_cache

O_APPEND目前nfs4不支持原子追加写入,本地文件系统通过inode锁可以实现原子写入。

java的write只是系统调用成功,写入page_cache,不代表写入到硬件存储上。

*** 作系统提供fsync,fdatasyn两个方法,满足用户同步数据到持久化设备,fdatasync尽可能不同步文件元数据以减少磁盘IO来提高性能。

RandomAccessFile打开文件的4中模式中rws会在open文件时传入O_SYNC标志位,rwd传入O_DSYNC已区分调用fsync还是fdatasync。

FileDescription类的sync方法在UNIX系统上底层调用是fsync,保证数据保存到持久化存储设备后返回。但是如果系统使用了硬盘本身的缓存,一般系统定时调用硬盘flush接口,即时fsync调用成功突然断电也有可能丢失数据。

对于写 *** 作,有write back和write through两种机制,前者将数据写至缓存就会返回,而后者则会将数据写到磁盘介质上再返回。

如果想要保证调用fsync或fdatasync后数据一定能写到磁盘上,可以开启linux的write barrier,它可以控制在IO *** 作之前和之后刷新缓存来达到一定能写入磁盘的目的。Ext4 文件系统默认启用 barrier机制,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。类似java的happen-before原则

重要数据机房使用UPS断电保护很重要。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/920557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存