前幾天講完了行程管理的部分,其中有個部分講到,所謂的ready 或者說 task_running 的狀態,代表著行程的資料已經被移到記憶體,準備好可以執行了,從今天開始就來了解所謂的記憶體到底是怎麼演變以及運行的,在這個部分會了解MMU、page、page table、實體記憶體等等的內容,希望可以對記憶體有更多的了解。
在遠古時期的記憶體是十分有限而且笨重的,簡單來說就是只要空間足夠就會直接把行程放進去,這代表著記憶體裡面的每個區域都可能被某個行程使用,因此這個古老的方法有兩個顯而易見的大缺點
分段管理是為了解決記憶體內位址空間的保護問題而產生的機制,主要結構如下
在記憶體裏會有一個分段表(segment table)進行查表,每個cpu所產生的位址可以分成高位段的segment base與低位段的segment limit,在上圖分別以 s 跟 d 表示,會利用 s 查表,再將該欄的資料取出,分別為限制大小(limit)與基底(base),首先確認cpu 產生的d ,是否小於分段表中取出的 segment limit,如果為否,那就引發定址錯誤;如果是的話,就將分段表中取出的base 加上d,正確的存取實體記憶體。
分段機制雖然解決了記憶體保護的問題,但是在分段管理中,仍以行程的角度對記憶體進行使用,當實體記憶體不足的時候,取出的會是整個行程,因此如果有多個行程要使用,記憶體會與硬碟不停進行行程資料的交換,會造成嚴重的效能損耗。
在分段機制之後,因為分段每次需要配置的記憶體都是一段一段的,仍然會有記憶體使用率低落的問題,因此產生了分頁機制,分頁機制將分配的單位變成是固定大小的頁面,也可以將不常用的記憶體交換回磁碟中。
講實體的記憶體該如何分配,目前在有越來越多行程同時運行的狀況下,記憶體再多都沒辦法好好地放下所有程式的資料,因此因應這些問題產生的機制就是虛擬記憶體,虛擬記憶體的產生,讓工程師再也不用擔心程式過大會造成記憶體不足沒辦法運轉,也讓同時可以進行的程式變得更多了。
行程可以在分頁表(page table),上利用分頁表上的標籤,知道該頁目前的使用狀況,最常見的有r,w,e,決定某個分頁是否是可讀可寫或是執行或是修改,分頁的技術在目前仍然是主流,linux系統的分頁大小為 4KB ,