国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > 建站經(jīng)驗 > 正文

函數(shù)sync、fsync與fdatasync的總結整理(必看篇)

2019-11-02 16:44:48
字體:
來源:轉載
供稿:網(wǎng)友

一、術語解釋

臟頁: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內核線程在滿足一定條件時(一定時間間隔、內存中

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴国县| 黔南| 卢龙县| 边坝县| 阳原县| 石景山区| 根河市| 万盛区| 天台县| 霍邱县| 乌拉特前旗| 三门县| 新安县| 临海市| 简阳市| 双江| 广南县| 新闻| 旺苍县| 阳泉市| 石家庄市| 瓮安县| 渭南市| 南昌县| 中山市| 陈巴尔虎旗| 常山县| 陆丰市| 泗洪县| 岳池县| 黄陵县| 邢台县| 宽甸| 兰考县| 维西| 闽侯县| 扶风县| 湄潭县| 东海县| 郧西县| 盐池县|