關於write()和fsync()

write

ssize_t write(int fd, const void *buf, size_t count);

將數據寫到文件中. 注意, 如果文件是保存在硬盤中, write() 函數調用返回之後, 並不表示數據已經寫入到硬盤中, 這時如果掉電, 數據可能會丟失.

fsync

int fsync(int fd);

程序調用本函數, 通知內核把數據寫到硬盤(file)中. 比如, 你開發一個數據庫軟件, 就需要這樣的函數, 否則掉電或者系統崩潰時便會丟失數據.

如果你的程序不調用 fsync(), Linux 內核也會自動在”合適”的時候將你的數據真正寫入到硬盤(類似調用 fsync), 最長的延時默認是 30 秒.

阻塞 

阻塞是 IO 的精華所在, 不管是文件 IO 還是網絡 IO, 只有真正了理解了 IO 阻塞, 才能做出所謂在高併發高性能軟件(服務器).

當 fsync() 和 write() 同一個 fd 時, write() 必然阻塞. 當系統 IO 非常繁忙時, fsync() 可能會阻塞, 即使系統 IO 不繁忙, fsync() 也會因爲數據量大而慢.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章