观看麻豆影视文化有限公司-国产 高清 在线-国产 日韩 欧美 亚洲-国产 日韩 欧美 综合-日日夜夜免费精品视频-日日夜夜噜

ram是什么(ram是什么意思)

  • 生活
  • 2023-04-26 14:50

作者:www.yaoxiaowen.com

博客地址:www.cnblogs.com/yaoxiaowen/

我們先來討論:計算機的運行究竟是在做什么?來看一下經典的馮諾依曼結構。計算機科學雖然飛速發展了幾十年,但是依舊遵循馮諾依曼結構。

馮諾依曼結構

圖1:馮諾依曼結構

數學家馮諾依曼提出的體系結構包含以下幾個要點:

把程序本身當作數據來對待,程序和該程序處理的數據用同樣的方式儲存。計算機的數制采用二進制。計算機應該按照程序順序執行。

我們根據這張圖進行思考就可以得到一個結論,所謂計算機處理任務,就是根據輸入內容,數據/程序從存儲器送往CPU進行處理,然后再將結果輸出。

關于程序與數據,數據就是一首MP3歌曲,程序就是用來控制解析播放這首歌的代碼,從底層來講就是供CPU運行的指令.總之在計算機當中它們都是0和1,不過為行文方便,我們直接簡稱為數據或程序或指令,將它們理解為同一個意思,畢竟它們都屬于0和1組成的流,這個可以根據上下文來理解。

本文討論的主要內容,就是存儲器部分,為什么計算機需要存儲器部分?這是顯而易見的,我寫好了程序,或者下載了一部電影,肯定得有個地方放啊。這樣今后需要的時候,才能運行程序或者看電影啊。

我們思考一下,這個存儲器應該具備什么樣的特點。

1.穩定,掉電不丟失數據:這個道理上面已經提過,辛辛苦苦下載個小電影,一關電腦數據都丟失了。這肯定不行的。2.存儲容量大:就像誰也不嫌棄自己錢多,嫌棄自家房子太大。我們既然存儲東西,那么容量肯定越大越好。3.讀寫速度快:拷貝個電視劇,速度那么慢,真心累啊。4.價格便宜:新發布的iphonex我為啥不買,因為它有一個缺點我無法接受,那就是太貴了。一臺電腦賣一百萬,我們誰又能買得起呢?5.體積小:這個也是理所當然的。

關于這個存儲器,我們大概想出了一個理想的存儲器應該具備的的5個特點。

但是有句話說的好。理想很豐滿,顯示很骨感。一個***絲在紙上列出了幾十條他理想女友的標準,但是他能如愿嗎?

先說結論,完全滿足我們理想條件的存儲器目前還沒發明出來呢。目前的半導體工業只能造出部分符合條件的存儲器,但是完全滿足以上幾條標準的,對不起,未來也許能做到,但是起碼目前做不到。

所以這也是目前計算機系統存儲器系統比較復雜的原因,區分為內存,硬盤,光盤等不同的存儲器,如果有個完美的符合我們理想條件的存儲器,直接使用這種存儲器就好了。

先看看看我們最常見的存儲設備:磁盤。足夠穩定;有電沒電都正常存儲;容量也較大;價格也可以接受,所以磁盤是我們最常見的存儲設備。

磁盤就是我們存儲器的代表了。

為了行文方便,文中直接將存儲器用磁盤來代替了,一來大家對磁盤比較熟悉,二來磁盤也是最常見的存儲設備。類似flash,SD卡,ROM等從廣義上來講,也可以稱為磁盤。因為它們的作用都是存儲數據,掉電后不丟失。(這在下面文章中也會討論到)

磁盤和硬盤什么關系呢?其實是同一個意思。硬盤是最常見的磁盤類型。在很早之前,計算機使用軟盤存儲數據,所以那種軟盤也被稱為磁盤,不過軟盤都早就被歷史淘汰了,(電腦硬盤分區從C盤開始,就是因為AB盤是之前軟盤的編號)。所以現在我們說磁盤,直接理解成硬盤就好了。

