CPU的高速緩存存儲器知識整理

基于緩存的存儲器層次結構

基于緩存的存儲器層次結構行之有效,是因為較慢的存儲設備比較快的存儲設備更便宜,還因為程序往往展示局部性:

時間局部性:被引用過一次的存儲器的位置很可能在不遠的將來被再次引用。

空間局部性:如果一個存儲器位置被引用了一次,那么程序很可能在不遠的將來引用附近的一個存儲器位置。

通用高速緩存存儲器結構

一個通用的高速緩存存儲器會有S = 2 ^ s個set(組)

每個set含有E個line(既通常所說的cache line)

每個line又包含1位vaild bit、 t位tag、B = 2 ^ b bytes cache block(真正存儲數據的地方)。

通常我們說的cache line 64位 32位,實際上是說的cache line中cache block是64位32位。

假設我們的存儲器地址有m位,共M = 2^m個不同的地址。我們看一下各個變量之間的關系。

cache緩存數據的大小C = (sizeof set * number of set) = (size of block * lines a set) * number of set = B * E * S

內存大小2^m Cache line大小2^b 內存的cache line個數2^(m-b)

2^(m-b)個cache line分到2^s個set里, 每個set會有2^(m - b –s)個cache line,這個數字不是E,是指會有2^(m – b –s)個cache line落到這個set 里面,那么就需要有m-b-s位tag,標記出當前是哪個cache line落到這個set里面了。也就是說t = m - b –s。

如上圖所示,m位地址的內存,需要s位做索引,選set,t位做tag,選cache line,然后b 位做偏移取具體地址的內存。

高速緩存的映射

高速緩存確定一個請求是否命中,然后抽取出被請求的字的過程,分為三步1)組選擇2)行匹配3)字抽取。

直接映射

直接映射每個組只有一行E=1

選組

地址中取s bits選組

選行

地址中取t bits與cache line中t bits tag匹配,匹配則命中,不匹配則cache miss

字抽取

地址中的b bits就是cache line中偏移,在命中的cache line中的取字。

?

直接映射不命中時,不需要什么策略,直接把索引的組中的cache line替換掉即可。

?

組相連映射

組相連映射中,一個組包括多個cache line,目前常見的有四路組相連映射,16路組相連映射,即一個set中有4個或16個cache line。對比直接映射,set 個數要比直接映射的少。因此s會小,相應的落到每個set中的cache line會多,因此t會大。

選組

組相連映射的組選擇與直接映射一致。

選行

cache line的選擇時,因為一個set中有多個cache line,因此需要搜索set中的每個cache line的tag,對比檢查是否命中。

字抽取

與直接映射一致

?

組相連映射對于一個index就會有多個行與之相對應,比較每行的tag是否與想要的地址相符合,這樣就會大大增加命中的幾率,避免了一小段程序中頻繁cache失效的問題。

組相連映射不命中時,由于索引到的組中會有多個cache line,因此會有多種算法選擇到底替換哪個cache line。

?

全相連映射

全相連映射就是組相連映射只有一個組的情況。

選組

全相連映射組選擇很簡單,只有一個組,不需要組索引,s = 0,地址只被劃分為一個標記tag,和一個偏移。

選行

全相連映射cache line選擇時,需要多緩存中的所有cache line進行搜索對比。

字抽取

與之前一致

?

全相連映射需要大量的搜索cache line進行對比,導致構造一個又大又快的全相連高速緩存很困難,而且很昂貴。因此全相連緩存只適合做小的高速緩存,比如TLB。

Core i7的高速緩存特性

?

以上內容來自《深入理解計算機系統》6.4

以下內容來自互聯網

?

幾種cache方式

Virtual index virtual tagged

邏輯cache,Virtual index virtual tagged是純粹用虛擬地址來尋址,邏輯地址索引邏輯地址tag,這種方式帶來了很多的問題,每一行數據在原有tag的基礎上都要將進程標識加上以區分多個進程之間的相同地址,而在 處理共享內存時也比較麻煩,共享內存在不同的進程中的虛擬地址不相同,如何同步是個問題。

Physical index physical tagged

物理cache,Physical index physical tagged,物理地址索引和物理地址tag,是一種最容易理解的操作方式,cache針對物理地址進行操作,簡單粗暴,而且不會有歧義。但是這種方式的缺陷也很明顯,在多進程操作系統 中,每個進程擁有自己獨立的地址空間,指令和代碼都是以虛擬地址的方式存在,cpu發出的memory access的指令都是以虛擬地址的方式發出,這樣的話,對于每一個memory access的操作,都要先等待MMU將虛擬地址翻譯為物理地址,這是一種串行的方式,效率較低。

