一、術語解釋
臟頁:linux內核中的概念,因為硬盤的讀寫速度遠趕不上內存的速度,系統(tǒng)就把讀寫比較頻繁的數(shù)據(jù)事先放到內存中,以提高讀寫速度,這就叫高速緩存,linux是以頁作為高速緩存的單位,當進程修改了高速緩存里的數(shù)據(jù)時,該頁就被內核標記為臟頁,內核將會在合適的時間把臟頁的數(shù)據(jù)寫到磁盤中去,以保持高速緩存中的數(shù)據(jù)和磁盤中的數(shù)據(jù)是一致的。
內存映射:內存映射文件,是由一個文件到一塊內存的映射。Win32提供了允許應用程序把文件映射到一個進程的函數(shù) (CreateFileMapping)。內存映射文件與虛擬內存有些類似,通過內存映射文件可以保留一個地址空間的區(qū)域,同時將物理存儲器提交給此區(qū)域,內存文件映射的物理存儲器來自一個已經(jīng)存在于磁盤上的文件,而且在對該文件進行操作之前必須首先對文件進行映射。使用內存映射文件處理存儲于磁盤上的文件時,將不必再對文件執(zhí)行I/O操作,使得內存映射文件在處理大數(shù)據(jù)量的文件時能起到相當重要的作用。
//摘錄自百度百科
延遲寫(delayed write): 傳統(tǒng)的UNIX實現(xiàn)在內核中設有緩沖區(qū)高速緩存或頁面高速緩存,大多數(shù)磁盤I/O都通過緩沖進行。 當將數(shù)據(jù)寫入文件時,內核通常先將該數(shù)據(jù)復制到其中一個緩沖區(qū)中,如果該緩沖區(qū)尚未寫滿,則 并不將其排入輸出隊列,而是等待其寫滿或者當內核需要重用該緩沖區(qū)以便存放其他磁盤塊數(shù)據(jù)時, 再將該緩沖排入到輸出隊列,然后待其到達隊首時,才進行實際的I/O操作。這種輸出方式就被稱為延遲寫。
//摘錄自《UNIX環(huán)境高級編程第三版》P65
二、正文
延遲寫減少了磁盤讀寫次數(shù),但是卻降低了文件內容的更新速度,使得欲寫到文件中的數(shù)據(jù)在一段時間內并沒有寫到磁盤上。當系統(tǒng)發(fā)生故障時,這種延遲可能造成文件更新內容的丟失。為了保證磁盤上實際文件系統(tǒng)與緩沖區(qū)高速緩存中內容的一致性,UNIX系統(tǒng)提供了sync、fsync和fdatasync三個函數(shù)。
1、sync函數(shù)
sync函數(shù)只是將所有修改過的塊緩沖區(qū)排入寫隊列,然后就返回,它并不等待實際寫磁盤操作結束。
通常稱為update的系統(tǒng)守護進程會周期性地(一般每隔30秒)調用sync函數(shù)。這就保證了定期沖洗內核的塊緩沖區(qū)。命令sync(1)也調用sync函數(shù)。
2、fsync函數(shù)
fsync函數(shù)只對由文件描述符filedes指定的單一文件起作用,并且等待寫磁盤操作結束,然后返回。
fsync可用于數(shù)據(jù)庫這樣的應用程序,這種應用程序需要確保將修改過的塊立即寫到磁盤上。
3、fdatasync函數(shù)
fdatasync函數(shù)類似于fsync,但它只影響文件的數(shù)據(jù)部分。而除數(shù)據(jù)外,fsync還會同步更新文件的屬性。
對于提供事務支持的數(shù)據(jù)庫,在事務提交時,都要確保事務日志(包含該事務所有的修改操作以及一個提交記錄)完全寫到硬盤上,才認定事務提交成功并返回給應用層。
4、fflush:標準IO函數(shù)(如fread,fwrite等)會在內存中建立緩沖,該函數(shù)刷新內存緩沖,將內容寫入內核緩沖,要想將其真正寫入磁盤,還需要調用fsync。(即先調用fflush然后再調用fsync,否則不會起作用)。fflush以指定的文件流描述符為參數(shù)(對應以fopen等函數(shù)打開的文件流),僅僅是把上層緩沖區(qū)中的數(shù)據(jù)刷新到內核緩沖區(qū)就返回,
因此相對于fsync而言不是很安全,還需要再調用一下fsync來把數(shù)據(jù)真正寫入硬盤。使用函數(shù)
int fileno(FILE *stream);
把文件流描述符(fp)轉換為文件描述符(fd),以方便fsync的調用,那么,在Linux操作系統(tǒng)上,怎樣才能保證數(shù)據(jù)被正確地寫入外部永久存儲介質?
1. write不能滿足要求,需要fsync
對于write函數(shù),我們認為該函數(shù)一旦返回,數(shù)據(jù)便已經(jīng)寫到了文件中。但是這種概念只是宏觀上的,一般情況下,對硬盤(或者其他持久存儲設備)文件的write操作,更新的只是內存中的頁緩存(page cache),而臟頁不會立即更新到硬盤中,而是由操作系統(tǒng)統(tǒng)一調度,如flusher內核線程在滿足一定條件時(一定時間間隔、內存中
新聞熱點
疑難解答