在我們軟件當中,有個概念叫做數據持久化,意思就是說將數據存儲起來,掉電之后不丟失,這其實就是存儲在磁盤上面。

所以現在我們理解的計算機運行就是這樣一個過程:將數據從磁盤送往CPU,供CPU進行計算,并將結果輸出。

因為我們這片文章就是討論內存,存儲等問題,所以關于輸入設備,輸出設備之類的,就不再涉及和討論。

然后我們再簡短來討論CPU的發展歷史。

世界上第一臺計算機是1946年在美國誕生的ENIAC,當時CPU還是使用笨重的電子管,后面的故事依次是貝爾實驗室發明了晶體管,TI的工程師又發明了集成晶體管,IBM研發成功首款使用集成電路的計算機,IBM360,后面就是仙童八叛徒與intel,AMD的故事了。這段很著名的IT故事,我們不再累述了。伴隨著世界上第一款商用處理器:Intel4004的出現,波瀾壯闊的摩爾定律開始了。

當時負責IBM360操作系統開發的那個項目經理,根據該項目經驗,寫了一本經典著作《人月神話》,也有其他參與者根據該項目經驗,立傳出書了,所以當時那批人都是大牛。

摩爾定律:當價格不變時,集成電路上可容納的元器件的數目,約每隔18-24個月便會增加一倍,性能也將提升一倍。

半導體行業開始騰飛了。CPU上集成的晶體管數量越來越多。inteli9的制程工藝已經到了14nm。所以CPU的執行速度也越來越快。

當然,摩爾定律也快到盡頭了,根據量子力學,2nm是理論極限值。線寬不能再細了,低于2nm,隧穿效應就會產生干擾。

閑扯了一段CPU的發展歷史,想說明的是,現在的CPU集成度越來越高,速度也越來越快。每秒鐘能執行的指令也越來越多。(如果不知道指令,匯編之類的啥意思,看一下我的的另一篇文章關于跨平臺的一些認識,否則下面的內容看著也有難度)。

CPU的作用就是去執行指令(當然,也包括輸出結果等,本文只討論和存儲器相關,所以不扯其他的),并且盡可能的以它的極限最高速度去執行指令,至于具體的執行過程,做過單片機或者學過微機原理的應該比較清楚。就是伴隨著時鐘周期滴滴答答的節奏,CPU踏著拍子來執行指令。

至于CPU的指令集,那就是Intel的架構師們的工作,總之,CPU認識這些指令,并且能執行運算。(別忘記了馮諾依曼體系結構那張圖)。對于這些指令,但是CPU采取了各種措施來加快執行過程(也可以理解為加快它的計算速度)。比如有以下幾種常見的措施:

流水線(pipeline)技術:有電子廠打工經歷的讀者肯定很熟悉這個流水線模式。CPU的流水線工作方式和工業生產上的流水線概念一樣。就是將一個指令的執行過程也分解為多個步驟,CPU中的每個電路只執行其中一個步驟,這樣前赴后繼加快執行速度。CPU中多個不同功能的電路單元組成一條指令處理流水線,然后將一條指令分成幾個步驟后再由這些電路單元分別執行。在執行過程中,指令源源不斷的送往CPU。讓每個電路單元都不閑著,這樣就大大的加快了執行速度。超線程(Hyper-Threading)技術:對于超線程,百度百科的解釋我都沒看懂,但是大概原理就是這樣的。CPU在進行線程切換的時候,要執行切換各種寄存器狀態等一些操作。把第一個線程的各種寄存器狀態寫回緩存中保存,然后把第二個線程的相關內容送到各種寄存器上。該過程必不可少,否則待會再將第一個線程切換回來時,不知道該線程的各個狀態,那還怎么接著繼續執行呢?也正因為如此,所以這個過程比較慢,大概需要幾萬個時鐘周期。所以后來做了這樣的設計,把每個寄存器等都多做一個,就是多做一組寄存器(也包括一些其他相關電路等),,CPU在執行A線程時,使用的第一組寄存器,切換到B線程,直接使用第二組寄存器,然后再切換A線程時,再使用第一組寄存器。,CPU就不用再傻傻的等著寄存器值的切換,線程切換只需要幾個時鐘周期就夠了。對于普通的執行多任務的計算機,CPU線程切換是個非常頻繁的操作,所以使用該技術就會節省大量的時鐘周期。也就是相當于加快了CPU的執行速度。這就是CPU宣傳參數中所謂的四核八線程的由來,其實就是超線程技術。(每個核多做一組寄存器等電路固然會占用寶貴的空間,但是它帶來的優點遠遠大于缺點)。超標量技術:CPU可以在每個時鐘周期內執行多個操作,可以實行指令的并行運算。亂序執行:我們認為程序都是順序執行的。但是在CPU層面上,指令的執行順序并不一定與它們在機器級程序(匯編)中的順序一樣。比如a=b+c;d++;這兩個語句不按照順序執行也不會影響最終結果。當然這只是在CPU執行指令的層面,在程序員們看來,依舊認為程序是順序執行的。

