r>[0084] 將操作系統(tǒng)管理的所有在主存中的頁面分為兩個(gè)循環(huán)鏈表,該循環(huán)鏈表為CLOCK 鏈表。一個(gè)鏈表中的元素為最近被訪問的頁,存儲(chǔ)在鏈表T1中,即這些頁面被訪問的次數(shù) 很少,但是在該時(shí)間點(diǎn)之前較短的時(shí)間內(nèi)被訪問過。一個(gè)鏈表中的元素為經(jīng)常被訪問的頁, 存儲(chǔ)在鏈表T2,即這些頁面雖然可能很久沒有被CPU訪問過,但是在之前經(jīng)常被CPU訪問。 為了利用歷史信息來預(yù)測(cè)未來頁面的訪問模式,建立兩個(gè)單項(xiàng)鏈表,該單鏈表為LRU鏈表, 分別為B1和B2。B1鏈表中的每個(gè)元素是從T1中移出內(nèi)存的頁面的元數(shù)據(jù),B2鏈表中的 每個(gè)元素是從T2中移出內(nèi)存的頁面的元數(shù)據(jù)。其中,元數(shù)據(jù)指的是描述頁面信息的數(shù)據(jù), 包括頁面標(biāo)識(shí)符,頁面指針以及頁面有關(guān)的標(biāo)志位;如果頁面在內(nèi)存中,則頁面指針指向頁 面在內(nèi)存中的具體地址。
[0085] 對(duì)T1中的每個(gè)頁,設(shè)置一個(gè)訪問位(referencebit)和寫位(dirtybit)。當(dāng)一 個(gè)新的頁面進(jìn)入內(nèi)存時(shí),首先用T1鏈接該頁面并且referencebit和dirtybit都清零。 當(dāng)頁面在T1中被訪問時(shí),referencebit為1 ;當(dāng)頁面在T1中被寫訪問時(shí),dirtybit設(shè)置 為1。由此看出,referencebit代表最近的訪問信息,而dirtybit代表最近的寫信息。 同樣,對(duì)T2中的每個(gè)頁,設(shè)置referencebit和dirtybit。其意義與在T1中的意義相同。 當(dāng)頁面從T1迀移到T2后,referencebit和dirtybit都清零。除此之外,在T2中還設(shè)置 建議位(suggestbit)。當(dāng)T2 中的一個(gè)DRAM頁的referencebit和dirtybit都為 1 時(shí), 表明該頁可能為寫頻繁頁。如果再次在該頁面中發(fā)生寫操作,則將該頁面的suggestbit 設(shè)置為1。當(dāng)suggestbit為1時(shí),表明當(dāng)該頁面下次被加載到內(nèi)存時(shí),應(yīng)該放到DARM中。 當(dāng)頁面從T2中被替換到B2中時(shí),保留suggestbit位不變。Tl,T2,Bl,B2及其標(biāo)志位的 可視化描述如附圖2所示。
[0086] 本發(fā)明提出的方法中,關(guān)于頁面在T1和T2之間的迀移過程為:如果T1中的一個(gè) 頁面的referencebit為1,在其變?yōu)?之前,再次在該頁面中發(fā)生一個(gè)內(nèi)存讀或者寫操作, 表明該頁為經(jīng)常被訪問頁面,則將其迀移到T2的尾端。
[0087] 圖3顯示了自適應(yīng)的頁面替換策略總的流程圖。它以一個(gè)內(nèi)存訪問請(qǐng)求作為 開端。如果這個(gè)請(qǐng)求的頁面在混合主存中,說明頁命中。命中的情況下,如果該頁面的 referencebit已經(jīng)為1,說明其最近經(jīng)常被訪問,應(yīng)該將其迀移到T2中。否則,該頁面的 referencebit為0,在該情況下,如果頁面請(qǐng)求為讀操作,則僅僅將其referencebit設(shè)置 為1,否則頁面請(qǐng)求為寫操作,應(yīng)該將其referencebit和dirtybit同時(shí)設(shè)置為1。到此 為止,頁面命中T1的頁面訪問過程結(jié)束。
[0088] 在頁面命中T2的情況下,此時(shí),如果該頁面的訪問類型為讀操作,則簡(jiǎn)單的將其 referencebit設(shè)置為1。然而,如果操作為寫操作,貝1」檢查頁面中目前的dirtybit和referencebit是否都為1,如果不是,將其都設(shè)置為1。如果是,說明該頁為寫頻繁頁,則檢 查頁面是否在DRAM中,如果是,則將它的suggestbit設(shè)置為1。如果在PCM中,則調(diào)用頁 面迀移過程,將它迀移到DRAM中進(jìn)行存儲(chǔ)。到此為止,頁面命中T2的頁面訪問過程結(jié)束。
[0089] 在頁面不在內(nèi)存的情況下,需要檢查是否命中歷史鏈表,即B1或者B2。如果命中 B1,說明之前不應(yīng)該將此頁面從T1中刪除,S卩,分配給T1的目標(biāo)大小太小了,應(yīng)該對(duì)其進(jìn)行 加1。同理,如果命中B2,說明之前不應(yīng)該將此頁面從T2中刪除,S卩,分配給T2中的目標(biāo)大 小太小了,應(yīng)該對(duì)T2的目標(biāo)大小進(jìn)行加1 (對(duì)T1的目標(biāo)大小減1)。如果頁面都不命中,則 目標(biāo)大小都不需要做任何改變。最后調(diào)用頁面插入算法將新頁面插入到混合主存中。到此 為止,針對(duì)頁面不命中的頁面訪問過程到此結(jié)束。其中,新頁面是指CPU正在訪問的頁面, 并且不在混合主存中的頁數(shù)據(jù)。該頁面數(shù)據(jù)可能位于外存中或者由CPU直接產(chǎn)生。
[0090] 圖4顯示了自適應(yīng)的頁面插入過程流程圖。內(nèi)存訪問請(qǐng)求的頁不在內(nèi)存時(shí),需要 將該新頁面x插入到內(nèi)存中。此時(shí),可以有三種不同情況下的頁面插入過程。
[0091] (1)第一種情況的頁面插入過程,是頁面X在B1中,表明該頁面是一個(gè)不會(huì)經(jīng)常被 訪問的頁面。此時(shí),混合主存中獲取一個(gè)空閑的頁面(如果沒有空閑頁面,則調(diào)用頁面替換 算法獲得一個(gè)空閑頁面),利用該空閑頁面作為新頁面x的存儲(chǔ)空間,并鏈接到T1鏈表的尾 端。
[0092] (2)第二種情況下的頁面插入過程,如果頁面x即不在B1中,也不在B2中。則根 據(jù)局部性原理,如果對(duì)x的訪問是寫操作,則未來該頁面可能經(jīng)常被寫。因此,需要從內(nèi)存 中獲取一個(gè)空閑的DRAM頁面來存儲(chǔ)x(如果內(nèi)存中沒有空閑DRAM頁面,則調(diào)用頁面替換過 程獲取一個(gè)空閑的DRAM頁面),利用該頁面作為新頁面x的存儲(chǔ)空間,并鏈接到T1鏈表的 尾端。相反,如果對(duì)x的內(nèi)存訪問為讀操作,則從混合主存中獲取一個(gè)DRAM頁面或者PCM 頁面(如果混合主存已滿,則調(diào)用頁面替換算法獲取一個(gè)空閑的DRAM頁或者PCM頁面),作 為x的存儲(chǔ)空間,并鏈接到T1鏈表的尾端。
[0093] (3)第三種情況下,頁面x在B2中。此時(shí),需要檢查頁面x在B2中的suggestbit。 如果該位為1,則需要從混合主存中獲取一個(gè)空閑的DRAM頁面(如果沒有空閑的DRAM頁, 則調(diào)用頁面替換算法獲得一個(gè)空閑的DRAM頁面),利用該頁面作為新頁面x的存儲(chǔ)空間, 并鏈接到T2鏈表的尾端。相反,如果對(duì)x的內(nèi)存訪問為讀操作,則從混合主存中獲取一個(gè) DRAM頁面或者PCM頁面(如果混合主存已滿,則調(diào)用頁面替換算法獲取一個(gè)空閑的DRAM頁 或者PCM頁面),作為x的存儲(chǔ)空間,并鏈接到T2鏈表的尾端。
[0094]對(duì)于以上三種情況下插入到內(nèi)存中的頁面,都將其頁面的所有標(biāo)志位設(shè)置為0。
[0095]圖5顯示了頁面迀移過程的流程圖。通過一系列的實(shí)驗(yàn)驗(yàn)證,對(duì)于寫操作,寫頻率 高的頁面未來一段時(shí)間內(nèi)更趨向于被寫。因此,本發(fā)明提出的自適應(yīng)頁面管理方法的頁面 迀移過程僅僅發(fā)生在T2。這樣有效的提高了頁面迀移的效率,并有效的減少了錯(cuò)誤迀移的 產(chǎn)生。所謂錯(cuò)誤的迀移,是指,原來在PCM中的頁面,發(fā)生了很多次的寫操作后,將其迀移到 DRAM中,但是,在DRAM中卻很少再次被寫。同理,原來在DRAM中的頁面,很少被寫,將其迀 移到PCM中,但是,在PCM中卻發(fā)生了多次的寫操作。這些都是錯(cuò)誤的迀移。理論上,錯(cuò)誤 的迀移是無法避免的。當(dāng)T2中需要有一個(gè)PCM頁面p需要迀移到DRAM頁面中時(shí),利用Hdram 指針查找一個(gè)dirtybit為0的DRAM頁面q將其作為與p之間進(jìn)行相互頁面迀移的頁面。 在利用HdM進(jìn)行頁面查找的過程中。如果所遇到的DRAM或者PCM頁面dirtybit為1,則 將其設(shè)置為〇。在頁面的迀移過程中,要注意的是,兩個(gè)頁面P和q在T2鏈表中的相對(duì)位置 保持不變,僅僅是其存儲(chǔ)介質(zhì)發(fā)生轉(zhuǎn)變。
[0096] 圖6顯示了頁面替換過程的流程圖。因此。本發(fā)明提出的頁面管理方法中的頁面 替換算法需要在不需要設(shè)置任何用戶定義參數(shù)的情況下,靈活的基于"recency"(訪問時(shí) 間)和"frequency"(訪問頻率)選擇頁面進(jìn)行替換。T1和T2鏈表分別代表最近訪問的 頁面和最常訪問的頁面。當(dāng)需要進(jìn)行頁面替換時(shí),通過對(duì)比T1鏈表的實(shí)際大小是否大于為 其設(shè)置的目標(biāo)大小,即TargetSize。如果大于TargetSize,則需要從T1中替換一個(gè)頁面。 在頁面替換過程中,如果指定需要替換DRAM頁面,貝1」利用T1中的仏^指針選擇reference bit和dirtybit同時(shí)為0