小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

同步內(nèi)核緩沖區(qū)sync、fsync和fdatasync函數(shù)

 海漩渦 2016-03-25
轉(zhuǎn)自:
http://www./os/201409/339460.html

同步內(nèi)核緩沖區(qū)sync、fsync和fdatasync函數(shù)
2014-09-30      0 個(gè)評論    來源:FMsunyh  
收藏    我要投稿

同步內(nèi)核緩沖區(qū)

1.緩沖區(qū)簡介

人生三大錯(cuò)覺之一:在調(diào)用函數(shù)write()時(shí),我們認(rèn)為該函數(shù)一旦返回,數(shù)據(jù)便已經(jīng)寫到了文件中.但是這種概念只是宏觀上的.實(shí)際上,操作系統(tǒng)實(shí)現(xiàn)某些文件I/O時(shí)(如磁盤文件),為了保證I/O的效率,在內(nèi)核通常會(huì)用到一片專門的區(qū)域(內(nèi)存或獨(dú)立的I/O地址空間)作為I/O數(shù)據(jù)緩沖區(qū).它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù),使得低速的設(shè)備和高速的CPU能夠協(xié)調(diào)工作避免低速的輸入輸出設(shè)備長時(shí)間占用CPU,減少系統(tǒng)調(diào)用,提高了CPU的工作效率.

2.不同步的write()

傳統(tǒng)的UNIX或LINUX系統(tǒng)在設(shè)計(jì)時(shí)使用了內(nèi)核緩沖區(qū),設(shè)有高速緩沖區(qū)或頁面高速緩沖區(qū),大多數(shù)磁盤I/O都通過緩沖區(qū)進(jìn)行.當(dāng)將數(shù)據(jù)寫入文件時(shí),內(nèi)核通常先將該數(shù)據(jù)復(fù)制到其中一個(gè)緩沖區(qū),如果該緩沖區(qū)尚未寫滿,則并不將其排入輸出隊(duì)列,而是等待其寫滿或者當(dāng)內(nèi)核需要重用該緩沖區(qū)以便存放其他磁盤塊數(shù)據(jù)時(shí),再將該緩沖區(qū)排入輸出隊(duì)列;然后待其到達(dá)隊(duì)首時(shí),才進(jìn)行實(shí)際的I/O操作.這種輸出方式被稱為延遲寫.
當(dāng)調(diào)用write()函數(shù)寫出數(shù)據(jù)時(shí),數(shù)據(jù)一旦寫到該緩沖區(qū)(關(guān)鍵:只是寫到緩沖區(qū)),函數(shù)便立即返回.此時(shí)寫出的數(shù)據(jù)可以用read()讀回,也可以被其他進(jìn)程讀到,但是并不意味著它們已經(jīng)被寫到了外部永久存儲(chǔ)介質(zhì)上,即使調(diào)用close()關(guān)閉文件后也可能如此. 因?yàn)榫彌_區(qū)的數(shù)據(jù)可能還在等待輸出.
因此,從數(shù)據(jù)被實(shí)際寫到磁盤的角度來看,用write()寫出的文件數(shù)據(jù)與外部存儲(chǔ)設(shè)備并不是完全同步的.不同步的時(shí)間間隔非常短,一般只有幾秒或十幾秒,具體取決于寫出的數(shù)據(jù)量和I/O數(shù)據(jù)緩沖區(qū)的狀態(tài).盡管不同步的時(shí)間間隔很短,但是如果在此期間發(fā)生掉電或者系統(tǒng)崩潰,則會(huì)導(dǎo)致所寫數(shù)據(jù)來不及寫至磁盤而丟失的情況.
注意:內(nèi)核將緩沖區(qū)中的數(shù)據(jù)“寫”到標(biāo)準(zhǔn)輸入磁盤文件中,這里“寫”不是將緩沖區(qū)中的數(shù)據(jù)移動(dòng)到磁盤文件中,而是拷貝到磁盤文件中,也就說此時(shí)磁盤文件中還保留一份緩沖區(qū)內(nèi)容的備份.如圖1所示.做出這一設(shè)計(jì)也是有其道理的,如果寫出到磁盤文件上,磁盤壞了或滿了等等,總之就是無法將數(shù)據(jù)送出,假如沒備份,那數(shù)據(jù)不是丟掉了.也就是說內(nèi)核會(huì)等待寫入磁盤動(dòng)作完成后,才放心的將備份的數(shù)據(jù)刪除掉.在下文討論的三個(gè)函數(shù)中也將涉及到這個(gè)過程.
\
圖1 數(shù)據(jù)傳入過程示意圖

為了保證磁盤上實(shí)際文件系統(tǒng)與緩沖區(qū)高速緩存中內(nèi)容的一致性,UNIX系統(tǒng)提供了sync、fsync和fdatasync三個(gè)函數(shù).

3.sync函數(shù)