前面扯了那么多,就是為了說明CPU的執行速度很快。雖然每條指令的執行時間需要幾個時鐘周期到幾十個時鐘周期不等。但是CPU采用了種種技術來加快執行過程。所以平均執行一條指令只需要一個周期。而現在CPU主頻都那么高。比如i77700K主頻達到了4.2G。這也就意味著,每個core每秒鐘大約可以執行4.2億條指令。那四個core呢?

CPU每秒鐘可以執行幾億(甚至十幾億)條指令,所以它的執行速度真丫的的快啊

我們討論完CPU如此快的執行速度,我們再來說我們常見的存儲設備-機械硬盤。

圖2:機械硬盤結構

機械硬盤的結構就不再具體的討論了。它讓我想起了民國電影中那種播放音樂的唱片機。

帶機械硬盤的電腦,在使用過程中,如果機箱被摔了,可能后果很嚴重,就是因為可能會把機械硬盤的那個讀寫頭/傳動臂等機械結構摔壞。

機械硬盤容量很大(目前普遍1T,2T),我們的數據和程序是存儲在磁盤上的,所以CPU要想執行指令/數據,就要從存儲器,也就是磁盤上讀取,CPU一秒鐘可以執行幾億條指令,但是相對之下,磁盤的讀寫速度就是慢如蝸牛。假設磁盤一秒鐘可以讀取100條指令。那么這中間就存在巨大的速度差異。半導體行業發展了幾十年,CPU的執行速度一再飛速提升,奈何磁盤技術發展的太不給力了,CPU再快,可是磁盤嚴重拖后腿,那CPU就相當于工作嚴重不飽和,如果直接從磁盤上來讀取數據,那么CPU相當于99.9999%的時間都在閑置著。

"假設磁盤一秒鐘可以讀取100條指令。":帶有假設字樣的,具體數字都是隨便寫的。比如磁盤讀寫速度自然有它的參數指標,不過我們只是為了說明問題,所以能理解其中的道理就好。

磁盤廠商們也在努力研究,比如SSD(固態硬盤),它的速度就比機械硬盤快了一二十倍吧。但是對于CPU的速度,這也是然并卵啊。(更何況SSD相比機械硬盤太貴了)

所以這就是個大問題。

我們的目標就是執行任務時讓CPU全負荷的運行,爭取對于每一個時鐘周期,CPU都不會閑置浪費。

這就像是老板對我們這些員工的希望一樣。老板給我們發工資,那么他就是希望我們每一天的每一分每一秒都在努力幫公司干活。不要有什么任何時間閑著。所以我們要感謝勞動法,讓我們每天工作八小時就夠了。畢竟我們也是血肉之軀,也需要吃喝拉撒睡覺。

看到勞動法說每天工作八小時就夠了,程序猿們哭暈在廁所。

程序猿問科比:“你為什么這么成功?”

科比:“你知道洛杉磯凌晨四點是什么樣子嗎?”

程序猿:“不知道,一般那個時候我還沒下班呢,怎么了?”

科比:“額…….”

通過上面的介紹,我們就明白了計算機體系的主要矛盾,CPU太快了,而磁盤太慢了。所以它倆是不能夠直接通信的,我們可以加一層過度。這就是內存的作用。這就是幾百塊錢一根的內存條的作用和功能。

