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實戰》(今晚開獎)
文章公號 首發!連載中!關注微信公號回復:“抽獎” 還可參加抽📖活動
誠信第一,活動真實有效