0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

存儲器的金字塔結(jié)構(gòu)

Linux閱碼場 ? 來源:未知 ? 作者:李倩 ? 2018-08-30 08:16 ? 次閱讀

寫在前面

在開始正式的討論前,我先拋出幾個問題:

談到磁盤時,常說的HDD磁盤和SSD磁盤最大的區(qū)別是什么?這些差異會影響我們的系統(tǒng)設(shè)計嗎?

單線程寫文件有點(diǎn)慢,那多開幾個線程一起寫是不是可以加速呢?

write(2)函數(shù)成功返回了,數(shù)據(jù)就已經(jīng)成功寫入磁盤了嗎?此時設(shè)備斷電會有影響嗎?會丟失數(shù)據(jù)嗎?

write(2)調(diào)用是原子的嗎?多線程寫文件是否要對文件加鎖?有沒有例外,比如O_APPEND方式?

坊間傳聞,mmap(2)的方式讀文件比傳統(tǒng)的方式要快,因為少一次拷貝。真是這樣嗎?為什么少一次拷貝?

如果你覺得這些問題都很簡單,都能很明確的回答上來。那么很遺憾這篇文章不是為你準(zhǔn)備的,你可以關(guān)掉網(wǎng)頁去做其他更有意義的事情了。如果你覺得無法明確的回答這些問題,那么就耐心地讀完這篇文章,相信不會浪費(fèi)你的時間。受限于個人時間和文章篇幅,部分議題如果我不能給出更好的解釋或者已有專業(yè)和嚴(yán)謹(jǐn)?shù)?a href="http://srfitnesspt.com/soft/special/" target="_blank">資料,就只會給出相關(guān)的參考文獻(xiàn)的鏈接,請讀者自行參閱。

言歸正傳,我們的討論從存儲器的層次結(jié)構(gòu)開始。

存儲器的金字塔結(jié)構(gòu)

受限于存儲介質(zhì)的存取速率和成本,現(xiàn)代計算機(jī)的存儲結(jié)構(gòu)呈現(xiàn)為金字塔型[1]。越往塔頂,存取效率越高、但成本也越高,所以容量也就越小。得益于程序訪問的局部性原理[2],這種節(jié)省成本的做法也能取得不俗的運(yùn)行效率。從存儲器的層次結(jié)構(gòu)以及計算機(jī)對數(shù)據(jù)的處理方式來看,上層一般作為下層的Cache層來使用(廣義上的Cache)。比如寄存器緩存CPU Cache的數(shù)據(jù),CPU Cache L1~L3層視具體實(shí)現(xiàn)彼此緩存或直接緩存內(nèi)存的數(shù)據(jù),而內(nèi)存往往緩存來自本地磁盤的數(shù)據(jù)。

本文主要討論磁盤IO操作,故只聚焦于Local Disk的訪問特性和其與DRAM之間的數(shù)據(jù)交互。

無處不在的緩存

如圖,當(dāng)程序調(diào)用各類文件操作函數(shù)后,用戶數(shù)據(jù)(User Data)到達(dá)磁盤(Disk)的流程如圖所示[3]。圖中描述了Linux下文件操作函數(shù)的層級關(guān)系和內(nèi)存緩存層的存在位置。中間的黑色實(shí)線是用戶態(tài)和內(nèi)核態(tài)的分界線。

從上往下分析這張圖,首先是C語言stdio庫定義的相關(guān)文件操作函數(shù),這些都是用戶態(tài)實(shí)現(xiàn)的跨平臺封裝函數(shù)。stdio中實(shí)現(xiàn)的文件操作函數(shù)有自己的stdio buffer,這是在用戶態(tài)實(shí)現(xiàn)的緩存。此處使用緩存的原因很簡單——系統(tǒng)調(diào)用總是昂貴的。如果用戶代碼以較小的size不斷的讀或?qū)懳募脑挘瑂tdio庫將多次的讀或者寫操作通過buffer進(jìn)行聚合是可以提高程序運(yùn)行效率的。stdio庫同時也支持fflush(3)函數(shù)來主動的刷新buffer,主動的調(diào)用底層的系統(tǒng)調(diào)用立即更新buffer里的數(shù)據(jù)。特別地,setbuf(3)函數(shù)可以對stdio庫的用戶態(tài)buffer進(jìn)行設(shè)置,甚至取消buffer的使用。