實際上,一般情況下,內存的讀寫速度比磁盤快幾十萬倍左右。所以它終于夠資格和CPU直接通信了。

這里有張圖,我們來看一下磁盤/內存,與CPU速度之間逐漸增大的差距(主要是CPU技術發展太迅猛了)。

圖三:磁盤DRAM和cpu速度之間逐漸增大的差距

所以現在程序執行過程是這樣的。CPU執行任務時,只與內存通信,它從內存獲取指令/數據或寫回數據。內存再與磁盤通信,內存從磁盤讀取數據/指令,或者內存將數據寫回磁盤。

提到添加過渡層。這其實和JVM的原理都是類似的。具體可參考我的另一篇文章關于跨平臺的一些認識。也許這就是大道至簡吧。

存儲器層次結構

我們這里說的內存,主要是指主存。就是主板上插的內存條。它的讀寫速度比磁盤快了幾十萬倍。但是相對于CPU的速度依舊還是慢。那么主存和CPU之間,可以繼續添加速度更快的過度層。所以inteli7的存儲器層次結構是這樣的。

圖4:一個存儲器層次結構的示例

前面扯了那么多篇幅,就是告訴你,我們為什么需要內存(主存),那么理解了主存,自然也就理解了L3,L2,L1等各級緩存存在的意義。對于現代的計算機系統,在CPU與磁盤/主存之間,加了多層過度層。

嚴格來講,應該叫CPU的算術邏輯單元(ALU),但是簡單的直接說CPU,大家肯定也能聽得懂。

實際上這是一種緩存思想。比如,本地磁盤也相當于遠方服務器的緩存。因為我們從網上下載數據/文件時,速度明顯比從本地磁盤讀取要慢。

一般情況下,L5磁盤與L4主存速度相差幾十萬倍,而L3-L0之間,它們每級緩存的速度差異大概是10倍。

我們是拿i7處理器來做例子,它有三級緩存,像低端一些的處理器,比如i3,只有兩級緩存,但是道理是相同的。本文當中,都是拿i7的存儲器層次來做例子。

明白一點。CPU執行速度實在太快了,一秒鐘執行幾億/十幾億條指令,CPU干活干脆利落,那么存儲器就要想方設法的用最快的速度把指令/數據送給CPU去運行。否則CPU干活再快,又有什么意義呢。

基本思想已經理解了。那么我們就開始具體討論細節問題。

RAM,ROM,總線等

看看上面那幅圖,什么SRAM,DRAM,還有我們前面講的SSD,Flash,機械硬盤等,還有下面要討論的總線(BUS),所以我們先來討論一些基礎硬件知識.

首先,他們都屬于存儲器,存儲器分為兩類:

易失性(volatile)存儲器:包括內存,SRAM,DRAM等,特點是讀寫速度很快,掉電了數據會丟失,價格貴,并且存儲容量較小。非易失性(nonvolatile)存儲器:包括磁盤,Flash,光盤,機械硬盤,SSD等,與易失性存儲器相比,它們讀寫速度很慢,但是掉電不丟失數據,存儲容量比較大,價格也便宜。RAM(Random-AccessMemory):隨機訪問存儲器。易失性存儲器。也可以訪問兩類:SRAM(靜態的)和DRAM(動態的),并且SRAM的讀寫速度比DRAM更快,價格也更貴。在上圖中也可以看到,SRAM做L1-L3級緩存,而DRAM做L4級的主存。ROM(read-onlymemory):只讀存儲器,非易失性存儲器。這個名字容易讓人產生誤解,它既可以讀,也可以寫,稱之為read-only只是歷史原因。

ROM相比于RAM,容量更大,價格便宜,讀寫速度則比較慢。

閃存(Flashmemory):非易失性存儲器。SSD,SD卡都屬于Flash技術,如果從概念上來講,他們都屬于ROM,這類存儲器經常用在手機,相機等設備上。而機械硬盤常用在個人計算機,服務器上。

