Linux記憶體管理及其基本概念__Linux

來源:互聯網
上載者:User

1. 基本概念

1.1 地址

(1)邏輯地址:指由程式產生的與段相關的位移地址部分。在C語言指標中,讀取指標變數本身值(&操作),實際上這個值就是邏輯地址,它是相對於你當前進程資料區段的地址。

(2)線性地址:段中的位移地址(邏輯地址),加上相應段的基地址就產生了一個線性地址。

(3)物理地址: 放在定址匯流排上的地址。

(4)虛擬位址:保護模式下段和段內位移量組成的地址,而邏輯地址就是程式碼片段內位移量,或稱進程的邏輯地址。

1.2 記憶體

(1) 虛擬記憶體:電腦系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個實體記憶體片段,還有部分暫時儲存在外部磁碟儲存空間上,在需要時進行資料交換。與沒有使用虛擬記憶體技術的系統相比,使用這種技術的系統使得大型程式的編寫變得更容易,對真正的實體記憶體(例如RAM)的使用也更有效率。

(2) 實體記憶體:實際的記憶體。物理地址被分成離散的單元,成為頁(page)。目前大多數系統的頁面大小都為4k。

1.3 地址轉換

Linux採用段頁式管理機制,有兩個組件用於地址轉換:分段組件和分頁組件。

(1) 分段組件:將邏輯地址轉換為線性地址。分段提供了隔絕各個代碼、資料和堆棧地區的機制,因此多個程式(任務)可以運行在同一個處理器上而不會互相干擾。

(2) 分頁組件:將線性地址轉換為物理地址(頁表和頁目錄),若沒有啟用分頁機制,那麼線性地址直接就是物理地址。

2. 記憶體配置 kmalloc和vmalloc是分配的是核心的記憶體,malloc分配的是使用者的記憶體 kmalloc保證分配的記憶體在物理上是連續的,vmalloc保證的是在虛擬位址空間上的連續,malloc不保證任何東西(這點是自己猜測的,不一定正確) kmalloc能分配的大小有限(一般小於128 K。它是基於slab(記憶體池)的,以加快小記憶體申請效率),vmalloc和malloc能分配的大小相對較大 記憶體只有在要被DMA訪問的時候才需要物理上連續 vmalloc比kmalloc要慢

 注釋:

 1)核心空間和使用者空間有什麼不同


學c語言的時候應該學過,從使用者空間看,每個進程都傻乎乎的以為自己有4G的記憶體空間,其中位於高地址(3G-4G)的1G空間給核心用,另外的3G(0-3G)都是它一個人獨佔的。所以使用者空間很慷慨的把3G的空間分了好幾個地區,如堆、棧、程式碼片段等。其中,malloc()分配的空間位於堆,而程式中的自動變數,如你在函數內定義的“int i”,它是放在棧上,同時。使用者空間的棧是可變棧,即隨著資料的增多,對應函數的棧空間也會增多。


跟每個使用者空間的進程不一樣,核心只有1G的空間,同時,除了自己本身有進程運行外,核心還要允許使用者空間進程調用系統調用進入核心空間去執行。所以,核心對此相當吝嗇,它規定在核心中的每個進程都只有4KB或8KB(32位下)的定長棧。出於這樣的原因,大的資料結構就不能在棧中分配,只能請求核心分配新的空間來存放資料,如函數kmalloc()。

 2)為什麼進程在核心空間有堆棧,作用是什麼?

進程在執行系統調用或被中斷時,進入核心空間,核心中的程式執行如局部變數、函數調用等都需要堆棧。作用和使用者態下的堆棧作用是類似的。

3. 常見問題

(1) 調用malloc函數後,OS會馬上分配實際的記憶體空間嗎。

答:不會,只會返回一個虛擬位址,待使用者要使用記憶體時,OS會發出一個缺頁中斷,此時,記憶體管理模組才會為程式分配真正的記憶體。

(2) 段式管理和頁式管理的優缺點。

在段式儲存管理中,將程式的地址空間劃分為若干個段(segment),這樣每個進程有一個二維的地址空間,相互獨立,互不干擾。程式通過分段劃分為多個模組,如程式碼片段、資料區段、共用段。這樣做的優點是:可以分別編寫和編譯來源程式的一個檔案,並且可以針對不同類型的段採取不同的保護,也可以按段為單位來進行共用。段式儲存管理的優點是:沒有內片段,外片段可以通過記憶體緊縮來消除;便於實現記憶體共用。

在頁式儲存管理中,將程式的邏輯地址空間劃分為固定大小的頁(page),而實體記憶體劃分為同樣大小的頁框(pageframe)。程式載入時,可將任意一頁放人記憶體中任意一個頁框,這些頁框不必連續,從而實現了離散分配。這種管理方式的優點是,沒有外片段,且一個程式不必連續存放。這樣就便於改變程式佔用空間的大小。