系統(tǒng)調(diào)用的read(2)/write(2)和真實(shí)的磁盤讀寫之間也存在一層buffer,這里用術(shù)語Kernel buffer cache來指代這一層緩存。在Linux下,文件的緩存習(xí)慣性的稱之為Page Cache,而更低一級的設(shè)備的緩存稱之為Buffer Cache. 這兩個概念很容易混淆,這里簡單的介紹下概念上的區(qū)別:Page Cache用于緩存文件的內(nèi)容,和文件系統(tǒng)比較相關(guān)。文件的內(nèi)容需要映射到實(shí)際的物理磁盤,這種映射關(guān)系由文件系統(tǒng)來完成;Buffer Cache用于緩存存儲設(shè)備塊(比如磁盤扇區(qū))的數(shù)據(jù),而不關(guān)心是否有文件系統(tǒng)的存在(文件系統(tǒng)的元數(shù)據(jù)緩存在Buffer Cache中)。

綜上,既然討論Linux下的IO操作,自然是跳過stdio庫的用戶態(tài)這一堆東西,直接討論系統(tǒng)調(diào)用層面的概念了。對stdio庫的IO層有興趣的同學(xué)可以自行去了解。從上文的描述中也介紹了文件的內(nèi)核級緩存是保存在文件系統(tǒng)的Page Cache中的。所以下篇的討論基本上是討論IO相關(guān)的系統(tǒng)調(diào)用和文件系統(tǒng)Page Cache的一些機(jī)制。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7408

    瀏覽量

    163425
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11182

    瀏覽量

    208514