其實我覺的把Flash,ROM等都叫做磁盤,也沒什么錯。畢竟它們的作用和概念都是相似的,區別只是他們各自使用的半導體技術不同。Flash芯片等基于集成芯片的存儲器讀寫速度比機械硬盤快,不過(相同容量下)價格也比后者貴。而它們相比于SRAM,DRAM則非常慢了,所以后者理解為內存即可。

"圖4:一個存儲器層次結構的示例",越往上,讀寫速度越快,價格更貴,存儲容量也越小。(淘寶上搜搜8G的內存條,256G的SSD,1T的機械硬盤都是什么價格就明白了)。像L0寄存器,每個寄存器只能存儲一個字長的內容,但是CPU讀寫取寄存器耗費的時鐘周期為0個。這是最快的速度。

另外,我們在電腦主板上可以看到內存條(L4主存)。硬盤(L5),但是卻沒看到L3-L0。原因很簡單,他們都是集成在CPU芯片內部的。

我們知道了存儲器的層級結構,下面還有一個問題,就是怎么把硬盤,內存條之類的連接起來進行通信呢,這就是總線(Bus)了。

圖6:一個典型系統的硬件組成

上圖存在三條總線,IO總線,存儲器總線(通常稱為內存總線),系統總線。在主板上,就是那一排排的32/64根并行的導線。這些導線用來連接CPU,內存,硬盤,以其他外圍設備。CPU與存儲器,輸入輸出設備等通信,都是通過總線。不同總線的速度也有差異。

CPU要通過I/O橋(就是主板的北橋/南橋芯片組)與外圍設備連接,因為CPU的主頻太高了,它的時鐘周期一秒鐘震蕩幾億次,外圍設備的時鐘周期都較慢,所以他們不能直接通信。

本文是討論軟件的,所以硬件部分就一筆帶過,讀者知道有這回事就ok了??偩€上攜帶地址,數據和控制信號,如何區分不同信號,分辨它與哪個外圍設備通信,這就是另外一個問題了。

不管中間怎么加緩存,數據從硬盤到內存的速度就是那么慢,那么這些緩存意義何在?

有些讀者腦子轉的比較快,可能想到了這樣一個問題。

不管你中間怎么加緩存,也不管中間的什么SRAM,DRAM的讀寫速度有多快,但是磁盤的讀寫速度就是那么慢,所以磁盤與主存之間的交互速度很慢。CPU歸根到底需要向磁盤讀寫數據。整個環節速度瓶頸就是在磁盤那里,這個根本快不了,那么加那么多級緩存,意義有何在呢?

這是一個好問題啊。下面讓我們繼續討論。

我們來看看,CPU如何讀取磁盤中的一個數據。

圖7:讀一個磁盤扇區

網上找的圖片不是很清楚,注意每張圖中的黑線。步驟分三部:

CPU將相關的命令和地址,通過系統總線和IO總線傳遞給磁盤,發起一個磁盤讀。磁盤控制器將相關的地址解析,并通過IO總線與內存總線將數據傳給內存。第2步完成之后,磁盤控制器向CPU發送一個中斷信號。(學電子的同學應該很清楚中斷是什么)。這時CPU就知道了,數據已經發送到內存了。

第二步磁盤操作很慢,但是在第一步CPU發出信號后。但是第二步和第三部時,CPU根本不參與。第二步很耗時,所以CPU在第一步發出信號后,就去在干其他事情啊。(切換到另一個線程)。所以此時的CPU依舊沒有閑著。而待第三步時,通過中斷,硬盤主動發信號給CPU,你需要的數據已經發送到內存了,然后此時它可以將線程再切換回來,接著執行這個該線程的任務。

除了多線程切換,避免CPU閑置浪費,還有一點。

我先問一個問題。

//@author:www.yaoxiaowen.comintmain(){//我們執行任務的代碼return0;}

對于一個應用/進程而言,它都應該有一個入口。(雖然不一定需要我們直接寫main函數)。入口函數內部就是我們的任務代碼,任務代碼執行完了這個應用/進程也就結束了。這個很好理解,比如測試工程師寫的一個測試case。跑完了這個任務就結束了。

