?? Hi策精,我是小余。 本文已收錄到 GitHub · Androider-Planet 中第焰。這里有 Android 進(jìn)階成長(zhǎng)知識(shí)體系,關(guān)注公眾號(hào) [小余的自習(xí)室] 妨马,在成功的路上不迷路挺举!
前言
生活中經(jīng)常聽(tīng)到這句話(huà)“一分錢(qián)一分貨,哪有那么多又便宜又好用”烘跺,在計(jì)算機(jī)存儲(chǔ)體系中湘纵,也是如此,存儲(chǔ)速度越快的滤淳,也就越貴梧喷,而且是呈指數(shù)的貴。計(jì)算機(jī)存儲(chǔ)呈如下金字塔排布脖咐。
理想情況下铺敌,我們肯定希望擁有無(wú)限大的內(nèi)存容量,這樣就可以立刻訪問(wèn)任何一個(gè)特定的機(jī)器字屁擅,但我們不得不認(rèn)識(shí)到有可能需要構(gòu)建分層結(jié)構(gòu)的存儲(chǔ)器偿凭,每一層次容量都要大于前一層次,但其訪問(wèn)速度也要更慢一些派歌。
你是不是經(jīng)常被以下名詞弄得暈頭轉(zhuǎn)向弯囊。ROM/RAM/DRAM/SRAM/SDRAM/DDR SDRAM等等,下面胶果,我盡力以上圖為參考匾嘱,從上到下,說(shuō)明各個(gè)層次存儲(chǔ)器的特點(diǎn)和區(qū)別早抠,并對(duì)它們的工作原理做一些簡(jiǎn)要的說(shuō)明
1.寄存器(Register)
寄存器是CPU中的一部分奄毡。它是一個(gè)高速存貯部件,可以用來(lái)暫存指令贝或、數(shù)據(jù)和地址。每個(gè)CPU中有多個(gè)寄存器锐秦,例如8086CPU中含有14個(gè)寄存器咪奖。
寄存器是CPU的內(nèi)部組成單元,是CPU運(yùn)算時(shí)取指令和數(shù)據(jù)最快的地方酱床。它可以用來(lái)暫存指令羊赵、數(shù)據(jù)和地址。在CPU的控制部件中,包含的寄存器有指令寄存器(IR)和程序計(jì)數(shù)器(PC)昧捷。CPU的算術(shù)邏輯部件中闲昭,包含的寄存器有累加器(ACC)。 下圖中藍(lán)色小框里面靡挥,全是寄存器序矩。
2.高速緩存(Cache)與主存
2.1 引入cache的目的
計(jì)算機(jī)在運(yùn)行程序時(shí),首先將程序從磁盤(pán)讀取到主存跋破,然后CPU按規(guī)則從主存中取出指令簸淀,數(shù)據(jù)并執(zhí)行指令,但是直接從主存(一般是DRAM)中讀寫(xiě)是很慢的毒返,所以引入了高速緩存(Cache)租幕。
在程序運(yùn)行前首先會(huì)試圖將指令,數(shù)據(jù)從主存中讀取到Cache中拧簸,然后在程序執(zhí)行時(shí)直接訪問(wèn)Cache劲绪,如果指令和數(shù)據(jù)可以從Cache中讀取到,那么就說(shuō)是“命中(hit)”盆赤,反之就是“不命中(miss)”贾富,miss情況下需要從主存中讀取指令或者數(shù)據(jù),這樣會(huì)直接影響CPU的性能弟劲,所以命中率對(duì)CPU來(lái)說(shuō)至關(guān)重要祷安。
現(xiàn)代處理器一般有三層cache,分別稱(chēng)為L(zhǎng)1 cache兔乞、L2 cache汇鞭、L3 cache。L1 cache離CPU核最近庸追,存儲(chǔ)信息的讀取速度接近CPU核的工作速度霍骄,容量較小,一般分成I-cache和D-cache兩塊淡溯,分別存儲(chǔ)指令和數(shù)據(jù)读整;L2 cache比L1更遠(yuǎn),速度慢一些咱娶,但是容量更大米间,不分I-cache和D-cache;L3更慢膘侮、更大屈糊,現(xiàn)在流行多核處理器,L3一般由多個(gè)處理器核共享琼了,而L1逻锐、L2是單核私有的。
實(shí)際上cache是一個(gè)廣義的概念,可以認(rèn)為主存是磁盤(pán)的cache昧诱,而CPU內(nèi)cache又是主存的cache晓淀,使用cache的目的就是偽造出一個(gè)容量有低層次存儲(chǔ)器(如磁盤(pán))那么大,而速度又有寄存器(如通用寄存器)那么快的存儲(chǔ)器盏档,簡(jiǎn)單來(lái)說(shuō)就要讓存儲(chǔ)單元看起來(lái)又大又快凶掰。
2.2 cache的理論基礎(chǔ)
cache之所以能work,主要基于兩個(gè)認(rèn)識(shí)妆丘,即程序運(yùn)行時(shí)數(shù)據(jù)具有時(shí)間局部性和空間局部性锄俄。
時(shí)間局部性是指一個(gè)數(shù)據(jù)如果當(dāng)前被使用到,那么接下去一段時(shí)間它很可能被再次用到勺拣;空間局部性是指一個(gè)數(shù)據(jù)如果當(dāng)前被使用到奶赠,那么接下去一段時(shí)間它周?chē)臄?shù)據(jù)很可能也會(huì)被用到,比如數(shù)組药有。
2.3 Cache的組成方式
cache容量較小毅戈,所以數(shù)據(jù)需要按照一定的規(guī)則從主存映射到cache。一般把主存和cache分割成一定大小的塊愤惰,這個(gè)塊在主存中稱(chēng)為data block苇经,在cache中稱(chēng)為cache line。 舉個(gè)例子宦言,塊大小為1024個(gè)字節(jié)扇单,那么data block和cache line都是1024個(gè)字節(jié)。當(dāng)把主存和cache分割好之后奠旺,我們就可以把data block放到cache line中蜘澜,而這個(gè)“放”的規(guī)則一般有三種,分別是“直接映射”响疚、“組相聯(lián)”和“全相聯(lián)”鄙信。
直接映射
直接映射采用“取模”的方式進(jìn)行一對(duì)一映射。舉個(gè)例子忿晕,如果cache中共有8個(gè)cache line装诡,那么0、8践盼、16鸦采、24...號(hào)data block會(huì)被映射到0號(hào)cache line中,同理1咕幻、9赖淤、17....號(hào)data block會(huì)被映射到1號(hào)cache line中,具體可以參考下面的關(guān)系圖谅河。
組相聯(lián):
直接映射中主存中的每一個(gè)data block都有一個(gè)確定的cache line進(jìn)行映射,這是有缺陷的。當(dāng)程序連續(xù)讀取0绷耍、8吐限、0、8號(hào)data block的數(shù)據(jù)時(shí)褂始,因?yàn)橹挥幸粋€(gè)cache line供映射诸典,所以當(dāng)?shù)诙巫x取0號(hào)block時(shí),第一次讀到cache中的0號(hào)block早被頂替出去了崎苗,這時(shí)候又會(huì)產(chǎn)生miss狐粱,miss會(huì)極大地影響執(zhí)行效率。
為了解決上面的問(wèn)題胆数,提出使用“組相聯(lián)”的方式肌蜻。組相聯(lián)的主存-cache對(duì)應(yīng)關(guān)系見(jiàn)下圖。
根據(jù)上圖我們很容易發(fā)現(xiàn)比起直接映射必尼,組相聯(lián)翻倍了block可以映射的cache line的數(shù)量蒋搜,圖上數(shù)量為2,我們稱(chēng)每?jī)蓚€(gè)cache line為一個(gè)cache set判莉。
全相聯(lián)
全相聯(lián)是極端的組相聯(lián)豆挽,即cache只有一個(gè)cache set。每一個(gè)data block都可以存進(jìn)任何一個(gè)cache line券盅。下圖是對(duì)應(yīng)關(guān)系帮哈。
2.4.RAM與ROM
計(jì)算機(jī)中按存儲(chǔ)類(lèi)型劃分為隨機(jī)存儲(chǔ)器(Random Access Memory, RAM)和只讀存儲(chǔ)器(Read Only Memory, ROM)
-
(1)隨機(jī)存儲(chǔ)器(Random Access Memory, RAM)
RAM是一種可讀/寫(xiě)存儲(chǔ)器,其特點(diǎn)是存儲(chǔ)器的任何一個(gè)存儲(chǔ)單元的內(nèi)容都可以隨機(jī)存取锰镀,而且存取時(shí)間域存儲(chǔ)單元的物理位置無(wú)關(guān)娘侍。
-
(2)只讀存儲(chǔ)器(Read Only Memory, ROM)
顧名思義,ROM只能對(duì)其存儲(chǔ)的內(nèi)容讀出互站,不能對(duì)其重新寫(xiě)入私蕾。因此,通常用它存放固定不變的程序胡桃、常數(shù)踩叭、漢字字庫(kù)等。存放在ROM設(shè)備中的程序通常稱(chēng)為固件(firmware)翠胰。比如我們計(jì)算機(jī)的BIOS容贝,就是存放在ROM中的。 隨著半導(dǎo)體技術(shù)的發(fā)展之景,出現(xiàn)了可編程只讀存儲(chǔ)器(Programmable ROM, PROM)斤富、可擦除可編程只讀存儲(chǔ)器(Erasable Programmable ROM, EPROM)及用電可擦除可編程只讀存儲(chǔ)器(Electrically Erassable Programmable ROM, EEPROM)。近年來(lái)還出現(xiàn)了閃速存儲(chǔ)器(Flash Memory)锻狗,它基于EEPROM满力。
高速緩存和主存都是RAM(Random-Access Memory焕参,隨機(jī)訪問(wèn)存儲(chǔ)器),它分為靜態(tài)的(SRAM)和動(dòng)態(tài)的(DRAM)油额,分別對(duì)應(yīng)高速緩存和主存叠纷。
SRAM
SRAM只要儲(chǔ)存器保持通電,里面儲(chǔ)存的數(shù)據(jù)就可以保持不變潦嘶。我們也把它叫做雙穩(wěn)定態(tài),即使有干擾掂僵,當(dāng)干擾消除的時(shí)候,電路就會(huì)恢復(fù)穩(wěn)定值宛瞄。它的每個(gè)單元都是由六個(gè)晶體管電路來(lái)實(shí)現(xiàn)。如下圖互拾。
DRAM
DRAM芯片中的單元被分成d個(gè)超單元歪今,每個(gè)超單元都由w個(gè)DRAM單元組成。一個(gè)d*w的DRAM總共就是存儲(chǔ)dw位的信息了颜矿。(在這里我覺(jué)得《深入理解計(jì)算機(jī)原理》的作者翻譯有問(wèn)題寄猩,本書(shū)很多地方的翻譯都讓人讀的不夠順暢,這里的有三個(gè)‘單元’骑疆,其實(shí)可以完全還另外一種說(shuō)法田篇,簡(jiǎn)單的說(shuō)就是一個(gè)塊被分成d個(gè)組替废,每個(gè)組都是w個(gè)DRAM單元。)超單元被組織成r行c列的長(zhǎng)方形陣列斯辰,這里d=rc舶担。每個(gè)超單元都有形如(i,j)的地址,這里i表示行彬呻,j表示列。如下圖柄瑰。如上圖闸氮,每個(gè)RDAM芯片被連接到某個(gè)稱(chēng)為存儲(chǔ)寄存器的電路,它的2個(gè)addr引腳教沾,攜帶2位的行和列超單元引腳蒲跨。當(dāng)要訪問(wèn)一個(gè)超單元時(shí),行地址i稱(chēng)為RAS(Row Access Strobe授翻,行訪問(wèn)選通脈沖)請(qǐng)求或悲。列地址j稱(chēng)為CAS(Column Access Strobe,列訪問(wèn)選通脈沖)請(qǐng)求堪唐。兩者共享相同的DRAM地址引腳巡语。具體讀取過(guò)程如下圖。
DRAM每個(gè)單元是由一個(gè)電容和一個(gè)訪問(wèn)晶體管組成的淮菠,每一位存儲(chǔ)就是對(duì)一個(gè)電容充電男公。利用電容內(nèi)部存儲(chǔ)電荷的多少來(lái)代表這一位是0還是1。但是由于電容有漏電的現(xiàn)象合陵,當(dāng)有干擾存在時(shí)枢赔,可能會(huì)導(dǎo)致電壓被擾亂,從而使數(shù)據(jù)丟失拥知。所以它需要周期性的充電踏拜。由于多種原因?qū)е碌穆╇姡珼RAM單元會(huì)在10~100毫秒時(shí)間內(nèi)失去電荷低剔。例如由于電容暴露在陽(yáng)光下會(huì)導(dǎo)致電壓的改變速梗,利用這一特性,數(shù)碼相機(jī)和攝像機(jī)的傳感器本質(zhì)就是DRAM的單元陣列户侥。下表是SRAM和DRAM的對(duì)比镀琉。
ROM與閃存(flash memory)
ROM(Read OnlyMemory,只讀存儲(chǔ)器)有的類(lèi)型是可以讀也可以寫(xiě)蕊唐,但是由于歷史原因屋摔,統(tǒng)稱(chēng)為只讀存儲(chǔ)器。它存放的數(shù)據(jù)非常穩(wěn)定替梨,斷電后所存的數(shù)據(jù)也不會(huì)改變钓试,它的結(jié)構(gòu)相對(duì)較簡(jiǎn)單装黑,讀出方便,因而常用于存儲(chǔ)各種固定程序與數(shù)據(jù)弓熏。存放在ROM設(shè)備中的程序通常稱(chēng)為固件(firmware)恋谭。比如我們計(jì)算機(jī)的BIOS,就是存放在ROM中的挽鞠。
PROM(ProgrammableROM疚颊,可編程ROM) 只能被編程一次。PROM的每個(gè)存儲(chǔ)器單元有一種熔絲信认,它只能用高電流熔斷一次材义。
EPROM(ErasableProgrammable ROM,可擦寫(xiě)可編程ROM)有一個(gè)透明的石英窗口嫁赏,允許光到達(dá)存儲(chǔ)單元其掂。紫外線光通過(guò)窗口照射進(jìn)來(lái),EPROM單元就被清楚為0潦蝇。EEPROM(Electrically Erasable ROM款熬,電子可擦寫(xiě)ROM)類(lèi)似于EPROM,但是它不需要一個(gè)物理上獨(dú)立的編程設(shè)備攘乒,因此可以直接在印制電路卡上編程贤牛。
3.磁盤(pán)
磁盤(pán)包括硬盤(pán)和軟盤(pán),這里我們以硬盤(pán)為例持灰,硬盤(pán)是我們最長(zhǎng)接觸到的存儲(chǔ)器之一盔夜,拆開(kāi)后它就長(zhǎng)下面這個(gè)樣子
如果把它的結(jié)構(gòu)圖花下來(lái),它就是下面這個(gè)樣子的堤魁。它是由盤(pán)片喂链、磁頭、盤(pán)片主軸妥泉、控制電機(jī)椭微、磁頭控制器、數(shù)據(jù)轉(zhuǎn)換器盲链、接口蝇率、緩存等部分組成的。
下面介紹最重要的幾個(gè)概念刽沾,扇區(qū)本慕、磁道、柱面侧漓、盤(pán)面锅尘。
1、盤(pán)面
硬盤(pán)的盤(pán)片一般用鋁合金材料做基片布蔗,高速硬盤(pán)也可能用玻璃做基片藤违。硬盤(pán)的每一個(gè)盤(pán)片都有兩個(gè)盤(pán)面(Side)浪腐,即上、下盤(pán)面顿乒,一般每個(gè)盤(pán)面都會(huì)利用议街,都可以存儲(chǔ)數(shù)據(jù),成為有效盤(pán)片璧榄,也有極個(gè)別的硬盤(pán)盤(pán)面數(shù)為單數(shù)特漩。每一個(gè)這樣的有效盤(pán)面都有一個(gè)盤(pán)面號(hào),按順序從上至下從“0”開(kāi)始依次編號(hào)骨杂。在硬盤(pán)系統(tǒng)中拾稳,盤(pán)面號(hào)又叫磁頭號(hào),因?yàn)槊恳粋€(gè)有效盤(pán)面都有一個(gè)對(duì)應(yīng)的讀寫(xiě)磁頭腊脱。硬盤(pán)的盤(pán)片組在2~14片不等,通常有2~3個(gè)盤(pán)片龙亲,故盤(pán)面號(hào)(磁頭號(hào))為0~3或 0~5陕凹。
2、磁道
磁盤(pán)在格式化時(shí)被劃分成許多同心圓鳄炉,這些同心圓軌跡叫做磁道(Track)杜耙。磁道從外向內(nèi)從0開(kāi)始順序編號(hào)。硬盤(pán)的每一個(gè)盤(pán)面有300~1 024個(gè)磁道拂盯,新式大容量硬盤(pán)每面的磁道數(shù)更多佑女。信息以脈沖串的形式記錄在這些軌跡中,這些同心圓不是連續(xù)記錄數(shù)據(jù)谈竿,而是被劃分成一段段的圓弧团驱,這些圓弧的角速度一樣。由于徑向長(zhǎng)度不一樣空凸,所以嚎花,線速度也不一樣,外圈的線速度較內(nèi)圈的線速度大呀洲,即同樣的轉(zhuǎn)速下紊选,外圈在同樣時(shí)間段里,劃過(guò)的圓弧長(zhǎng)度要比內(nèi)圈劃過(guò)的圓弧長(zhǎng)度大道逗。每段圓弧叫做一個(gè)扇區(qū)兵罢,扇區(qū)從“1”開(kāi)始編號(hào),每個(gè)扇區(qū)中的數(shù)據(jù)作為一個(gè)單元同時(shí)讀出或?qū)懭胱仪稀R粋€(gè)標(biāo)準(zhǔn)的3.5寸硬盤(pán)盤(pán)面通常有幾百到幾千條磁道卖词。磁道是“看”不見(jiàn)的,只是盤(pán)面上以特殊形式磁化了的一些磁化區(qū)贰您,在磁盤(pán)格式化時(shí)就已規(guī)劃完畢坏平。
3拢操、柱面
所有盤(pán)面上的同一磁道構(gòu)成一個(gè)圓柱,通常稱(chēng)做柱面(Cylinder)舶替,每個(gè)圓柱上的磁頭由上而下從“0”開(kāi)始編號(hào)令境。數(shù)據(jù)的讀/寫(xiě)按柱面進(jìn)行,即磁頭讀/寫(xiě)數(shù)據(jù)時(shí)首先在同一柱面內(nèi)從“0”磁頭開(kāi)始進(jìn)行操作顾瞪,依次向下在同一柱面的不同盤(pán)面即磁頭上進(jìn)行操作舔庶,只在同一柱面所有的磁頭全部讀/寫(xiě)完畢后磁頭才轉(zhuǎn)移到下一柱面(同心圓的再往里的柱面),因?yàn)檫x取磁頭只需通過(guò)電子切換即可陈醒,而選取柱面則必須通過(guò)機(jī)械切換惕橙。電子切換相當(dāng)快,比在機(jī)械上磁頭向鄰近磁道移動(dòng)快得多钉跷,所以弥鹦,數(shù)據(jù)的讀/寫(xiě)按柱面進(jìn)行,而不按盤(pán)面進(jìn)行爷辙。也就是說(shuō)彬坏,一個(gè)磁道寫(xiě)滿(mǎn)數(shù)據(jù)后,就在同一柱面的下一個(gè)盤(pán)面來(lái)寫(xiě)膝晾,一個(gè)柱面寫(xiě)滿(mǎn)后栓始,才移到下一個(gè)扇區(qū)開(kāi)始寫(xiě)數(shù)據(jù)。讀數(shù)據(jù)也按照這種方式進(jìn)行血当,這樣就提高了硬盤(pán)的讀/寫(xiě)效率幻赚。 一塊硬盤(pán)驅(qū)動(dòng)器的圓柱數(shù)(或每個(gè)盤(pán)面的磁道數(shù))既取決于每條磁道的寬窄(同樣,也與磁頭的大小有關(guān))臊旭,也取決于定位機(jī)構(gòu)所決定的磁道間步距的大小落恼。
4、扇區(qū)
操作系統(tǒng)以扇區(qū)(Sector)形式將信息存儲(chǔ)在硬盤(pán)上巍扛,每個(gè)扇區(qū)包括512個(gè)字節(jié)的數(shù)據(jù)和一些其他信息领跛。一個(gè)扇區(qū)有兩個(gè)主要部分:存儲(chǔ)數(shù)據(jù)地點(diǎn)的標(biāo)識(shí)符和存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)段。
在最初的時(shí)候撤奸,將每個(gè)磁道都是分為數(shù)目相同的扇區(qū)的吠昭,扇區(qū)的數(shù)目都是由最靠近里面的磁道的扇區(qū)數(shù)來(lái)決定的。為了保證每個(gè)磁道具有固定的扇區(qū)數(shù)胧瓜,那么越往外矢棚,它的數(shù)據(jù)密度就會(huì)越低,造成磁盤(pán)空間的浪費(fèi)「現(xiàn)代大容量磁盤(pán)使用了一種稱(chēng)為多區(qū)記錄的技術(shù)蒲肋,說(shuō)白了就是利用柱面,把相鄰的幾個(gè)柱面分成一個(gè)區(qū),(盤(pán)面上的磁道都是一個(gè)個(gè)同心圓兜粘,我們將這些同心圓分組申窘,相鄰的幾個(gè)同心圓為一組,擴(kuò)展到柱面孔轴,也是這樣分剃法。)一個(gè)區(qū)中的每個(gè)柱面中的每條磁道都有相同數(shù)量的扇區(qū),這個(gè)扇區(qū)的數(shù)量是由該區(qū)中最里面的磁道所包含的扇區(qū)數(shù)所確定的路鹰。
磁盤(pán)操作
磁盤(pán)用讀/寫(xiě)頭來(lái)讀寫(xiě)存儲(chǔ)在磁性表面的位贷洲,而讀寫(xiě)頭連接到一個(gè)傳動(dòng)臂一端。通過(guò)沿著半徑軸前后移動(dòng)這個(gè)傳動(dòng)臂晋柱,驅(qū)動(dòng)器可以將讀/寫(xiě)頭定位到盤(pán)面上的任何磁道上优构。這樣的機(jī)械運(yùn)動(dòng)稱(chēng)為尋道。
在傳動(dòng)臂末端的讀/寫(xiě)頭在磁盤(pán)表面高度大約0.1微米處的一層薄薄的氣墊上飛翔雁竞,速度大約是80km/h钦椭。
磁盤(pán)以扇區(qū)大小的塊來(lái)讀寫(xiě)數(shù)據(jù)。對(duì)扇區(qū)的訪問(wèn)時(shí)間有三個(gè)主要的部分:尋道時(shí)間碑诉、旋轉(zhuǎn)時(shí)間和轉(zhuǎn)送時(shí)間玉凯。在訪問(wèn)一個(gè)磁盤(pán)扇區(qū)時(shí),時(shí)間主要花在尋道時(shí)間和旋轉(zhuǎn)時(shí)間联贩,而且尋道時(shí)間和旋轉(zhuǎn)時(shí)間基本相等。
5.閃存(flash)和固態(tài)硬盤(pán)(SSD)
閃存(flash memory)是一類(lèi)非易失性存儲(chǔ)器捎拯,基于EEPROM泪幌,可以對(duì)塊的存儲(chǔ)器單元進(jìn)行擦寫(xiě)和再編程。任何閃存器件的寫(xiě)入操作只能在空或已擦除的單元內(nèi)進(jìn)行署照,所以在大多數(shù)情況下祸泪,在進(jìn)行寫(xiě)操作實(shí)現(xiàn)必須先執(zhí)行擦除。閃存的存儲(chǔ)單元為三端器件建芙,與場(chǎng)效應(yīng)管有相同的名稱(chēng):源極没隘、漏極和柵極。如下圖禁荸。
參考資料
《深入理解計(jì)算機(jī)系統(tǒng)》
https://blog.csdn.net/hguisu/article/details/7408047
計(jì)算機(jī)系統(tǒng)之存儲(chǔ)器體系結(jié)構(gòu)
https://blog.csdn.net/weixin_41708548/article/details/103983694
https://blog.csdn.net/weixin_43590232/article/details/104854895
https://blog.csdn.net/iva_brother/article/details/80463578