五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:Linux 日志文件系統(tǒng)未解之謎,你知道嗎?

2020-11-23 22:52 作者:C語言編程__Plus  | 我要投稿



文件系統(tǒng)要解決的一個(gè)關(guān)鍵問題是怎樣防止掉電或系統(tǒng)崩潰造成數(shù)據(jù)損壞,在此類意外事件中,導(dǎo)致文件系統(tǒng)損壞的根本原因在于寫文件不是原子操作,因?yàn)閷懳募婕暗牟粌H僅是用戶數(shù)據(jù),還涉及元數(shù)據(jù)(metadata)包括 Superblock、inode bitmap、inode、data block bitmap等,所以寫操作無法一步完成,如果其中任何一個(gè)步驟被打斷,就會(huì)造成數(shù)據(jù)的不一致或損壞。

舉一個(gè)簡(jiǎn)化的例子,我們對(duì)一個(gè)文件進(jìn)行寫操作,要涉及以下步驟:

(1)從data block bitmap中分配一個(gè)數(shù)據(jù)塊;

(2)在inode中添加指向數(shù)據(jù)塊的指針;

(3)把用戶數(shù)據(jù)寫入數(shù)據(jù)塊。

如果步驟2完成了,3未完成,結(jié)果是數(shù)據(jù)損壞,因?yàn)樵撐募J(rèn)為數(shù)據(jù)塊是自己的,但里面的數(shù)據(jù)其實(shí)是垃圾;

如果步驟2完成了,1未完成,結(jié)果是元數(shù)據(jù)不一致,因?yàn)樵撐募呀?jīng)把數(shù)據(jù)塊據(jù)為己有,然而文件系統(tǒng)卻還認(rèn)為該數(shù)據(jù)塊未分配、隨后又可能會(huì)把該數(shù)據(jù)塊分配給別的文件、造成數(shù)據(jù)覆蓋;

如果步驟1完成了、2未完成,結(jié)果就是文件系統(tǒng)分配了一個(gè)數(shù)據(jù)塊,但是沒有任何文件用到這個(gè)數(shù)據(jù)塊,造成空間浪費(fèi);

如果步驟3完成了,2未完成,結(jié)果就是用戶數(shù)據(jù)寫入了硬盤數(shù)據(jù)塊中,但白寫了,因?yàn)槲募恢肋@個(gè)數(shù)據(jù)塊是自己的。


日志文件系統(tǒng)(Journal File System)就是為解決上述問題而誕生的。

它的原理是在進(jìn)行寫操作之前,把即將進(jìn)行的各個(gè)步驟(稱為transaction)事先記錄下來,保存在文件系統(tǒng)上單獨(dú)開辟的一塊空間上,這就是所謂的日志(journal),也被稱為write-ahead logging,日志保存成功之后才進(jìn)行真正的寫操作、把文件系統(tǒng)的元數(shù)據(jù)和用戶數(shù)據(jù)寫進(jìn)硬盤(稱為checkpoint),這樣萬一寫操作的過程中掉電,下次掛載文件系統(tǒng)之前把保存好的日志重新執(zhí)行一遍就行了(術(shù)語叫做replay),避免了前述的數(shù)據(jù)損壞場(chǎng)景。

有人問如果保存日志的過程中掉電怎么辦?最初始的想法是把一條日志的數(shù)據(jù)一次性寫入硬盤,相當(dāng)于一個(gè)原子操作,然而這并不可行,因?yàn)橛脖P通常以512字節(jié)為單位進(jìn)行操作,日志數(shù)據(jù)一超過512字節(jié)就不可能一次性寫入了。所以實(shí)際上是這么做的:給每一條日志設(shè)置一個(gè)結(jié)束符,只有在日志寫入成功之后才寫結(jié)束符,如果一條日志沒有對(duì)應(yīng)的結(jié)束符就會(huì)被視為無效日志,直接丟棄,這樣就保證了日志里的數(shù)據(jù)是完整的。

一條日志在它對(duì)應(yīng)的寫操作完成之后就沒用了,占用的硬盤空間就可以釋放。保存日志的硬盤空間大小是有限的,被循環(huán)使用,所以日志也被稱為circular log。


至此可以總結(jié)一下日志文件系統(tǒng)的工作步驟了:

Journal write : 把transaction寫入日志中;

Journal commit : 在一條日志保存好之后,寫入結(jié)束符;

Checkpoint : 進(jìn)行真正的寫操作,把元數(shù)據(jù)(metadata)和用戶數(shù)據(jù)(user data)寫入文件系統(tǒng);

Free : 回收日志占用的硬盤空間。

以上方式把用戶數(shù)據(jù)(user data)也記錄在日志中,稱為Data Journaling,Linux EXT3文件系統(tǒng)就支持這種方式,這種方式存在效率問題:

就是每一個(gè)寫操作涉及的元數(shù)據(jù)(metadata)和用戶數(shù)據(jù)(user data)實(shí)際上都要在硬盤上寫兩次,一次寫在日志里,一次寫在文件系統(tǒng)上。元數(shù)據(jù)倒也罷了,用戶數(shù)據(jù)通常比較大,拷貝幾個(gè)GB的電影文件也要乘以2實(shí)在是降低了效率。


一個(gè)更高效的方式是Metadata Journaling,不把用戶數(shù)據(jù)(user data)記錄在日志中,它防止數(shù)據(jù)損壞的方法是先寫入用戶數(shù)據(jù)(user data)、再寫日志,即在上述”Journal write”之前先寫用戶數(shù)據(jù),這樣就保證了只要日志是有效的,那么它對(duì)應(yīng)的用戶數(shù)據(jù)也是有效的,一旦發(fā)生掉電故障,最壞的結(jié)果也就是最后一條日志沒記完,那么對(duì)應(yīng)的用戶數(shù)據(jù)也會(huì)丟,效果與Data Journaling丟棄日志一樣,重要的是文件系統(tǒng)的一致性和完整性是有保證的。

Metadata Journaling又叫Ordered Journaling,大多數(shù)文件系統(tǒng)都采用這種方式。像Linux EXT3文件系統(tǒng)也是可以選擇Data Journaling還是Ordered Journaling的。

另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!

分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!

另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~

編程學(xué)習(xí)書籍分享:

編程學(xué)習(xí)視頻分享:


C/C++編程筆記:Linux 日志文件系統(tǒng)未解之謎,你知道嗎?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
自治县| 柳江县| 嫩江县| 阳朔县| 四平市| 安庆市| 宁海县| 阳谷县| 萝北县| 奉贤区| 兴城市| 襄樊市| 娱乐| 祁门县| 育儿| 城市| 白朗县| 延吉市| 北京市| 雅安市| 乡宁县| 保定市| 高阳县| 防城港市| 龙海市| 裕民县| 芒康县| 彩票| 屯留县| 馆陶县| 佛教| 泗水县| 奉贤区| 涡阳县| 乌海市| 沧源| 石狮市| 司法| 蒲城县| 三门峡市| 杭锦旗|