但是有些程序,比如一個app,你打開了這個app。不做任何操作。這個界面會一直存在,也不會消失。思考一下這是為什么。因為這個app進程肯定也要有一個main入口。main里面的任務代碼執行完了,就應該結束了。而一個程序的代碼/指令數目肯定是有限的。但該app在我們不主動退出情況下,卻不會主動結束。

所以這個app進程的入口main來講,其實是這樣的。

//@author:www.yaoxiaowen.comintmain(){booleanflag=true;while(flag){//我們執行任務的代碼}return0;}

并且不僅如此,在一個程序內部,也有大量的for,while等循環語句。

那么當我們把這些相關的代碼指令送到了主存,或者更高一級的緩存時,那么CPU在執行這些指令時,存取速度自然快了很多。

在執行一個程序時,啟動階段比較慢,因為需要從磁盤讀取數據。(而CPU在這個階段也沒閑置浪費,它會進行線程切換執行其他任務)。但是數據被送往內存之后,它執行起來就會快多了,并且伴隨著執行過程,還可能越來越快,因為這些數據,有可能被一級一級的向上送,從L4,送到L3,再送到L2,L1

so,上述那個問題的答案,已經解釋的比較清楚了吧。

局部性原理(Principleoflocality)

locality對于硬件和軟件系統的設計和性能都有著重要的影響。對于我們理解存儲器的層次結構也必不可缺。

程序傾向于引用臨近于與其他最近引用過的數據項的數據項?;蛘咦罱眠^的數據項本身。這種傾向性,我們稱之為局部性原理。它通常有以下兩種形式:

時間局部性(temporallocality):被引用過一次的存儲器位置的內容在未來會被多次引用??臻g局部性(spatiallocality):如果一個存儲器位置的內容被引用,那么它附近的位置也很大概率會被引用。

一般而言,有良好局部性的程序比局部性差的程序運行的更快?,F代計算機系統的各個層次,從硬件到操作系統、再到應用程序,它們的設計都利用了局部性。

當然,光說理論的東西比較玄乎。我們來看實際的例子。

//@authorwww.yaoxiaowen.comintsum1(intarray[N]){inti,sum=0;for(i=0;i<N;i++)sum+=array[i];returnsum;}

在這個程序中,變量sum,i在每次循環迭代時被引用一次,因此對sum和i來說,有較好的時間局部性。

對變量array來說,它是一個int類型數組,循環時按順序訪問array,因為一個C數組在內存中是占用連續的內存空間。因而的較好的空間局部性,

再來看一個例子:

//@authorwww.yaoxiaowen.comintsum2(intarray[M][N]){inti,j,sum=0;for(i=0;i<M;i++){for(j=0;j<N;j++)sum+=array[j][i];}returnsum;}

這是一個空間局部性很差的程序。

假設這個數組是array[3][4],因為C數組在內存中是按行順序來存放的。所以sum2對每個數組元素的訪問順序成了這樣:0,4,8,1,5,9……7,11。所以它的空間局部性很差。

但是幸運的是,一般情況下軟件編程天然就是符合局部性原理的。比如程序的循環結構。

假設CPU需要讀取一個值,intvar,而var在L4主存上,那么該值會被依次向上送,L4->L3->L2,但是這個傳遞的過程并不是單純的只傳遞var四個字節的內容,而是把var所在的內存塊(block),依次向上傳遞,為什么要傳遞block?因為根據局部性原理,我們認為,與var值相鄰的值,未來也會被引用。

存儲器的層次結構,數據進行傳送時,是以block(塊)為單位傳送的。在整個層次結構上,越往上,block越小而已。

存儲器層次結構中的緩存

洋洋灑灑的扯了那么多,我相對于所謂的存儲器層次結構讀者應該有一個基本的認識,有些地方介紹的不夠嚴謹,但是本文的目的也就是讓大家理解基本思想。

歸根到底,它就是一個緩存(caching)的思想,并且其實不復雜,

