作業系統 知識點整理

2021-10-09 12:23:06 字數 1839 閱讀 1060

首先 cpu 在訪問記憶體的時候都需要通過 mmu 把虛擬位址轉化為實體地址,然後通過匯流排訪問記憶體。mmu 開啟後 cpu 看到的所有位址都是虛擬位址,cpu 把這個虛擬位址發給 mmu 後,mmu 會通過頁表在頁表裡查出這個虛擬位址對應的實體地址是什麼,從而去訪問外面的 ddr(記憶體條)

參考:夥伴堆演算法

每當分配和釋放記憶體的時候系統都將遇到尾部碎片的問題,比如當請求乙個頁面的時候,即使系統可用頁面總數足夠多,但是無法分配大塊連續的頁面。也就是說可用頁面會被乙個或多個不連續的不可用頁面拆開。使用夥伴演算法就可以一定程度解決這種頁面碎片的問題。

linux把所有的空閒頁框分組為11個塊鍊錶,每個鍊錶上的頁框塊是固定的。在第i條煉表中每個頁框塊都包含2的i次方個連續頁,其中i稱為分配階。

下面以乙個例子,講述夥伴演算法的思想:假設要申請乙個256個頁,先從256個頁框的鍊錶中查詢空閒塊,如果沒有,就去512個頁框的鍊錶中找,找到了則將頁框塊分為2個256個頁框的塊,乙個分配給應用,另外乙個移到256個頁框的鍊錶中。如果512個頁框的鍊錶中仍沒有空閒塊,繼續向1024個頁框的鍊錶查詢。如果1024塊存在,則將其中的256頁框作為請求返回,剩餘的768分成256塊和512塊分別插到相應的鍊錶中。如果仍然沒有,則返回錯誤。

linux中夥伴堆演算法的核心資料結構包含以下兩個部分

//在mmzone.h中

#define max_order 11

struct zone

;

記憶體分配與釋放得原理

分配原理:假如系統需要4(2 * 2)個頁面大小的記憶體塊,該演算法就到free_area[2]中查詢,如果鍊錶中有空閒塊,就直接從中摘下並分配出去。如果沒有,演算法將順著陣列向上查詢free_area[3],如果free_area[3]中有空閒塊,則將其從鍊錶中摘下,分成等大小的兩部分,前四個頁面作為乙個塊插入free_area[2],後4個頁面分配出去,free_area[3]中也沒有,就再向上查詢,如果free_area[4]中有,就將這16(2 * 2 * 2 * 2)個頁面等分成兩份,前一半掛如free_area[3]的鍊錶頭部,後一半的8個頁等分成兩等分,前一半掛free_area[2]的鍊錶中,後一半分配出去。假如free_area[4]也沒有,則重複上面的過程,知道到達free_area陣列的最後,如果還沒有則放棄分配。

釋放原理:記憶體的釋放是分配的逆過程,也可以看作是夥伴的合併過程。當釋放乙個塊時,先在其對應的鍊錶中考查是否有夥伴存在,如果沒有夥伴塊,就直接把要釋放的塊掛入煉表頭;如果有,則從鍊錶中摘下夥伴,合併成乙個大塊,然後繼續考察合併後的塊在更大一級鍊錶中是否有夥伴存在,直到不能合併或者已經合併到了最大的塊(2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2個頁面)。整個過程中,位圖扮演了重要的角色,點陣圖的某一位對應兩個互為夥伴的塊,為1表示其中一塊已經分配出去了,為0表示兩塊都空閒。夥伴中無論是分配還是釋放都只是相對的點陣圖進行異或操作。分配記憶體時對位圖的是為釋放過程服務,釋放過程根據位圖判斷夥伴是否存在,如果對相應位的異或操作得1,則沒有夥伴可以合併,如果異或操作得0,就進行合併,並且繼續按這種方式合併夥伴,直到不能合併為止。

優點1.解決記憶體碎片問題

2.避免把記憶體拆得太碎得同時,使記憶體的分配和釋放過程迅速

缺點1.雖然解決了記憶體碎片問題,但是該演算法中,乙個很小的塊往往會阻礙乙個大塊的合併。(一片記憶體中僅乙個小的記憶體塊沒有釋放,旁邊兩個大的就不能合併。)

2.演算法中有一定的浪費現象,夥伴演算法是按2的冪次方大小進行分配記憶體塊。

3.另外拆分和合併涉及到 較多的鍊錶和位圖操作,開銷還是比較大的。

作業系統的知識點整理

作業系統是管理計算機硬體資源,控制其他程式執行並為使用者提供互動操作介面的 系統軟體 的集合。作業系統是計算機系統的關鍵組成部分,負責管理與配置記憶體 決定 系統資源 供需的優先次序 控制輸入與 輸出裝置 操作網路與管理 檔案系統 等基本任務。作業系統的種類相當多,各種裝置安裝的作業系統可從簡單到複...

面試 作業系統知識點整理

各自的原理以及存在什麼樣的問題 沒有銀彈 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。linux的實現之一是 優點 簡單 缺點 步驟 父程序建立管道,得到兩個檔案描述符,指向管道的兩邊 父程序fork出子程序,子...

作業系統 9 程序控制知識點整理

fork 通過複製呼叫程序建立乙個新的子程序 複製pcb 共享資料獨有 程式計數器 執行的位置都一樣 父程序返回子程序的pid,子程序返回0 寫時複製技術 vfork 建立子程序,共用同乙個虛擬位址空間 共用乙個呼叫棧,會發生呼叫棧混亂 為了防止呼叫棧混亂,因此父程序呼叫vfork會阻塞,阻塞到子程...