□ 何謂Belady Anomaly?
布雷第異常是由於頁替換演算法中採用FIFO(先進先出)的置換方式,導致實體記憶體雖然配給此行程的Frame數增加了,但是分頁錯誤的次數並沒有減少,反而增加的現象。
□ Demand Paging
需求分頁,其主要的精神是只有當行程需要某一頁的資料時才載入,好處是不用把整個行程載入到記憶體,可以節省記憶體空間,讓其他的行程可以使用。
□ Dynamic linking
動態連結,即先在一個程式所參考、利用到的程式庫副程式(libraries sub-routing)中先做一個記號(Stub),此記號為一小段程式,指示如何去尋找該副程式,當執行到記號之處,此記號會被取代成副程式的記憶體位址,再去檢查副程式是否在記憶體,若不在才做載入的動作。
□ 何謂純程式碼(Pure Code)??
純程式碼又稱做可重進入程式碼(Reentrant Code),這種程式碼在執行期間不能被其他的程序所修改,有利於需求分頁的記憶體管理方式,因為一旦純程式碼被載入到記憶體之後就固定住了,多個行程可以共用同樣的程式碼,而不需要每個行程都複製相同的程式碼。
□ 為何要使用TLB(Translation Look-aside Buffer)的硬體機制?
一般來說,當行程要存取資料的時候,會先到記憶體查詢分頁表,之後再從分頁表當中取得資料的實體記憶體位址,如此需要兩次的記憶體存取,速度較慢。
使用TLB可以加快存取的速度,因為它是由關連式高速記憶體組成。當行程要參照某個分頁時,會先到TLB查詢分頁記錄,若Hit à只需一次記憶體存取
若Miss à兩次記憶體存取,平均來說,會比一般兩次記憶體存取來的快。
□ 比較內部斷裂跟外部斷裂
內部斷裂:採用分頁法會有此現象,由於分頁的大小固定,若要配置給行程足夠的分頁數量,通常會有某一頁部份的空間沒有被完全的利用,分頁形成的內部斷裂所浪費的空間較小。
外部斷裂:由於行程的搬進搬出而造成記憶體的空間不連續,雖然斷裂的空間加起來的大小足夠容納別的行程,但是無法利用,這些空間就被浪費掉了。
當採取分段的時候,因為把行程以邏輯劃分成不同的功能區段,這些區段大小都不固定,所以分段形成的斷裂問題比較嚴重。
□ 在記憶體管理中何謂翻轉現象
翻轉現象即過度的頁替換現象,由於行程所擁有的Frame不夠,所以經常產生分頁錯誤,頻繁的進行I/O的動作,CPU排班程式以為CPU利用度不高,而載入更多的行程,更加重了分頁錯誤的情形。解決方式可以採用分頁錯誤頻率的方式,這個方法制訂了錯誤率的上下限,如果錯誤率達到上限,則多分配一個Frame給該行程,若錯誤率過低,則移走一個Frame。
【也可以採用工作集(Working Set)的方式解決,不過比較難寫】
□何謂分頁錯誤(Page fault)??舉出三種寫程式若不注意較容易發生分頁錯誤的情形
分頁錯誤是因為行程佔用的空間較大,無法整個載入到記憶體當中,因此被切割成許多分頁,OS通常只做部分的載入,因此,當一個行程需要用到的分頁不在實體記憶體當中,就造成了分頁錯誤,並引發OS的中斷去做額外的處理。
程式當中容易造成分頁錯誤的情況有
1. 使用GOTO指令
2. 過度使用指標
3. 如果電腦是row-major,但是迴圈以Column方式先進行寫入的話
如果這樣寫:
int array[100][100];
For (int j=0 ; j<100;j++){
For (int i=0;i<100;i++){
array[i][j] = i+j;
}
}
沒有留言:
張貼留言