我們做app開發時,對于app中活動頁面等,都是后臺發給我們圖片url,我們下載后才顯示在app上,這時我們總要使用Glide,Picasso等圖片緩存框架來把下載好的圖片緩存在手機本地存儲上。這樣下次打開app時,如果這個圖片鏈接沒有改變,我們就直接拿手機本地緩存的圖片來進行顯示,而不用再從服務器上下載了。如果圖片鏈接改變了,則重新下載。為什么要這么做?因為從服務器上下載比較慢,而手機本地存儲(ROM)中讀取就會快很多。

這個時候可以再回頭看看"圖4:一個存儲器層次結構的示例"。

下面這張圖和這段文字來自《深入理解計算機系統》(CSAPP),大家可以有個更嚴謹和細節的認識。

圖8:存儲器層次結構中基本的緩存原理

存儲器層次結構的中心思想:位于k層的更快更小的存儲設備作為位于k+1層得更大更慢的存儲設備的緩存;數據總是以塊大小為傳送單元(transferunit)在第k層和第k+1層之間來回拷貝的;任何一對相鄰的層次之間傳送的塊大小是固定的,即每一級緩存的塊大小是固定的。但是其它的層次對之間可以有不同的塊大小。

當程序需要第k+1層的某個數據對象d時,它首先在當前存儲在第k層的一個塊中查找d。如果d剛好在k層,那么就是緩存命中。如果第k層中沒有緩存數據對象d,那么就是緩存命不中。當緩存不命中發生時,第k層的緩存從第k+1層緩存中取出包含d的那個塊,如果第k層的緩存已經滿了的話,可能會覆蓋現存的一個塊。(覆蓋策略可以使用常見的LRU算法)。

volatile關鍵字

在java和C當中,有一個volatile關鍵字(其他語言估計也有),它的作用就是在多線程時保證變量的內存可見性,但是具體怎么理解呢?

我們在"圖4:一個存儲器層次結構的示例"中,說的緩存結構其實對于一個單核CPU而言的,比如對于一個四核三級緩存的CPU,它的緩存結構是這樣的。

圖9:多核處理器緩存結構

我們可以看到L3是四個核共有的,但是L2,L1其實是每個核私有的,如果我有一個變量var,它會被兩個線程同時讀取,這兩個線程在兩個核上并行執行,因為我們的緩存原理,這個var可能分別在兩個核的L2或L1緩存,這樣讀取速度最快,但是該var值可能就分別被這兩個核分別修改成不同的值,最后將值回寫到L3或L4主存,此時就會發生bug了。

所以volatile關鍵字就是預防這種情況,對于被volatile修飾的的變量,每次CPU需要讀取時,都至少要從L3讀取,并且CPU計算結束后,也立刻回寫到L3中,這樣讀寫速度雖然減慢了一些,但是避免了該值在每個core的私有緩存中單獨操作而其他核不知道。

猜你喜歡

主站蜘蛛池模板: 成人入口 | 人人草97 | 免费中国一级啪啪片 | 大片国产片日本观看免费视频 | 一男一女搞黄 | 久久视频国产 | 国产欧美日韩综合二区三区 | 欧美一级毛片免费高清的 | 亚洲一区免费看 | 国产做a爰片久久毛片 | 国产亚洲一区二区三区不卡 | 国产伦理久久精品久久久久 | 精品久久中文字幕有码 | 国产欧美日韩在线不卡第一页 | 欧美一级毛片欧美一级 | 草草视频手机在线观看视频 | 亚洲综合亚洲 | 性一级片 | 精品国产无限资源免费观看 | 国产自愉自愉全免费高清 | 最新精品在线视频 | 欧美精品高清 | 一本色道久久综合亚洲精品高清 | 特级淫片日本高清视频 | 99精品国产成人一区二区 | 另类视频一区 | 亚洲人妖女同在线播放 | 丝袜美腿精品一区二区三 | 日本欧美精品 | 美女黄网站视频 | 国产精品夜色视频一区二区 | 成人中文在线 | 亚洲国产成人精品一区二区三区 | 呦视频在线一区二区三区 | 久久精品99| 正在播放的国产a一片 | 久久亚洲天堂 | 亚洲精品一区二区在线播放 | 久久免费精品一区二区 | 国产真实乱子伦精品 | 免费在线看黄网址 |