頁式和段式系統有許多相似之處。比如,兩者都採用離散分配方式,且都通過地址映射機構來實現地址變換。但概念上兩者也有很多區別,主要表現在: [1] 頁是資訊的物理單位,分頁是為了實現離散分配方式,以減少記憶體的外零頭,提高記憶體的利用率。或者說,分頁僅僅是由於系統管理的需要,而不是使用者的需要。段是資訊的邏輯單位,它含有一組其意義相對完整的資訊。分段的目的是為了更好地滿足使用者的需要。

[2] 頁的大小固定且由系統決定,把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬體實現的。段的長度不固定,且決定於使用者所編寫的程式,通常由編譯系統在對來源程式進行編譯時間根據資訊的性質來劃分。

[3] 頁式系統地址空間是一維的,即單一的線性地址空間,程式員只需利用一個標識符,即可表示一個地址。分段的作業地址空間是二維的,程式員在標識一個地址時,既需給出段名,又需給出段內地址。

(3) Malloc在什麼情況下調用mmap。

從作業系統角度來看,進程分配記憶體有兩種方式,分別由兩個系統調用完成:brk和mmap(不考慮共用記憶體)。brk是將資料區段(.data)的最高地址指標_edata往高地址推,mmap是在進程的虛擬位址空間中(一般是堆和棧中間)找一塊閒置。這兩種方式分配的都是虛擬記憶體,沒有分配實體記憶體。在第一次訪問已指派的虛擬位址空間的時候,發生缺頁中斷,作業系統負責分配實體記憶體,然後建立虛擬記憶體和實體記憶體之間的映射關係。

在標準C庫中,提供了malloc/free函數分配釋放記憶體,這兩個函數底層是由brk,mmap,munmap這些系統調用實現的。

預設情況下,malloc函數分配記憶體,如果請求記憶體大於128K(可由M_MMAP_THRESHOLD選項調節),那就不是去推_edata指標了,而是利用mmap系統調用,從堆和棧的中間分配一塊虛擬記憶體。這樣子做主要是因為brk分配的記憶體需要等到高地址記憶體釋放以後才能釋放(例如,在B釋放之前,A是不可能釋放的),而mmap分配的記憶體可以單獨釋放。

(4) 32位系統,通常情況下,最大虛擬位址和物理地址空間為多少。

不使用PAE(Physical Address Extension)情況下,最大虛擬位址和物理地址空間均為4G,若果使用PAE,最大虛擬位址仍為4G,而物理地址空間可變為64G(x86, 32為變36位)。

(5) 怎樣實現malloc和free。

Malloc實現可考慮採用buddy演算法+slob演算法,free類似。

注釋:

    1)buddy演算法

將所有空閑頁框分組為10個塊鏈表,每個塊鏈表的每個塊元素分別包含1,2,4,8,16,32,64,128,256,512個連續的頁框,每個塊的第一個頁框的物理地址是該塊大小的整數倍。如,大小為16個頁框的塊,其起始地址是16*2^12(一個頁框的大小為4k,16個頁框的大小為16*4K,1k=1024=2的10次方,4k=2的12次方)的倍數。

  例,假設要請求一個128個頁框的塊,演算法先檢查128個頁框的鏈表是否有空閑塊,如果沒有則查256個頁框的鏈表,有則將256個頁框的塊分裂兩份,一份使用,一份插入128個頁框的鏈表。如果還沒有,就查512個頁框的鏈表,有的話就分裂為128,128,256,一個128使用,剩餘兩個插入對應鏈表。如果在512還沒查到,則返回出錯訊號。

 

4. 參考資料

Linux Memory Management Notes:

http://vmlinz.is-programmer.com/posts/26540.html

記憶體段頁式管理筆記:

http://chenxu.yo2.cn/articles/linux_memory.html

虛擬位址、線性地址和物理地址的轉換:

http://dogking.chinaunix.com/space.php?uid=23208702&do=blog&id=163527

kmalloc、vmalloc、malloc的區別:

http://blog.csdn.net/macrossdzh/article/details/5958368

Linux中的物理和虛擬儲存空間布局:

http://book.chinaunix.net/showart.php?id=3266

[百度分享]頻繁分配釋放記憶體導致的效能問題的分析

http://topic.csdn.net/u/20100325/16/0b86c0ed-5b8d-4eec-a757-c782ae9a3a35.html

kmalloc、vmalloc、malloc的區別

http://blog.csdn.net/macrossdzh/article/details/5958368 buddy演算法:http://baike.baidu.com/view/1040266.htm?tp=2_11

5. 後記

最近面試常被問到記憶體管理的一些基礎知識,特整理此文,以作為這階段面試的小總結。

原創文章,轉載請註明: 轉載自董的部落格

本文連結地址: http://dongxicheng.org/os/linux-memory-management-basic/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.