內存管理的作用?
操作系統(tǒng)的內存管理主要負責內存的分配與回收(malloc 函數(shù):申請內存释涛,free 函數(shù):釋放內存)它匕,另外地址轉換也就是將邏輯地址轉換成相應的物理地址等功能也是操作系統(tǒng)內存管理做的事情
設想有一個特別大籃子,在里面放東西,你會如何放置呢创夜?或者如何做空間管理呢系奉?如果每個程序都是分配實際的物理空間會引發(fā)什么問題呢翁涤,每個程序在分配內存前都需要查看實際空閑的內存空間鸳粉,而且一旦分配后不可更改,很不靈活,分配的空間受物理內存大小限制曙搬,程序之前內存沒有做隔離,而且我們都會知道實際物理地址哗脖,不安全。反過來說棘劣,虛擬內存的優(yōu)點 ①安全性高寡喝。程序之前內存隔離 ②不受限于物理內存大小 ③程序內存統(tǒng)一管理巧骚。
動態(tài)重定位(基于硬件)
大概了解虛擬內存產生的背景沧奴,然后再開始思考如何設計扼仲?虛擬內存和物理內存之前肯定存在映射關系矗愧,第一種思路:動態(tài)重定位(基于硬件)女器,每個cpu有2個寄存器-基址寄存器和界限寄存器丧诺,這樣能保證我們可以在物理內存隨意放置且可以保證進程只可訪問自己的空間同時也不會超過實際的物理內存大小。映射關系:物理地址=虛擬地址+基址。由兩個寄存器劃定了每個進程的地盤,類似于兩個指針數(shù)組,存儲進程的開始位置和結束位置养泡。但這種方式依賴于硬件刚陡,由硬件將虛擬內存地址快速轉換為物理地址氓皱。理論來說基址寄存器和界限寄存器可以 存儲所有進程的起始位置和結束位置各聘,但這樣的話首先需要記錄的內容變多抡医,而且查找進程的對應開始和結束位置也會變慢,因此實際應用是只會存當前運行的進程的開始和結束位置早敬,之前運行分時結束后 可將運行的開始和結束位置記錄到進程控制塊內(PCB),等CPU調度下次運行時琐驴,在寫入到基址和界限內存器當中布近。這種處理方式的弊端會造成內存空間的浪費撑瞧,比如說最小分配單位為16KB扭屁,有些進程實際根本用不了葵腹,就會產生內存碎片,導致資源的浪費囤屹。注意這種是連續(xù)分配的防楷。
分段
可將程序分成代碼牺丙、堆、棧三段复局,每段有基址和界限寄存器記錄位置冲簿,不用設置最小分配單位,相當于由上一步驟的一整塊拆分成了三段亿昏,但是可以靈活分配存儲空間大小峦剔,避免了地址空間的邏輯段之間的大量潛在的內存浪費,分段可以更好的支持稀疏地址管理角钩,分段帶來的附加好處:代碼共享吝沫。如果代碼放在獨立的段空間內呻澜,可以被多個運行的程序共享。但同樣的也會帶來問題就是外部內存碎片惨险,非程序占用的羹幸,因為分配的空間大小和順序不固定,可能會導致產生許多非連續(xù)的未使用內存空間辫愉,當需要分配連續(xù)的內存空間時栅受,這些內存無法使用就產生了浪費,這時候也有人會提恭朗,可以定期進行內存遷移啊屏镊,去掉外部內存空間碎片,但這種拷貝段是內存密集型痰腮,一般會占用大量的處理器時間而芥。還有一個問題就是跟動態(tài)重定位一樣,雖然是分成了三部分膀值,但是如果有很大但比較稀疏的堆棍丐,仍要全部加載到內存中去,還是做不到很好的內存空間管理虫腋。這種是非連續(xù)分配方式骄酗。地址轉換的時候可引入硬件段寄存器稀余,可用14位虛擬地址來區(qū)分段以及偏移量悦冀。比如前2位區(qū)分段,后12位區(qū)分具體的偏移量睛琳,可參照如下:
分頁
分頁是將空間分割成多個固定的分片盒蟆,或者說是分割成多個固定的單元,每個單元稱為頁师骗,一般頁的大小為16KB.分頁的優(yōu)點大大提高了靈活性历等,操作系統(tǒng)可以高效地提供地址空間的抽象,另一個優(yōu)點就是空閑空間的管理更加便捷簡單辟癌。 分頁是屬于硬件層面的寒屯,所以要新增虛擬地址和物理分頁的映射關系,也稱為頁表黍少,注意是每個進程都會有頁表寡夹。頁表的引入又帶來新的問題,假設一個8G大小的內存厂置,2的三十三次方字節(jié)菩掏,每個頁16KB,2的14次方字節(jié)昵济,把頁表理解成線性結構或者數(shù)據(jù)庫的一張表智绸,則表數(shù)量為2的19次方= 524288野揪,假設每個頁項占用4字節(jié)(32位),每個程序的頁表占用空間即為2M瞧栗,100個程序占用內存空間即200M斯稳。首先第一個缺點:頁表占用的空間大。第二:頁面檢索慢迹恐,通過虛擬地址檢索出實際的物理地址遍歷查看平挑,速度慢。而且一般單個程序也無法全部占用內存空間系草,全部加載頁表也是一種空間浪費通熄。簡單來說占用空間大和檢索速度慢2大問題。由此又引出了快表和多級頁表的概念找都。注意分配方式是非連續(xù)分配唇辨,頁表維護好映射關系即可。
快表(TLB)
如何才能加速虛擬地址轉換能耻,盡量避免額外的內存訪問赏枚?需要什么樣的硬件支持?操作系統(tǒng)該如何支持晓猛?
快速地址轉換饿幅。由硬件支持弧岳,放到高速緩存區(qū)捅彻。物理地址=(頁號->塊號)+偏移量。
簡述:
當計算機程序需要訪問內存地址時挨下,處理器需要將程序使用的虛擬內存地址轉換為硬件使用的物理內存地址洪燥。這個翻譯過程可能會耗費很多時間磕秤,特別是對于訪問許多內存地址的大型程序而言。
為了加快這個過程捧韵,處理器使用TLB緩存最近使用的翻譯市咆。TLB存儲虛擬內存地址和物理內存地址之間的映射,允許處理器快速查找給定虛擬地址的物理地址再来,而不必執(zhí)行耗時的翻譯過程蒙兰。
TLB是針對當前正在運行的進程的,當進行進程切換的時候芒篷,TLB又該如何工作了呢搜变?
答:當進程切換時,TLB需要清空緩存梭伐、加載新進程的頁表信息并更新TLB緩存痹雅,以確保正確地進行虛擬地址到物理地址的轉換。上下文切換的時候清空TLB糊识,這是一個可行的解決方案绩社,進程不會再讀到錯誤的地址映射摔蓝。但是,有一定開銷:每次進程運行愉耙,當它訪問數(shù)據(jù)和代碼頁時贮尉,都會觸發(fā)TLB未命中。如果操作系統(tǒng)頻繁地切換進程朴沿,這種開銷會很高猜谚。為了減少這種開銷,一些系統(tǒng)增加了硬件支持赌渣,實現(xiàn)跨上下文切換的TLB共享魏铅。比如有的系統(tǒng)在TLB中添加了一個地址空間標識符(Address Space Identifier,ASID)坚芜。因為多個進程共用TLB,所以可共享代碼頁(以二進制或共享庫的方式)览芳,即不同進程的虛擬頁可以指向相同的物理頁,減少物理頁的使用鸿竖,從而減少了內存開銷沧竟。
多級頁表
為解決頁表占用空間大且檢查速度慢,引入多級頁表的概念缚忧,
類似于數(shù)據(jù)庫的分庫分表悟泵,將頁表水平拆成多個表,例如二級表闪水。一級頁表作為索引表糕非,指向二級表,二級頁表作為實際地址映射表敦第。32位的結構可理解如下:
在一個多級頁表系統(tǒng)中峰弹,每個進程都有自己的頁表,它們在操作系統(tǒng)內存中被存儲芜果。一個虛擬地址被分解成多個部分,每個部分被用來索引相應的頁表融师。每個頁表項包含一個物理地址或者指向下一級頁表的指針右钾,因此可以通過多級索引找到物理地址。
多級頁表的優(yōu)點是可以將頁表的大小減小到合理的范圍內旱爆,同時也可以更高效地進行地址映射舀射。此外,多級頁表還可以實現(xiàn)虛擬地址的共享和保護怀伦。
段頁式管理(補充)
段頁式管理將內存分成段和頁兩個部分脆烟,其中每個段可以包含多個頁面。這種技術可以更好地管理內存房待,同時提高系統(tǒng)的效率和靈活性邢羔。段頁式管理還可以減少外部碎片和內部碎片的問題驼抹,提高內存的利用率。
在段頁式管理中拜鹤,每個進程有一個獨立的虛擬地址空間框冀,其中包含多個段和頁面。段頁式管理將虛擬地址空間分成不同的段敏簿,每個段可以包含不同數(shù)量的頁面明也。當進程需要訪問某個地址時,操作系統(tǒng)會將虛擬地址轉換為物理地址惯裕,然后訪問相應的頁面温数。
總之,段頁式管理是一種內存管理技術蜻势,它將內存分成段和頁兩個部分帆吻,可以更好地管理內存,提高系統(tǒng)的效率和靈活性咙边。段表和頁表猜煮。
虛擬內存管理
頁面置換算法:
先進先出(FIFO)算法:選擇最先進入內存的頁面進行置換。
最近最少使用(LRU)算法:選擇最近最久未被使用的頁面進行置換败许。
最少使用(LFU)算法:選擇使用次數(shù)最少的頁面進行置換王带。
時鐘(Clock)算法:將所有頁面按照訪問位的值分為兩類市殷,然后選擇訪問位值為0的頁面進行置換。
最不經(jīng)常使用(NFU)算法:選擇使用次數(shù)最少的頁面進行置換嗅绰,但是使用次數(shù)的統(tǒng)計是按照時間片來計算的,即使用次數(shù)在一定時間段內的平均值。
最不經(jīng)常使用的改進(NUR)算法:將頁面按照訪問位和修改位的值分為四類黑滴,然后選擇訪問位和修改位都為0的頁面進行置換。
基于工作集的頁面置換算法:在程序執(zhí)行時記錄每個頁面最近被訪問的時間,然后根據(jù)工作集的大小來動態(tài)調整內存中頁面的數(shù)量滋觉。如果某個頁面在工作集中的時間超過了一定的閾值我纪,那么就將其置換出去术健。
最優(yōu)(OPT)算法:選擇在未來最長時間內不會被訪問到的頁面進行置換。這是一種理論上最優(yōu)的算法笤妙,但是實際中很難實現(xiàn)铃诬,因為需要預測未來的訪問模式想罕。
頁面分配策略
頁面分配策略是指操作系統(tǒng)在將程序的虛擬地址映射到物理地址時,如何分配物理頁面的策略师溅。下面是一些常見的頁面分配策略:
固定分配策略:操作系統(tǒng)在程序運行前為程序分配一定數(shù)量的物理頁面,程序只能使用這些頁面窑多,不能再申請新的頁面。這種策略可以保證程序的內存使用量不會超過限定值洼滚,但是可能會導致浪費埂息。
可變分配策略:操作系統(tǒng)根據(jù)程序的需要,動態(tài)地為程序分配物理頁面。這種策略可以使得程序使用內存更加高效千康,但是需要考慮頁面分配的效率和分配策略的復雜度享幽。
交換分配策略:當物理內存不足時,操作系統(tǒng)將一部分暫時不使用的頁面交換到磁盤上拾弃,以釋放出物理頁面供其他程序使用值桩。這種策略可以在一定程度上擴展物理內存,但是交換過程需要消耗時間和I/O資源豪椿。
請求分配策略:程序需要內存時奔坟,先向操作系統(tǒng)發(fā)送請求,由操作系統(tǒng)根據(jù)當前內存情況進行分配砂碉。這種策略可以使得內存使用更加高效蛀蜜,但是需要操作系統(tǒng)進行調度,增加了系統(tǒng)的開銷增蹭。
共享分配策略:多個程序可以共享同一個物理頁面滴某。這種策略可以節(jié)省內存空間,但是需要考慮頁面的讀寫權限和頁面的同步問題滋迈。
頁面調入時機
虛擬內存中頁面的調入時機可以根據(jù)需要進行調整霎奢,一般有以下幾種情況:
預取(Prefetching):虛擬內存可以通過預取技術饼灿,在程序需要訪問某個頁面之前提前將該頁面加載到內存中幕侠。預取可以提高程序的運行效率和響應速度,因為它可以預先加載一些數(shù)據(jù)和代碼碍彭,避免了等待頁面調入的時間晤硕。
頁面置換(Page Replacement):當內存中的頁面不足時,虛擬內存會將某些頁面置換到硬盤上庇忌,以騰出內存空間供新頁面使用舞箍。頁面置換的時機通常是在需要加載新頁面時,操作系統(tǒng)會根據(jù)一定的置換算法選擇要置換的頁面皆疹。
冷啟動(Cold Start):冷啟動是指當程序第一次運行時疏橄,需要將其所需的頁面全部加載到內存中。在這種情況下略就,頁面調入的時機通常是在程序啟動時進行捎迫。
MMU
MMU是Memory Management Unit(內存管理單元)的縮寫,是計算機中用于管理內存的重要部件之一表牢。它主要負責實現(xiàn)虛擬內存的功能窄绒,將邏輯地址(也稱虛擬地址)映射到物理地址,從而為操作系統(tǒng)和應用程序提供了一個虛擬的崔兴、統(tǒng)一的地址空間颗祝。
MMU通過使用地址映射表(Page Table)來實現(xiàn)邏輯地址到物理地址的轉換浊闪,這個映射表包含了虛擬地址與物理地址之間的對應關系恼布。當CPU訪問一個虛擬地址時螺戳,MMU會通過查找映射表來確定對應的物理地址,并將該地址發(fā)送到內存控制器折汞,最終得到所需的數(shù)據(jù)或指令倔幼。
除了地址映射功能,MMU還可以實現(xiàn)內存保護和共享等功能爽待。通過為每個進程分配獨立的地址空間和訪問權限损同,MMU可以確保每個進程都只能訪問自己的內存空間,從而提高系統(tǒng)的安全性和穩(wěn)定性鸟款。同時膏燃,MMU還可以實現(xiàn)內存共享,多個進程可以共享同一塊內存區(qū)域何什,從而減少內存使用量组哩,提高系統(tǒng)效率。
總之,MMU是計算機系統(tǒng)中一個非常重要的組成部分荠诬,它為操作系統(tǒng)和應用程序提供了強大的內存管理和保護機制辩尊,是現(xiàn)代操作系統(tǒng)和計算機系統(tǒng)中必不可少的技術疮薇。