原文標(biāo)題:淺墨: 聊聊Linux IO(上)

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PCB工程師金字塔分級標(biāo)準(zhǔn)

    PCB工程師金字塔分級標(biāo)準(zhǔn)
    發(fā)表于 08-06 13:21

    自制for循環(huán)打印金字塔

    自制for循環(huán)打印金字塔
    發(fā)表于 09-18 08:46

    基于金字塔模型的地形網(wǎng)格裂縫消除算法

    本文針對基于多分辨金字塔模型繪制海量地形時的網(wǎng)格裂縫問題,提出了一種網(wǎng)格裂縫消除算法。該算法利用分裂標(biāo)記表,結(jié)合金字塔模型本身分塊與多分辨率的特性,從整體上
    發(fā)表于 12-30 12:02 ?8次下載

    工程師電子制作故事:單片機(jī)控制LED金字塔DIY設(shè)計

      首先要說一下哪些人適合做這個金字塔:完全不懂程序的是可以的,但是一定要有焊接基礎(chǔ)。如果你自己焊接不出51最小系統(tǒng),也搞不定8X8的點(diǎn)陣,那我不建議你來做這個金字塔。
    發(fā)表于 05-01 10:37 ?2.3w次閱讀
    工程師電子制作故事:單片機(jī)控制LED<b class='flag-5'>金字塔</b>DIY設(shè)計

    圖像金字塔和resize綜合示例_《OpenCV3編程入門》書本配套源代碼

    《OpenCV3編程入門》書本配套源代碼:圖像金字塔和resize綜合示例
    發(fā)表于 06-06 15:52 ?3次下載

    基于壓縮金字塔核稀疏表示的人臉識別_周凱

    基于壓縮金字塔核稀疏表示的人臉識別_周凱
    發(fā)表于 01-08 11:13 ?0次下載

    新型太陽能電池板之光伏金字塔結(jié)構(gòu)反射紅外線

    很好的解決方案。因為一方面主動冷卻方式會消耗能源,成本較高,另一方面還會干擾太陽能電池板有效吸收光線。 為了解決這個問題,近日斯坦福大學(xué)的科學(xué)家們發(fā)明了一種新型太陽能電池板,能夠通過表面的微型三角金字塔結(jié)構(gòu)
    發(fā)表于 10-24 10:47 ?5次下載
    新型太陽能電池板之光伏<b class='flag-5'>金字塔結(jié)構(gòu)</b>反射紅外線

    繪制金字塔程序?qū)崿F(xiàn)

    用c語言編程繪制金字塔
    發(fā)表于 11-27 16:24 ?795次閱讀

    可控特性的金字塔變換

    本文設(shè)計了一種具有平移不變性、方向和尺度聯(lián)合可控特性的金字塔變換,稱為幾何變形可控金字塔變換(DPT)。此DPT從一種數(shù)值形式表示的方向可控金字塔變換(SPT)發(fā)展而來。我們以SPT的每一個方向可控
    發(fā)表于 12-14 16:41 ?4次下載
    可控特性的<b class='flag-5'>金字塔</b>變換

    一種金字塔注意力網(wǎng)絡(luò),用于處理圖像語義分割問題

    基于以上觀察,我們提出了特征金字塔注意力模塊 (FPA),該模塊能夠融合來自 U 型網(wǎng)絡(luò) (如特征金字塔網(wǎng)絡(luò) FPN) 所提取的三種不同尺度的金字塔特征。為了更好地提取不同尺度下金字塔
    的頭像 發(fā)表于 06-05 09:21 ?1.2w次閱讀
    一種<b class='flag-5'>金字塔</b>注意力網(wǎng)絡(luò),用于處理圖像語義分割問題

    中國集成電路封裝行業(yè)市場現(xiàn)狀——金字塔的尖頂與基座

    中國集成電路封裝行業(yè)技術(shù)演變路程漫漫集成電路封裝在電子學(xué)金字塔中的位置既是金字塔的尖頂又是金字塔的基座。
    的頭像 發(fā)表于 07-11 14:51 ?3257次閱讀

    基于規(guī)范化函數(shù)的深度金字塔模型算法

    傳統(tǒng)深度金字塔模型作為一種有效的行人檢測算法備受關(guān)注,融合可變形部件模型和卷積神經(jīng)網(wǎng)絡(luò)模型,但特征提取部分使用的算法像素區(qū)堿的大小不冋,導(dǎo)致模型之間不能完全融合,在行人數(shù)量多、姿勢復(fù)雜和有遮擋情況
    發(fā)表于 03-30 14:09 ?14次下載
    基于規(guī)范化函數(shù)的深度<b class='flag-5'>金字塔</b>模型算法

    晶片表面刻蝕工藝對碳硅太陽能電池特性的影響

    引言 為了分析不同尺寸的金字塔結(jié)構(gòu)對太陽能電池特性的影響,我們通過各種刻蝕工藝在硅片上形成了金字塔結(jié)構(gòu)。在此使用一步蝕刻工藝(堿性溶液蝕刻、反應(yīng)離子蝕刻(RIE)和金屬輔助化學(xué)蝕刻)以及兩步蝕刻
    發(fā)表于 01-11 14:05 ?1109次閱讀
    晶片表面刻蝕工藝對碳硅太陽能電池特性的影響

    DIKW金字塔中AI爬到了第幾層

    ,“這波啊,這波是在大氣層”。 這種說法雖然有些戲謔,但還真有點(diǎn)科學(xué)道理。 DIKW金字塔,是一個關(guān)于人類理解、推理和解釋的層次結(jié)構(gòu),分別是:數(shù)據(jù)(原始的事實(shí)集合)、信息(可被分析測量的結(jié)構(gòu)化數(shù)據(jù))、知識(需要洞察力和理解
    的頭像 發(fā)表于 04-09 19:51 ?1009次閱讀

    DIY自制基于51單片機(jī)的LED金字塔

    電子發(fā)燒友網(wǎng)站提供《DIY自制基于51單片機(jī)的LED金字塔.pdf》資料免費(fèi)下載
    發(fā)表于 10-25 10:27 ?0次下載
    DIY自制基于51單片機(jī)的LED<b class='flag-5'>金字塔</b>