歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux delay write學習

Linux delay write學習

日期:2017/2/28 14:37:19   编辑:Linux教程

以下幾個系統調用用來將buffer中的數據寫回到磁盤中。
其中:
系統調用sync先將數據寫到buffer,再從buffer寫回磁盤中;
它是異步調用,函數返回但I/O操作可能未完成。
fsync系統調用會將metadata和數據區數據都寫回到磁盤中;
它是同步調用,函數返回時I/O操作即完成。
fdatasync只是將數據區數據寫回磁盤中,metadata不會寫回磁盤。

#include <unistd.h>

int fsync(int fd);
int fdatasync(int fd);
void sync(void);

所以,可以根據具體需要決定是調用fsync還是sync抑或是fdatasync系統調用。

metadata:data about data,即文件的描述性信息比如文件大小、
最後修改時間、最後訪問時間、文件權限等等。

fsync與fflush的區別?
#include <stdio.h>

int fflush(FILE *stream);
fflush是libc提供的庫函數,而fsync是操作系統提供的系統調用;
fflush是從c庫緩沖區寫到內核緩沖區,而fsync是從內核緩沖區寫到磁盤中;
fsync才會真正的寫磁盤。

為什麼還需要將數據寫回到磁盤?
linux系統下,大多數磁盤I/O都通過緩存進行。
當寫數據回磁盤時,並不是立即將數據寫回到磁盤,
而是將數據從內核拷貝到buffer中並且在必要時將數據真正回寫到磁盤中。
這就是delay write。
這種必要時是指:
1. buffer已滿;
2. 到了周期性寫磁盤的時間。
buffer數據結構:
struct buffer_head{
...
bool b_dirty;
time time;
};
其中成員b_dirty用來表明緩沖區是否被修改;
成員time表示這個dirty buffer需要在time這個時間後會自動回寫,
這是由linux內核線程kflush完成的?

延遲寫減少了讀寫磁盤的次數,提高了寫文件的效率。
但帶來的一個問題就是:
寫文件時並不能立即更新到磁盤中;
如果此時系統斷電或遇到其它不可預知的故障,這樣就會造成文件更新內容的丟失。
所以linux系統提供了fsync/sync等系統調用共用戶在需要時將數據立即寫回磁盤中。

Copyright © Linux教程網 All Rights Reserved