中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
同步內(nèi)核緩沖區(qū)sync、fsync和fdatasync函數(shù)
轉(zhuǎn)自:
http://www.2cto.com/os/201409/339460.html

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

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

1.緩沖區(qū)簡(jiǎn)介

人生三大錯(cuò)覺(jué)之一:在調(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之間,用來(lái)緩存數(shù)據(jù),使得低速的設(shè)備和高速的CPU能夠協(xié)調(diào)工作避免低速的輸入輸出設(shè)備長(zhǎng)時(shí)間占用CPU,減少系統(tǒng)調(diào)用,提高了CPU的工作效率.

2.不同步的write()

傳統(tǒng)的UNIX或LINUX系統(tǒng)在設(shè)計(jì)時(shí)使用了內(nèi)核緩沖區(qū),設(shè)有高速緩沖區(qū)或頁(yè)面高速緩沖區(qū),大多數(shù)磁盤I/O都通過(guò)緩沖區(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í)際寫到磁盤的角度來(lái)看,用write()寫出的文件數(shù)據(jù)與外部存儲(chǔ)設(shè)備并不是完全同步的.不同步的時(shí)間間隔非常短,一般只有幾秒或十幾秒,具體取決于寫出的數(shù)據(jù)量和I/O數(shù)據(jù)緩沖區(qū)的狀態(tài).盡管不同步的時(shí)間間隔很短,但是如果在此期間發(fā)生掉電或者系統(tǒng)崩潰,則會(huì)導(dǎo)致所寫數(shù)據(jù)來(lái)不及寫至磁盤而丟失的情況.
注意:內(nèi)核將緩沖區(qū)中的數(shù)據(jù)“寫”到標(biāo)準(zhǔn)輸入磁盤文件中,這里“寫”不是將緩沖區(qū)中的數(shù)據(jù)移動(dòng)到磁盤文件中,而是拷貝到磁盤文件中,也就說(shuō)此時(shí)磁盤文件中還保留一份緩沖區(qū)內(nèi)容的備份.如圖1所示.做出這一設(shè)計(jì)也是有其道理的,如果寫出到磁盤文件上,磁盤壞了或滿了等等,總之就是無(wú)法將數(shù)據(jù)送出,假如沒(méi)備份,那數(shù)據(jù)不是丟掉了.也就是說(shuō)內(nèi)核會(huì)等待寫入磁盤動(dòng)作完成后,才放心的將備份的數(shù)據(jù)刪除掉.在下文討論的三個(gè)函數(shù)中也將涉及到這個(gè)過(guò)程.

圖1 數(shù)據(jù)傳入過(guò)程示意圖

為了保證磁盤上實(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ù)說(shuō)明:
sync負(fù)責(zé)將系統(tǒng)緩沖區(qū)的數(shù)據(jù)“寫入”磁盤,以確保數(shù)據(jù)的一致性和同步性.注意:sync函數(shù)只是將所有修改過(guò)的塊緩沖區(qū)排入寫隊(duì)列,然后就返回,他并不等待實(shí)際I/O操作結(jié)束.所以不要認(rèn)為調(diào)用了sync函數(shù),就覺(jué)得數(shù)據(jù)已安全的送到磁盤文件上,有可能會(huì)出現(xiàn)問(wèn)題,但是sync函數(shù)是無(wú)法得知的.
系統(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ù)說(shuō)明:
與sync函數(shù)不同,fsync函數(shù)只對(duì)由文件描符filedes指定的單一文件起作用,強(qiáng)制與描述字fildes相連文件的所有修改過(guò)的數(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ù)庫(kù)應(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ù)說(shuō)明:
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:文件描述符無(wú)效,或文件已關(guān)閉.
EIO : 讀寫的過(guò)程中發(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庫(kù)管理的用戶空間.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)并沒(méi)有寫到磁盤上。當(dāng)系統(tǒng)發(fā)生故障時(shí),這種延遲可能造成文件更新內(nèi)容的丟失。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
linux 同步IO: sync、fsync與fdatasync
文件系統(tǒng)I/O與mysql相關(guān)參數(shù)關(guān)系
緩沖還是不緩沖?這是個(gè)問(wèn)題
正確的使用dd進(jìn)行磁盤讀寫速度測(cè)試
IO的過(guò)程
MySQL的零拷貝技術(shù)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服