virtual index physical tagged

現在比較多的是采用virtual index physical tagged的方式,virtual index的含義是當cpu發出一個地址請求之后,低位地址去和cache中的index匹配, physical tagged是指虛擬地址的高位地址去和mmu中的頁表匹配以拿到物理地址(index和取物理地址這兩個過程是并行的),然后用從mmu中取到的物理地 址作為tag(或者tag的一部分)去和cache line的tag位匹配,這樣既保證了同一地址在cache中的唯一性(有個例外,cache alias)又能將mmu和cache并行工作,提高了效率。

這種方式帶來的唯一問題就是cache alias,即一個物理地址緩存到兩個cache line中。當進程間通過共享內存方式通信,或者一個進程通過mmap的方式內核與應用層共享內存,就會出現同同一塊物理內存,以多個虛擬地址訪問的情況。就容易導致一塊物理內存緩存到兩個cache line中。

由于共享內存是頁對其的,因此多個進程空間的共享內存,或者內核態用戶態的共享內存,其物理地址不同,但其頁偏移是相同的。

假如頁大小為P = 2^p 字節,cache line為 C = 2^c 字節,那么共享內存的不同虛擬地址其低p位是一致的,假如地址0 -> c位用于block offset,c -> p 位用于set index,那么就可以避免cache alias的問題。

但如果set index 位數 > p -c ,那肯定會出現cache alias的問題,因為同一塊物理內存,不同的虛擬地址,其set index不同。

針對于cache alias問題,目前的方案是由操作系統來保證,對于同一物理地址在不同進程空間的虛擬地址,要保證他們index相同,落在同一個set,就需要保證他們虛擬地址的差值是cache大小的整數倍。同時已經有些cpu廠商在開發監視模塊,試圖在硬件層面解決類似的同步問題。

轉載于:https://www.cnblogs.com/jintianfree/p/3896012.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260156.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp光標自動定義到文本框_word技巧自動生成畢業論文目錄

一篇word文檔,內容有大的章,小的節。如何把章節抽出來生成目錄?WORD →點擊需要插入的地方 → 插入菜單 → 索引和目錄 → 目錄 → 確定。1 創建標題目錄Word 一般是利用標題或者大綱級別來創建目錄的。因此,在創建目錄之前&#…

JSTL

2019獨角獸企業重金招聘Python工程師標準>>> 說明 JSTL 是 JAVA 中的一個定制標記庫集。實現了JSP頁面中代碼的復用,增加了JSP頁面的可讀性,方便查看和參與開發 使用 1.下載地址 http://archive.apache.org/dist/jakarta/taglibs/standard/bi…

[jQuery] event.stopPropagation()報錯

使用jQuery給一個事件加處理方法時,為了阻止一個事件向上冒泡,使用了event.stopPropagation(),但在IE下卻報對象不支持此屬性或方法的錯誤(IE下是event. cancelBubbletrue),jQuery不是兼容各瀏覽器嗎&#…

中科燕園arcgis外包----排水管網地理信息系統

項目背景 紹興縣是浙江省第一個“數字城管”試點城市,也是全國第一個“數字城管”縣級城市。隨著經濟的飛速發展、城市化步伐的加快,以及城市規模的擴大和現代化程度的不斷提高,作為城市重要基礎設施的城市地下管線也越來越龐大、密集&#x…

自然語言0_nltk中文使用和學習資料匯總

