Programming05

題目大意

  1. 在Cache類中實(shí)現(xiàn)fetch方法將數(shù)據(jù)從內(nèi)存讀到Cache(如果還沒有加載到Cache)并返回被更新的Cache行的行號(需要調(diào)用不同的映射策略和替換策略)
  2. 實(shí)現(xiàn)三種映射策略(直接映射、全關(guān)聯(lián)映射齐板、組關(guān)聯(lián)映射)和三種替換策略(先進(jìn)先出桑李、最少使用击儡、最近使用)

簡單來說就是模擬一個Cache. README.md只提供了這么一些內(nèi)容,具體看了看代碼的TODO勇劣,兩個抽象類分別是MappingStrategy.javaReplacementStrategy.java怎棱,我們需要完成繼承了他們的幾個策略并在Cache.java中完成調(diào)用。


映射策略

映射策略需要完成3種映射桦踊,部分方法需要調(diào)用父類中的替換策略。

直接映射

  1. getTag()方法是根據(jù)內(nèi)存的塊號终畅,取出高12位tag并將后10位置為0籍胯,轉(zhuǎn)換成字符數(shù)組返回.
  2. map()方法則是訪問Cache類的靜態(tài)成員,讀出對應(yīng)行的tag與getTag()的結(jié)果進(jìn)行比對声离,數(shù)據(jù)有效且tag相等則返回塊號的低10位(這里可以不用對總行數(shù)取模)芒炼,否則返回-1.
  3. 對于writeCache()方法瘫怜,由于是直接映射术徊,沒有后續(xù)調(diào)用策略,因此這里從memory讀入數(shù)據(jù)后寫進(jìn)Cache鲸湃,再返回塊號的低10位轉(zhuǎn)成的整數(shù)即可赠涮。

關(guān)聯(lián)映射

  1. 關(guān)聯(lián)映射的tag就是塊號,getTag()直接返回即可暗挑。
  2. 關(guān)聯(lián)映射的查找范圍是整個cache笋除,因此map()需要從0到N-1行調(diào)用替換策略的isHit()方法。
  3. 同樣的炸裆,writeCache()方法要先從memory的靜態(tài)成員中讀取data垃它,read()方法的參數(shù)應(yīng)該為以塊號作為高位,低位補(bǔ)充10個0的eip烹看,讀取長度為cache一行的大小国拇,即一個塊的大小Cache.LINE_SIZE_B,然后再調(diào)用策略里的writeCache()方法惯殊,把讀取到的data寫入0到N-1行范圍內(nèi)酱吝。

組關(guān)聯(lián)映射

這里的組關(guān)聯(lián)映射是4路組關(guān)聯(lián),一共是1024/4=258=28個組土思,即組號占8位务热,標(biāo)記占22-8=14位

  1. getTag()方法取出高14位tag并將后8位置為0忆嗜,轉(zhuǎn)換成字符數(shù)組返回。
  2. 由于是組關(guān)聯(lián)映射崎岂,map()需要根據(jù)中間的8位組號確認(rèn)查找的起始點(diǎn)捆毫,8位組號為高位,補(bǔ)充低位2個0作為起始行冲甘,補(bǔ)充低位兩個1作為結(jié)束行冻璃,調(diào)用策略中的isHit()方法。
  3. 類似地损合,組關(guān)聯(lián)中的writeCache()方法需要在memory的靜態(tài)成員中讀取對應(yīng)的data省艳,處理方式和關(guān)聯(lián)映射是一樣的(因?yàn)閷τ谕粋€塊號,讀取的塊開頭地址與結(jié)尾地址都一樣)嫁审,然后調(diào)用策略的writeCache()方法跋炕,把data寫入第二點(diǎn)提到的起始行與結(jié)束行之間的范圍。

替換策略

需要完成三種策略律适。

FIFO策略

