一分鍾了解 sync、fsync、fdatasync 系統調用


Hi,大家好!我是白日夢。

今天我要跟你分享的話題是:“了解fsync這個系統調用嘛?談談看!”

文章公號 首發!連載中!關注微信公號回復:“抽獎” 還可參加抽📖活動

一、緩沖

傳統的UNIX實現的內核中都設置有緩沖區或者頁面高速緩存,大多數磁盤IO都是通過緩沖寫的。

當你想將數據write進文件時,內核通常會將該數據復制到其中一個緩沖區中,如果該緩沖沒被寫滿的話,內核就不會把它放入到輸出隊列中。

當這個緩沖區被寫滿或者內核想重用這個緩沖區時,才會將其排到輸出隊列中。等它到達等待隊列首部時才會進行實際的IO操作。

這里的輸出方式就是大家耳熟能詳的: 延遲寫

這個緩沖區就是大家耳熟能詳的:OS Cache


二、延遲寫的優缺點

很明顯、延遲寫降低了磁盤讀寫的次數,但同時也降低了文件的更新速度。

這樣當OS Crash時由於這種延遲寫的機制可能會造成文件更新內容的丟失。而為了保證磁盤上的實際文件和緩沖區中的內容保持一致,UNIX系統提供了三個系統調用:sync、fsync、fdatasync


三、sync、fsync、fdatasync

#include<unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
int sync();

sync系統調用:將所有修改過的緩沖區排入寫隊列,然后就返回了,它並不等實際的寫磁盤的操作結束。所以它的返回並不能保證數據的安全性。通常會有一個update系統守護進程每隔30s調用一次sync。

命令sync(1)也是調用sync函數。

fsync系統調用:需要你在入參的位置上傳遞給他一個fd,然后系統調用就會對這個fd指向的文件起作用。fsync會確保一直到寫磁盤操作結束才會返回。所以fsync適合數據庫這種程序。

后續白日夢會續跟大家分享MySQL的redolog、binlog等日志。MySQL都提供了相應的參數讓MySQL寫日志文件的使用fsync這個系統調用。歡迎關注,敬請諒解~

fdatasync系統調用:和fsync類似但是它只會影響文件的一部分,因為除了文件中的數據之外,fsync還會同步文件的屬性。


參考:《UNIX環境高級編程》


關注送書!《Netty實戰》(今晚開獎)

文章公號 首發!連載中!關注微信公號回復:“抽獎” 還可參加抽📖活動

誠信第一,活動真實有效



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM