3.2.2 交換技術
3.2.3 空閒記憶體管理
3.3 虛擬記憶體
帕金森定律:不管儲存器多大,程式都可填滿它
這章討論os怎樣對儲存器建立抽象模型
os的工作是將這個儲存體系抽象為乙個有用的模型並管理這個抽象模型。
至於永久性儲存器————磁碟————的抽象和管理,是下章主題
從最簡單的管理方案討論,逐步深入到更為縝密的方案
那時呈現給程式設計人員的儲存器模型就是簡單的物理記憶體:從0到某個上限的位址集合,
一和三缺點:使用者程式出錯可能摧毀作業系統
按這種方式組織系統時,同一時刻只能有乙個程序執行。
使用者鍵入了乙個命令,os把需要的程式從磁碟複製到記憶體並執行;
收到新的命令後,它把新的程式裝入記憶體,覆蓋前一程式。
乙個記憶體為1mb的機器只需要512個這樣的4位暫存器,總共256位元組
psw( program status word,程式狀態字)中存有乙個4位碼。
乙個執行中的程序如果訪問保護鍵與其psw碼不同的記憶體,360的硬體會捕獲到這一事件。
只有os可以修改保護鍵,
且它要求給所有的可執行程式提供額外的資訊來區分哪些記憶體字中存有(可重定位的)位址,哪些沒有。
圖3-2b中的「28」要被重定位,
但mov register1, 28
收音機、洗衣機和微波爐都已完全被(rom形式的)軟體控制,
作業系統作為庫實現
想同時執行(如果只有乙個cpu就輪流執行)多個程式是很困難的。
在系統中沒有對物理記憶體的抽象的情況下,很難實現上述情景,因此,需其他辦法
乙個原始的解決辦法,曾被用在ibm360:
位址空間是乙個程序可用於定址記憶體的一套位址集合
用基和界時,程式裝載到記憶體中連續的空閒位置且裝載期間無須重定位,如圖3-2c。
當乙個程序執行時,程式的起始實體地址裝載到基址暫存器中,程式的長度裝載到界限暫存器中。
圖3-2c中,當第乙個程式執行時,裝載到這些硬體暫存器中的基址和界限值分別是0和16384。
當第二個程式執行時,是16384和32768。
如果第三個16kb的程式被直接裝載在第二個程式的位址之上且執行,值會是32768和16384
photoshop一啟動就500,處理資料後可能要數(gb)
把all一直存在記憶體中要大記憶體,若記憶體不夠,就做不到
若乙個程序在記憶體中不能增長,且磁碟交換區也滿了,這個程序只有掛起直到一些空間空閒(或可結束該程序)
兩者間的記憶體可供兩個段使用
若用完,程序或者須移動到足夠大的空閒區中(可被交換出記憶體直到記憶體中有足夠的空間),
10章介紹linux用的一些特定的記憶體分配器
32n位的記憶體需n位的點陣圖,所以點陣圖只佔1/32的記憶體。
若選比較大的分配單元,則點陣圖更小。
若程序的大小不是分配單元的整數倍,則最後乙個分配單元中有記憶體浪費。
用3-6c的段鍊錶來表示圖3-6a
毎個結點都含以下
要終止的程序一般有兩鄰居(除非記憶體的底或頂),
a中更新鍊錶需要把p換為h
更易於找到上乙個結點,並檢查是否可合併
首次適配演算法速度快,它盡可能少地捜素煉表結點
一般情況下,首次適配生成的空閒區更大些。
21kb這樣的空閒區既可放在20kb的鍊錶,也可放在乙個專門存放大小比較特別的空閒區的鍊錶中
記憶體管理 3
記憶體對映檔案例項 dll 動態庫的好處在前面說過,可以動態呼叫,節約記憶體空間,以及動態的改變dll而不需要重新編譯我們呼叫dll 的客戶端程式。動態的庫的呼叫有2中方式,一種是顯式的一種隱式的,這裡我只考慮顯式的,隱式的呼叫跟靜態庫的呼叫類似,需要提供宣告檔案和庫檔案 lib 所以我們在隱式呼叫...
Linux記憶體管理 3
我們希望能通過訪問使用者空間的記憶體達到讀取核心資料的目的,這樣便可進行核心空間到使用者空間的大規模資訊傳輸。具體的講,我們要利用記憶體對映功能,將系統核心中的一部分虛擬記憶體對映到使用者空間,從而使得使用者空間位址等同與被對映的核心記憶體位址。核心空間記憶體分配介紹 因此我們將試圖寫乙個虛擬字元裝...
記憶體管理(3) 如何優化記憶體使用
為優化應用記憶體使用,開發人員首先應該知什麼最耗應用記憶體,答案就是紋理!紋理幾乎會佔據90 應用記憶體。所以盡量最小化應用的紋理記憶體使用,否則應用很有可能會因為低記憶體而崩潰。本文介紹cocos2d x遊戲通用的兩條記憶體優化原理指導。什麼樣的紋理最耗應用記憶體?或這些紋理會消耗多少記憶體?當然...