cpu,高速緩衝區,主記憶體之間的關係
我們都知道計算機運算任務需要cpu和記憶體相互配合共同完成,其中cpu負責邏輯計算,記憶體負責資料儲存。cpu要與記憶體進行互動,如讀取運算資料、儲存運算結果等。由於記憶體和cpu的計算速度有幾個數量級的差距,為了提高cpu的利用率,現代處理器結構都加入了一層讀寫速度盡可能接近cpu運算速度的快取記憶體來作為記憶體與cpu之間的緩衝:將運算需要使用的資料複製到快取中,讓cpu運算可以快速進行,計算結束後再將計算結果從快取同步到主記憶體中,這樣處理器就無須等待緩慢的記憶體讀寫了。就像下面這樣
cpu,高速緩衝區,主記憶體這種處理提高效率導致出現的問題
快取記憶體的引入解決了cpu和記憶體之間速度的矛盾,但是在多cpu系統中也帶來了新的問題:可見性問題和重排序問題。
首先是可見性問題:假設有兩個執行緒a、b分別在兩個不同的cpu上執行,它們共享同乙個變數x。如果執行緒a對x進行修改後,並沒有將x更新後的結果同步到主記憶體,則變數x的修改對b執行緒是不可見的。這樣就會造成可見性問題
然後是重排序問題:假設a、b兩個執行緒共享兩個變數x、y,a和b分別在不同的cpu上執行。在a中先更改變數x的值放到快取記憶體區,然後再更改變數y的值放到快取記憶體區。這時有可能發生y的值被同步回主記憶體,而x的值沒有同步回主記憶體的情況,此時對於b執行緒來說是無法感知到x變數被修改的,或者可以認為對於b執行緒來說,y變數的修改被重排序到了x變數修改的前面。
cpu層面通過mesi協議來保證重排序問題和資料可見性。
mesi協議是cpu中提供的資料一致性保證,解決了cpu的可見性問題,mesi協議中定義了快取的四種狀態:
m(修改, modified): 本地處理器已經修改快取行, 即是髒行, 它的內容與記憶體中的內容不一樣. 並且此cache只有本地乙個拷貝(專有)。
e(專有, exclusive): 快取行內容和記憶體中的一樣, 而且其它處理器都沒有這行資料。
s(共享, shared): 快取行內容和記憶體中的一樣, 有可能其它處理器也存在此快取行的拷貝。
i(無效, invalid): 快取行失效, 不能使用。
mesi協議示例
在c1修改了v之後,傳送乙個訊號,標記舊值已經失效,並且將新值會寫到記憶體。
c1可能會多次進行修改,每次丟改都傳送乙個訊號,c2中的v一直保持著失效的狀態。
c2在使用v的時候,發現自己的v已經失效了,就重新從記憶體中載入v獲取最新的值。
主函式引數 緩衝區的理解
1 主函式傳參 int main int argc,char ar char envp argc 傳遞的引數列表中引數的個數 ar 傳遞的引數列表 envp 傳遞的環境變數 可以看到,傳遞的引數以空格區分開,那麼傳整個字串可以寫進 字串 或者使用 轉義字元。主函式預設接收乙個引數,就是執行的命令。2...
map的環形記憶體緩衝區
hadoop在執行mapreduce任務時,在map階段,map函式產生的輸出,並不是直接寫入磁碟的。為了提高效率,它將輸出結果先寫入到記憶體中 即環形記憶體緩衝區,預設大小100m 再從緩衝區 溢 寫入磁碟。下面我們就來看看這段 size medium b 1 找到環形記憶體緩衝區 b size ...
SQL Server 資料頁緩衝區的記憶體瓶頸分析
sql server會把經常使用到的資料快取在記憶體裡 就是資料頁快取 用以提高資料訪問速度。因為磁碟訪問速度遠遠低於記憶體,所以減少磁碟訪問量同樣是資料庫優化的重要方面。當資料頁快取區出現記憶體不足,則zoeonkkokr會出現查詢慢,磁碟忙等等問題。分析方法 主要是用到效能計數器。檢視如下效能計...