頭文件:#include<unistd.h>
定義函數(shù):void sync(void);
返回值:若成功則返回0,若出錯(cuò)則返回-1,同時(shí)設(shè)置errno以指明錯(cuò)誤.
函數(shù)說明:
sync負(fù)責(zé)將系統(tǒng)緩沖區(qū)的數(shù)據(jù)“寫入”磁盤,以確保數(shù)據(jù)的一致性和同步性.注意:sync函數(shù)只是將所有修改過的塊緩沖區(qū)排入寫隊(duì)列,然后就返回,他并不等待實(shí)際I/O操作結(jié)束.所以不要認(rèn)為調(diào)用了sync函數(shù),就覺得數(shù)據(jù)已安全的送到磁盤文件上,有可能會(huì)出現(xiàn)問題,但是sync函數(shù)是無法得知的.
系統(tǒng)守候進(jìn)程一般每隔一段時(shí)間調(diào)用一次sync函數(shù),確保定期刷新內(nèi)核的塊緩存.UNIX系統(tǒng)中,系統(tǒng)守候進(jìn)程update會(huì)周期性地(一般每個(gè)30秒)調(diào)用sync函數(shù).命令sync(1)也調(diào)用sync函數(shù).

4.fsync函數(shù)

頭文件:#include<unistd.h>
定義函數(shù):int fsync(int filedes);
返回值:若成功則返回0,若出錯(cuò)則返回-1,同時(shí)設(shè)置errno以指明錯(cuò)誤.
函數(shù)說明:
與sync函數(shù)不同,fsync函數(shù)只對由文件描符filedes指定的單一文件起作用,強(qiáng)制與描述字fildes相連文件的所有修改過的數(shù)據(jù)(包括核內(nèi)I/O緩沖區(qū)中的數(shù)據(jù))傳送到外部永久介質(zhì),即刷新fildes給出的文件的所有信息,并且等待寫磁盤操作結(jié)束,然后返回.調(diào)用 fsync()的進(jìn)程將阻塞直到設(shè)備報(bào)告?zhèn)魉鸵呀?jīng)完成.這個(gè)fsync就安全點(diǎn)了.
一個(gè)程序在寫出數(shù)據(jù)之后,如果繼續(xù)進(jìn)行后續(xù)處理之前要求確保所寫數(shù)據(jù)已寫到磁盤,則應(yīng)當(dāng)調(diào)用fsync().例如,數(shù)據(jù)庫應(yīng)用通常會(huì)在調(diào)用write()保存關(guān)鍵交易數(shù)據(jù)的同時(shí)也調(diào)用fsync().這樣更能保證數(shù)據(jù)的安全可靠.

5.fdatasync函數(shù)

頭文件:#include<unistd.h>
定義函數(shù):int fdatasync(int filedes);
返回值:若成功則返回0,若出錯(cuò)則返回-1,同時(shí)設(shè)置errno以指明錯(cuò)誤.
函數(shù)說明:
fdatasync函數(shù)類似于fsync函數(shù),但它只影響文件數(shù)據(jù)部分,強(qiáng)制傳送用戶已寫出的數(shù)據(jù)至物理存儲(chǔ)設(shè)備,不包括文件本身的特征數(shù)據(jù).這樣可以適當(dāng)減少文件刷新時(shí)的數(shù)據(jù)傳送量.而除數(shù)據(jù)外,fdatasync還會(huì)同步更新文件的屬性.

6.錯(cuò)誤代碼

EBADF:文件描述符無效,或文件已關(guān)閉.
EIO : 讀寫的過程中發(fā)生錯(cuò)誤 .
EROFS, EINVAL:文件所在的文件系統(tǒng)不支持同步.

7.fflush()與fsync()的聯(lián)系

內(nèi)核I/O緩沖區(qū)是由操作系統(tǒng)管理的空間,而流緩沖區(qū)是由標(biāo)準(zhǔn)I/O庫管理的用戶空間.fflush()只刷新位于用戶空間中的流緩沖區(qū).fflush()返回后,只保證數(shù)據(jù)已不在流緩沖區(qū)中,并不保證它們一定被寫到了磁盤.此時(shí),從流緩沖區(qū)刷新的數(shù)據(jù)可能已被寫至磁盤,也可能還待在內(nèi)核I/O緩沖區(qū)中.要確保流I/O寫出的數(shù)據(jù)已寫至磁盤,那么在調(diào)用fflush()后還應(yīng)當(dāng)調(diào)用fsync().

8.綜述

雖然延遲寫減少了磁盤讀寫次數(shù),但是卻降低了文件內(nèi)容的更新速度,使得欲寫到文件中數(shù)據(jù)在一段時(shí)間內(nèi)并沒有寫到磁盤上。當(dāng)系統(tǒng)發(fā)生故障時(shí),這種延遲可能造成文件更新內(nèi)容的丟失。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多