iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
自我挑戰組

當你凝視linux, linux也在凝視你系列 第 10

Day10 分頁與分段的記憶體管理

前言

前幾天講完了行程管理的部分,其中有個部分講到,所謂的ready 或者說 task_running 的狀態,代表著行程的資料已經被移到記憶體,準備好可以執行了,從今天開始就來了解所謂的記憶體到底是怎麼演變以及運行的,在這個部分會了解MMU、page、page table、實體記憶體等等的內容,希望可以對記憶體有更多的了解。

記憶體管理的遠古時期

在遠古時期的記憶體是十分有限而且笨重的,簡單來說就是只要空間足夠就會直接把行程放進去,這代表著記憶體裡面的每個區域都可能被某個行程使用,因此這個古老的方法有兩個顯而易見的大缺點

  1. 行程地址空間的保護問題:
    因為整個記憶體是對所有的行程開放,所以對於任何行程而言,可以任意更動到記憶體內部的任何區域的資料,這對有心的惡意人士而言是犯罪的溫床,可以輕鬆的藉著改動其他區域的資料達成自己不懷好意的目標,為了這個問題後續出現分段管理的方式,在稍後會介紹到。
  2. 記憶體的使用率不良:
    因為行程的排放方式不固定,也因此如果排放的方式不良,很容易就造成嚴重的空間浪費。
    因應上述的兩個問題,分段以及分頁的機制就此出現。

分段管理

分段管理是為了解決記憶體內位址空間的保護問題而產生的機制,主要結構如下

在記憶體裏會有一個分段表(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 ,


上一篇
Day9 初探CFS 下
下一篇
Day11 Buddy, slab 記憶體管理大將
系列文
當你凝視linux, linux也在凝視你30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言