維護(hù)一個內(nèi)容為Integer的隊(duì)列辐烂,從0到N-1個元素是從新到舊的訪問順序。

  1. isHit()方法直接根據(jù)起始點(diǎn)訪問Cache里的靜態(tài)成員進(jìn)行比對即可捂贿。
  2. writeCache()方法需要遍歷隊(duì)列纠修,如果隊(duì)列中的元素在區(qū)間內(nèi)且有效,更新命中指針并把計(jì)數(shù)器addup加1厂僧,注意這里需要維護(hù)一個invalid指針扣草,如果隊(duì)列中的元素在區(qū)間內(nèi)但無效則更新invalid,遍歷完成后判斷:
    • 如果指針未被更新或計(jì)數(shù)器小于區(qū)間長度颜屠,說明這個區(qū)間沒有被填滿辰妙,需要尋找在區(qū)間內(nèi)序號最小的有效位為false的行,如果invalid被更新了甫窟,說明有失效的空行密浑,那么最小的空行號應(yīng)該是min(start+addup,invalid),沒被更新則說明只是單純地區(qū)間沒有被填滿粗井,這時候需要把數(shù)據(jù)寫入找到的行并把這個行號寫入隊(duì)列開頭尔破。
    • 否則說明區(qū)間已經(jīng)被填滿了,由于順序是從新到舊浇衬,順序遍歷最后更新的指針即最老訪問的行懒构。因此在指針的行處寫入數(shù)據(jù)并在隊(duì)列中刪除原行,重新寫入開頭径玖。

LRU策略

維護(hù)一個時間戳痴脾。

  1. isHit()需要在返回前更新時間戳,直接設(shè)成++timeStamp.
  2. 類似FIFO梳星,writeCache()需要判斷區(qū)間是否被填滿赞赖,同樣用指針記錄最小時間戳滚朵,用計(jì)數(shù)器記錄數(shù)量,如果沒滿則找到序號最小的有效位為false的行前域,如果滿了則更新指針行辕近,更新的時候需要多更新一個時間戳。

LFU策略

  1. isHit()需要在返回前更新訪問次數(shù)匿垄,設(shè)成原次數(shù)+1.
  2. writeCache()同樣需要判斷區(qū)間是否填滿移宅, 也需要額外更新訪問次數(shù),設(shè)成1(這一次是第一次訪問)椿疗。

Fetch方法

由于傳入?yún)?shù)確保了數(shù)據(jù)一定在同一個數(shù)據(jù)塊內(nèi)漏峰,所以我們只需要從地址取出高22位的塊號,調(diào)用映射策略的map()方法届榄,如果為-1說明未命中浅乔,需要寫入,此時返回調(diào)用的writeCache()方法即可铝条,否則說明命中靖苇,直接返回map().

修改了一些小bug之后,通過測試班缰。

代碼見github.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贤壁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子埠忘,更是在濱河造成了極大的恐慌脾拆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件给梅,死亡現(xiàn)場離奇詭異假丧,居然都是意外死亡双揪,警方通過查閱死者的電腦和手機(jī)动羽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔期,“玉大人运吓,你說我怎么就攤上這事》杼耍” “怎么了拘哨?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長信峻。 經(jīng)常有香客問我倦青,道長,這世上最難降的妖魔是什么盹舞? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任产镐,我火速辦了婚禮隘庄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘癣亚。我一直安慰自己丑掺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布述雾。 她就那樣靜靜地躺著街州,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玻孟。 梳的紋絲不亂的頭發(fā)上唆缴,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音黍翎,去河邊找鬼琐谤。 笑死,一個胖子當(dāng)著我的面吹牛玩敏,可吹牛的內(nèi)容都是我干的斗忌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼旺聚,長吁一口氣:“原來是場噩夢啊……” “哼织阳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砰粹,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唧躲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碱璃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄痹,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年嵌器,在試婚紗的時候發(fā)現(xiàn)自己被綠了肛真。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡爽航,死狀恐怖蚓让,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讥珍,我是刑警寧澤历极,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站衷佃,受9級特大地震影響趟卸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一锄列、第九天 我趴在偏房一處隱蔽的房頂上張望新蟆。 院中可真熱鬧,春花似錦右蕊、人聲如沸琼稻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕翻。三九已至,卻和暖如春萝风,著一層夾襖步出監(jiān)牢的瞬間嘀掸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工规惰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睬塌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓歇万,卻偏偏與公主長得像揩晴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贪磺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時硫兰,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,334評論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評論 1 32
  • 一寒锚、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,818評論 0 27
  • 一劫映、基礎(chǔ)知識:1、JVM刹前、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,388評論 0 4
  • 一直想要養(yǎng)成每天寫作的好習(xí)慣泳赋,可是總是各種原因做不到,有時是時間問題喇喉,有時是拿起筆又不知道寫什么祖今,這個活動挺好,正...
    喬喬_0211閱讀 115評論 0 0