sklearn實戰-乳腺癌細胞數據挖掘(博主親自錄制視頻教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare http://blog.csdn.net/huyoo/article/…

python實現深度優先搜索_python中的深度優先搜索算法

假設我有一個函數,它接受一個輸入($x iui$),然后經過一個循環并生成一系列輸出($x{I,j}$)。然后,每個輸出可以再次作為同一函數的輸入,從而產生更多的輸出($x{i,j,k}$)。我試圖通過這個函數找到…

mysql函數移植到oracle,oracle到mysql的遷移,函數部分

to_date(?, YYYY-MM-DD HH24:MI:SS)"STR_TO_DATE(2003-15-10 00:00:00,%Y-%m-%d %H:%i:%s); //格式不對,會返回NULLto_char(create_time,yyyy-MM-dd)DATE_FORMAT(create_time,%Y-%m-%d)sysdatenow()或者CURRENT_TIMESTAMP //1997-12-15 23:50:26,建表的時…

學習關于時間在sql里面的對比,用if語句(這個有點特別)

需求:假如當前時間是大于starttime且小于endtime的則按starttime倒序排列顯示一條記錄;假如當前時間小于starttime且小于endtime則按starttime正序排列顯示一條記錄。要在一次sql查詢中完成。 這個是論壇里面的,人家給出答案了,我…

ruby中的回調方法和鉤子方法

在ruby中,當某些特定的事件發生時,將調用回調方法和鉤子方法。事件有如下幾種: 調用一個不存在的對象方法類混含一個模塊定義類的子類給類添加一個實例方法給對象添加一個單例方法引用一個不存在的常量對以上的事件,都可以為之編寫…

超簡單的JNI——NDK開發教程

不好意思各位,我按照網上一些教程進行JNI開發,折騰了半天也沒成功,最后自己瞎搞搞定了,其實超簡單的,網上的教程應該過時了,最新版的AS就包含了NDK編譯的功能,完全不用手動javah,各種…

查詢工資最低的3名員工的職工工號、姓名和收入_關于工資條,這6個常識必須掌握,事關你的權益!...

大狀說:找大狀,中小企業自己的法律顧問。今天為大家帶來的文章,是《關于工資條,這6個常識必須掌握,事關你的權益!》,是關于勞動法的內容,希望能給大家帶來幫助。1、單位不發工資條的…

oracle查對象創建時間,oracle:查詢某個時間之后,指定用戶,指定對象類型,并創建的表的個數...

SQL> select COUNT(*) from dba_objects where created< to_date(17-01-14,dd-mm-yy) AND owner用戶名 and object_typeTABLE;查詢某個時間之后創建的表有哪些&#xff1a;SQL> select object_name,created from dba_objects where created> to_date(17-01-14,dd-…

年末跳槽

末日過了&#xff0c;大家都在準備著年會&#xff0c;年總結&#xff0c;年終獎。 而我卻在煩著跳槽的事。 由于一個偶遇的機會&#xff0c;最近面試了公司B&#xff0c;面試過程還可以&#xff0c;跟公司B的技術管理人談得還挺開心的。他也同意我的技術。 開始的時候&#xff…

SQL之用戶自定義函數

關于SQL Server用戶自定義的函數&#xff0c;有標量函數、表值函數&#xff08;內聯表值函數、多語句表值函數&#xff09;兩種。 題外話&#xff0c;可能有部分朋友不知道SQL Serve用戶自定義的函數應該是寫在哪里&#xff0c;這里簡單提示一下&#xff0c;在Microsoft SQL Se…

hdoj3351-stack

Problem DescriptionI’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. But, alas, not for this one.You’re given a non empty string made in its entirety f…

vb語言程序設計_如果編程語言難度決定頭發濃度,學這語言的可能要光頭了

對于程序員來說&#xff0c;頭發真的比什么都重要&#xff0c;甚至很多程序員&#xff0c;大量的人民幣都花在了后續植發上。甚至網上還流行這么一句話&#xff0c;你發際線越高&#xff0c;編程能力越高&#xff0c;那對于程序員來說&#xff0c;那么多語言&#xff0c;到底哪…

oracle同義詞很慢,通過問題長知識----ORACLE同義詞

現象&#xff1a;create table JBPM_JOB時出錯&#xff0c;提示name is used by existing object而drop table 的時候&#xff0c;卻報table or view does not exist.這是一個很矛盾的現象。排查&#xff1a;select * from user_objects where OBJECT_NAME ‘JBPM_JOB’—注意字…

C#獲取程序集的版本號和最后編譯時間

C#獲取程序集的版本號&#xff1a;string ver System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); C#中如何將記錄項目的最后編譯時間&#xff1a;在實際的軟件開發工作中&#xff0c;我們通常需要記錄某個工程的最后編譯時間&#xff0c;原來…

無刷新上傳Excel后利用JQuery AJAX 顯示進度條的實現方式

1、前臺上傳頁面代碼 <div class"clearfix mywebsite-nodata"><div id"show"><form action"<?site_url(user/upload)?>" target"ifmupload" id"myform" method"post" accept-charset"…

怎么理解python語言_Python語言入門1-理解Python語言

本文主要向大家介紹了Python語言入門的理解Python語言&#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習Python語言入門有所幫助。python是解釋型的腳本語言解釋型語言與C/C等編譯型語言相比&#xff0c;python語言的程序并不是首先編譯成二進制機器碼后運行&am…