導航:首頁 > 編程系統 > 深入理解linux虛擬內存管理書評

深入理解linux虛擬內存管理書評

發布時間:2023-06-01 15:58:50

『壹』 linux中使用了什麼內存管理方法,為什麼

「事實勝於雄辯」,我們用一個小例子(原形取自《User-Level Memory Management》)來展示上面所講的各種內存區的差別與位置。

進程的地址空間對應的描述結構是「內存描述符結構」,它表示進程的全部地址空間,——包含了和進程地址空間有關的全部信息,其中當然包含進程的內存區域。

進程內存的分配與回收

創建進程fork()、程序載入execve()、映射文件mmap()、動態內存分配malloc()/brk()等進程相關操作都需要分配內存給進程。不過這時進程申請和獲得的還不是實際內存,而是虛擬內存,准確的說是「內存區域」。進程對內存區域的分配最終都會歸結到do_mmap()函數上來(brk調用被單獨以系統調用實現,不用do_mmap()),

內核使用do_mmap()函數創建一個新的線性地址區間。但是說該函數創建了一個新VMA並不非常准確,因為如果創建的地址區間和一個已經存在的地址區間相鄰,並且它們具有相同的訪問許可權的話,那麼兩個區間將合並為一個。如果不能合並,那麼就確實需要創建一個新的VMA了。但無論哪種情況,do_mmap()函數都會將一個地址區間加入到進程的地址空間中--無論是擴展已存在的內存區域還是創建一個新的區域。

同樣,釋放一個內存區域應使用函數do_ummap(),它會銷毀對應的內存區域。

如何由虛變實!

從上面已經看到進程所能直接操作的地址都為虛擬地址。當進程需要內存時,從內核獲得的僅僅是虛擬的內存區域,而不是實際的物理地址,進程並沒有獲得物理內存(物理頁面——頁的概念請大家參考硬體基礎一章),獲得的僅僅是對一個新的線性地址區間的使用權。實際的物理內存只有當進程真的去訪問新獲取的虛擬地址時,才會由「請求頁機制」產生「缺頁」異常,從而進入分配實際頁面的常式。

該異常是虛擬內存機制賴以存在的基本保證——它會告訴內核去真正為進程分配物理頁,並建立對應的頁表,這之後虛擬地址才實實在在地映射到了系統的物理內存上。(當然,如果頁被換出到磁碟,也會產生缺頁異常,不過這時不用再建立頁表了)

這種請求頁機制把頁面的分配推遲到不能再推遲為止,並不急於把所有的事情都一次做完(這種思想有點像設計模式中的代理模式(proxy))。之所以能這么做是利用了內存訪問的「局部性原理」,請求頁帶來的好處是節約了空閑內存,提高了系統的吞吐率。要想更清楚地了解請求頁機制,可以看看《深入理解linux內核》一書。

這里我們需要說明在內存區域結構上的nopage操作。當訪問的進程虛擬內存並未真正分配頁面時,該操作便被調用來分配實際的物理頁,並為該頁建立頁表項。在最後的例子中我們會演示如何使用該方法。

系統物理內存管理

雖然應用程序操作的對象是映射到物理內存之上的虛擬內存,但是處理器直接操作的卻是物理內存。所以當應用程序訪問一個虛擬地址時,首先必須將虛擬地址轉化成物理地址,然後處理器才能解析地址訪問請求。地址的轉換工作需要通過查詢頁表才能完成,概括地講,地址轉換需要將虛擬地址分段,使每段虛地址都作為一個索引指向頁表,而頁表項則指向下一級別的頁表或者指向最終的物理頁面。

每個進程都有自己的頁表。進程描述符的pgd域指向的就是進程的頁全局目錄。下面我們借用《linux設備驅動程序》中的一幅圖大致看看進程地址空間到物理頁之間的轉換關系。

上面的過程說起來簡單,做起來難呀。因為在虛擬地址映射到頁之前必須先分配物理頁——也就是說必須先從內核中獲取空閑頁,並建立頁表。下面我們介紹一下內核管理物理內存的機制。

物理內存管理(頁管理)

Linux內核管理物理內存是通過分頁機制實現的,它將整個內存劃分成無數個4k(在i386體系結構中)大小的頁,從而分配和回收內存的基本單位便是內存頁了。利用分頁管理有助於靈活分配內存地址,因為分配時不必要求必須有大塊的連續內存[3],系統可以東一頁、西一頁的湊出所需要的內存供進程使用。雖然如此,但是實際上系統使用內存時還是傾向於分配連續的內存塊,因為分配連續內存時,頁表不需要更改,因此能降低TLB的刷新率(頻繁刷新會在很大程度上降低訪問速度)。

鑒於上述需求,內核分配物理頁面時為了盡量減少不連續情況,採用了「夥伴」關系來管理空閑頁面。夥伴關系分配演算法大家應該不陌生——幾乎所有操作系統方面的書都會提到,我們不去詳細說它了,如果不明白可以參看有關資料。這里只需要大家明白Linux中空閑頁面的組織和管理利用了夥伴關系,因此空閑頁面分配時也需要遵循夥伴關系,最小單位只能是2的冪倍頁面大小。內核中分配空閑頁面的基本函數是get_free_page/get_free_pages,它們或是分配單頁或是分配指定的頁面(2、4、8…512頁)。

注意:get_free_page是在內核中分配內存,不同於malloc在用戶空間中分配,malloc利用堆動態分配,實際上是調用brk()系統調用,該調用的作用是擴大或縮小進程堆空間(它會修改進程的brk域)。如果現有的內存區域不夠容納堆空間,則會以頁面大小的倍數為單位,擴張或收縮對應的內存區域,但brk值並非以頁面大小為倍數修改,而是按實際請求修改。因此Malloc在用戶空間分配內存可以以位元組為單位分配,但內核在內部仍然會是以頁為單位分配的。

另外,需要提及的是,物理頁在系統中由頁結構structpage描述,系統中所有的頁面都存儲在數組mem_map[]中,可以通過該數組找到系統中的每一頁(空閑或非空閑)。而其中的空閑頁面則可由上述提到的以夥伴關系組織的空閑頁鏈表(free_area[MAX_ORDER])來索引。

內核內存使用

Slab

所謂尺有所長,寸有所短。以頁為最小單位分配內存對於內核管理系統中的物理內存來說的確比較方便,但內核自身最常使用的內存卻往往是很小(遠遠小於一頁)的內存塊——比如存放文件描述符、進程描述符、虛擬內存區域描述符等行為所需的內存都不足一頁。這些用來存放描述符的內存相比頁面而言,就好比是麵包屑與麵包。一個整頁中可以聚集多個這些小塊內存;而且這些小塊內存塊也和麵包屑一樣頻繁地生成/銷毀。

為了滿足內核對這種小內存塊的需要,Linux系統採用了一種被稱為slab分配器的技術。Slab分配器的實現相當復雜,但原理不難,其核心思想就是「存儲池[4]」的運用。內存片段(小塊內存)被看作對象,當被使用完後,並不直接釋放而是被緩存到「存儲池」里,留做下次使用,這無疑避免了頻繁創建與銷毀對象所帶來的額外負載。

Slab技術不但避免了內存內部分片(下文將解釋)帶來的不便(引入Slab分配器的主要目的是為了減少對夥伴系統分配演算法的調用次數——頻繁分配和回收必然會導致內存碎片——難以找到大塊連續的可用內存),而且可以很好地利用硬體緩存提高訪問速度。

Slab並非是脫離夥伴關系而獨立存在的一種內存分配方式,slab仍然是建立在頁面基礎之上,換句話說,Slab將頁面(來自於夥伴關系管理的空閑頁面鏈表)撕碎成眾多小內存塊以供分配,slab中的對象分配和銷毀使用kmem_cache_alloc與kmem_cache_free。

Kmalloc

Slab分配器不僅僅只用來存放內核專用的結構體,它還被用來處理內核對小塊內存的請求。當然鑒於Slab分配器的特點,一般來說內核程序中對小於一頁的小塊內存的請求才通過Slab分配器提供的介面Kmalloc來完成(雖然它可分配32到131072位元組的內存)。從內核內存分配的角度來講,kmalloc可被看成是get_free_page(s)的一個有效補充,內存分配粒度更靈活了。

有興趣的話,可以到/proc/slabinfo中找到內核執行現場使用的各種slab信息統計,其中你會看到系統中所有slab的使用信息。從信息中可以看到系統中除了專用結構體使用的slab外,還存在大量為Kmalloc而准備的Slab(其中有些為dma准備的)。

內核非連續內存分配(Vmalloc)

夥伴關系也好、slab技術也好,從內存管理理論角度而言目的基本是一致的,它們都是為了防止「分片」,不過分片又分為外部分片和內部分片之說,所謂內部分片是說系統為了滿足一小段內存區(連續)的需要,不得不分配了一大區域連續內存給它,從而造成了空間浪費;外部分片是指系統雖有足夠的內存,但卻是分散的碎片,無法滿足對大塊「連續內存」的需求。無論何種分片都是系統有效利用內存的障礙。slab分配器使得一個頁面內包含的眾多小塊內存可獨立被分配使用,避免了內部分片,節約了空閑內存。夥伴關系把內存塊按大小分組管理,一定程度上減輕了外部分片的危害,因為頁框分配不在盲目,而是按照大小依次有序進行,不過夥伴關系只是減輕了外部分片,但並未徹底消除。你自己比劃一下多次分配頁面後,空閑內存的剩餘情況吧。

所以避免外部分片的最終思路還是落到了如何利用不連續的內存塊組合成「看起來很大的內存塊」——這里的情況很類似於用戶空間分配虛擬內存,內存邏輯上連續,其實映射到並不一定連續的物理內存上。Linux內核借用了這個技術,允許內核程序在內核地址空間中分配虛擬地址,同樣也利用頁表(內核頁表)將虛擬地址映射到分散的內存頁上。以此完美地解決了內核內存使用中的外部分片問題。內核提供vmalloc函數分配內核虛擬內存,該函數不同於kmalloc,它可以分配較Kmalloc大得多的內存空間(可遠大於128K,但必須是頁大小的倍數),但相比Kmalloc來說,Vmalloc需要對內核虛擬地址進行重映射,必須更新內核頁表,因此分配效率上要低一些(用空間換時間)

與用戶進程相似,內核也有一個名為init_mm的mm_strcut結構來描述內核地址空間,其中頁表項pdg=swapper_pg_dir包含了系統內核空間(3G-4G)的映射關系。因此vmalloc分配內核虛擬地址必須更新內核頁表,而kmalloc或get_free_page由於分配的連續內存,所以不需要更新內核頁表。

vmalloc分配的內核虛擬內存與kmalloc/get_free_page分配的內核虛擬內存位於不同的區間,不會重疊。因為內核虛擬空間被分區管理,各司其職。進程空間地址分布從0到3G(其實是到PAGE_OFFSET,在0x86中它等於0xC0000000),從3G到vmalloc_start這段地址是物理內存映射區域(該區域中包含了內核鏡像、物理頁面表mem_map等等)比如我使用的系統內存是64M(可以用free看到),那麼(3G——3G+64M)這片內存就應該映射到物理內存,而vmalloc_start位置應在3G+64M附近(說"附近"因為是在物理內存映射區與vmalloc_start期間還會存在一個8M大小的gap來防止躍界),vmalloc_end的位置接近4G(說"接近"是因為最後位置系統會保留一片128k大小的區域用於專用頁面映射,還有可能會有高端內存映射區,這些都是細節,這里我們不做糾纏)。

上圖是內存分布的模糊輪廓

由get_free_page或Kmalloc函數所分配的連續內存都陷於物理映射區域,所以它們返回的內核虛擬地址和實際物理地址僅僅是相差一個偏移量(PAGE_OFFSET),你可以很方便的將其轉化為物理內存地址,同時內核也提供了virt_to_phys()函數將內核虛擬空間中的物理映射區地址轉化為物理地址。要知道,物理內存映射區中的地址與內核頁表是有序對應的,系統中的每個物理頁面都可以找到它對應的內核虛擬地址(在物理內存映射區中的)。

而vmalloc分配的地址則限於vmalloc_start與vmalloc_end之間。每一塊vmalloc分配的內核虛擬內存都對應一個vm_struct結構體(可別和vm_area_struct搞混,那可是進程虛擬內存區域的結構),不同的內核虛擬地址被4k大小的空閑區間隔,以防止越界——見下圖)。與進程虛擬地址的特性一樣,這些虛擬地址與物理內存沒有簡單的位移關系,必須通過內核頁表才可轉換為物理地址或物理頁。它們有可能尚未被映射,在發生缺頁時才真正分配物理頁面。

這里給出一個小程序幫助大家認清上面幾種分配函數所對應的區域。

#include<linux/mole.h>

#include<linux/slab.h>

#include<linux/vmalloc.h>

unsignedchar*pagemem;

unsignedchar*kmallocmem;

unsignedchar*vmallocmem;

intinit_mole(void)

{

pagemem = get_free_page(0);

printk("<1>pagemem=%s",pagemem);

kmallocmem = kmalloc(100,0);

printk("<1>kmallocmem=%s",kmallocmem);

vmallocmem = vmalloc(1000000);

printk("<1>vmallocmem=%s",vmallocmem);

}

voidcleanup_mole(void)

{

free_page(pagemem);

kfree(kmallocmem);

vfree(vmallocmem);

}

實例

內存映射(mmap)是Linux操作系統的一個很大特色,它可以將系統內存映射到一個文件(設備)上,以便可以通過訪問文件內容來達到訪問內存的目的。這樣做的最大好處是提高了內存訪問速度,並且可以利用文件系統的介面編程(設備在Linux中作為特殊文件處理)訪問內存,降低了開發難度。許多設備驅動程序便是利用內存映射功能將用戶空間的一段地址關聯到設備內存上,無論何時,只要內存在分配的地址范圍內進行讀寫,實際上就是對設備內存的訪問。同時對設備文件的訪問也等同於對內存區域的訪問,也就是說,通過文件操作介面可以訪問內存。Linux中的X伺服器就是一個利用內存映射達到直接高速訪問視頻卡內存的例子。

熟悉文件操作的朋友一定會知道file_operations結構中有mmap方法,在用戶執行mmap系統調用時,便會調用該方法來通過文件訪問內存——不過在調用文件系統mmap方法前,內核還需要處理分配內存區域(vma_struct)、建立頁表等工作。對於具體映射細節不作介紹了,需要強調的是,建立頁表可以採用remap_page_range方法一次建立起所有映射區的頁表,或利用vma_struct的nopage方法在缺頁時現場一頁一頁的建立頁表。第一種方法相比第二種方法簡單方便、速度快,但是靈活性不高。一次調用所有頁表便定型了,不適用於那些需要現場建立頁表的場合——比如映射區需要擴展或下面我們例子中的情況。

我們這里的實例希望利用內存映射,將系統內核中的一部分虛擬內存映射到用戶空間,以供應用程序讀取——你可利用它進行內核空間到用戶空間的大規模信息傳輸。因此我們將試圖寫一個虛擬字元設備驅動程序,通過它將系統內核空間映射到用戶空間——將內核虛擬內存映射到用戶虛擬地址。從上一節已經看到Linux內核空間中包含兩種虛擬地址:一種是物理和邏輯都連續的物理內存映射虛擬地址;另一種是邏輯連續但非物理連續的vmalloc分配的內存虛擬地址。我們的例子程序將演示把vmalloc分配的內核虛擬地址映射到用戶地址空間的全過程。

程序里主要應解決兩個問題:

第一是如何將vmalloc分配的內核虛擬內存正確地轉化成物理地址?

因為內存映射先要獲得被映射的物理地址,然後才能將其映射到要求的用戶虛擬地址上。我們已經看到內核物理內存映射區域中的地址可以被內核函數virt_to_phys轉換成實際的物理內存地址,但對於vmalloc分配的內核虛擬地址無法直接轉化成物理地址,所以我們必須對這部分虛擬內存格外「照顧」——先將其轉化成內核物理內存映射區域中的地址,然後在用virt_to_phys變為物理地址。

轉化工作需要進行如下步驟:

  • 找到vmalloc虛擬內存對應的頁表,並尋找到對應的頁表項。

  • 獲取頁表項對應的頁面指針

  • 通過頁面得到對應的內核物理內存映射區域地址。

  • 如下圖所示:

    第二是當訪問vmalloc分配區時,如果發現虛擬內存尚未被映射到物理頁,則需要處理「缺頁異常」。因此需要我們實現內存區域中的nopaga操作,以能返回被映射的物理頁面指針,在我們的實例中就是返回上面過程中的內核物理內存映射區域中的地址。由於vmalloc分配的虛擬地址與物理地址的對應關系並非分配時就可確定,必須在缺頁現場建立頁表,因此這里不能使用remap_page_range方法,只能用vma的nopage方法一頁一頁的建立。

    程序組成

    map_driver.c,它是以模塊形式載入的虛擬字元驅動程序。該驅動負責將一定長的內核虛擬地址(vmalloc分配的)映射到設備文件上。其中主要的函數有——vaddress_to_kaddress()負責對vmalloc分配的地址進行頁表解析,以找到對應的內核物理映射地址(kmalloc分配的地址);map_nopage()負責在進程訪問一個當前並不存在的VMA頁時,尋找該地址對應的物理頁,並返回該頁的指針。

    test.c它利用上述驅動模塊對應的設備文件在用戶空間讀取讀取內核內存。結果可以看到內核虛擬地址的內容(ok!),被顯示在了屏幕上。

    執行步驟

    編譯map_driver.c為map_driver.o模塊,具體參數見Makefile

    載入模塊:insmodmap_driver.o

    生成對應的設備文件

    1在/proc/devices下找到map_driver對應的設備命和設備號:grepmapdrv/proc/devices

    2建立設備文件mknodmapfilec 254 0(在我的系統里設備號為254)

    利用maptest讀取mapfile文件,將取自內核的信息列印到屏幕上。

    『貳』 Linux學習書籍求推薦

    Linux學習書籍求推薦
    1、《Linux與Unix Shell 編程指南》
    C語言基礎
    1、《C Primer Plus,5th Edition》【美】Stephen Prata著
    2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著
    3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
    4、《嵌入式Linux應用程序開發詳解》
    Linux內核
    1、《深入理解Linux內核》(第三版)
    2、《Linux內核源代碼情景分析》毛德操 胡希明著
    研發方向
    1、《UNIX Network Programming》(UNP)
    2、《TCP/IP詳解》
    3、《Linux內核編程》
    4、《Linux設備驅動開發》(LDD)
    硬體基礎
    1、《ARM體系結構與編程》杜春雷著
    2、S3C2410 Datasheet
    英語基礎
    1、《計算機與通信專業英語》
    系統教程
    1、《嵌入式系統――體系結構、編程與設計》
    2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著
    3、《Building Embedded Linux Systems》
    理論基礎
    1、《演算法導論》
    2、《數據結構(C語言版)》
    3、《計算機組織與體系結構?性能分析》
    4、《深入理解計算機系統》【美】Randal E. Bryant David O』Hallaron著
    5、《操作系統:精髓與設計原理》
    6、《編譯原理》
    7、《數據通信與計算機網路
    8、《數據壓縮原理與應用》
    入門篇
    《LINUX權威指南》書不錯,寫的很全面也比較廣,涉及的不深,做為入門書籍不錯,可以比較全面的了解linux 。另外比較熱門的也可以看看《鳥哥的私房菜》等書,偏管理類的書。如果想做server方向的可以找來看看。
    驅動 篇
    《LINUX設備驅動程序 》就是網上說的「LDD」,經典之作,必備書籍。國產經典《Linux驅動詳細解》也是一本非常不錯的書,很實用,書中源代碼分析比較多,基於2440的,對linux外圍驅動有很全面的講解
    內核篇
    浙江大學的《LINUX內核源代碼情景分析》,外國鬼子的《萊昂氏UNIX源代碼分析》還有《深入理解linux內核》都是出名的經典巨作。另外趙 炯的《LINUX內核完全剖析–基於0.12內核》也非常不錯,對內核代碼進行了詳細的注釋,非常有助於對內核的理解和代碼的分析。
    shell篇
    《LINUX與UNIX Shell編程指南》
    應用 編程
    不用說了肯定是《unix環境高級編程》被稱為unix編程的聖經。
    TCP/IP篇
    《TCP/IP詳解》作者W.Richard Stevens也是《unix環境高級編程》的作者,牛人出的書沒有一本不是經典的。但是英年早逝,默哀一下。
    c語言
    《The C Programming Language》正是作者造出來的c語言,書能垃圾就怪了
    《c和指針》和《c缺陷和陷阱》兩本必備。包含了c語言最容易出錯的地方,加深c語言功力的好材料。
    關於演算法
    《演算法導論》
    1 熟悉linux基本環境 >>> 《鳥哥的私訪菜》《unix初級教程》 《linux編程寶典》(市面上無,圖書館有), 等等。
    2 熟悉操作系統的基礎知識 >>> 《現代操作系統》 《操作系統概念》
    3 熟悉系統編程 >>> 《unix環境高級編程第二版》《unix操作系統設計與實現》
    4 內核 按先後順序: 《 linux內核設計與實現》 《linux設備驅動程序》 《深入理解 linux內核》 《linux內核源代碼情景分析》 《深入理解linux虛擬內存系統》
    5 其他一些書籍: 《freebsd操作系統設計與實現》 《solaris內核結構》 《unix高級教程:系統技術內幕》 《現代體系結構的unix系統:內核程序員的smp與cache技術》 《保護方式下的80386及其編程》 (後3本市面上沒了,大學圖書館里一般都有》 《Intel64 and IA-32 Arichitectures Software Developer』s Manual》
    6 其實內核玩深了,體系和編譯也要學好 《計算機體系結構:量化研究方法》 《編譯原理》(龍書)

    Linux編程推薦書籍一覽表
    shell 編程
    《LINUX與UNIX SHELL編程指南》
    BASH寶典:
    Advanced Bash Scripting Guide (如果你使用的是 GNU/Debian 系統,可以用 apt-get install abs-guide 安裝該文檔)
    BASH Programming – Introction HOW-TO
    Bash Man

    用戶級編程書籍:
    Advanced Programming in the UNIX Environment(中文版《UNIX環境高級編程》第二版) 作者 W.Richard
    Stevens/尤晉元等
    GNU/Linux編程指南 作者 Kurt Wall
    Linux 程序設計權威指南 作者 於明儉、陳向陽、方漢
    《The Art of Unix Programming》作者 E.S.R
    Computer Systems A Programmer』s Perspective
    (中文名)《深入理解計算機系統(修訂版)》
    《Unix Systems Programming》(中文版《UNIX系統編程》)作者: (美)KAY
    A.ROBBINS, STEVE ROBBINS 譯者:陳涓 趙振平
    網路編程:
    Unix Network Programming V1 & V2,Unix網路編程卷1、2 作者 W.Richard Stevens
    《unix網路編程》
    XWindow編程
    Definitive Guides to the X WindowSystem 作者 Dan Heller, Paula M. Ferguson

    內核源代碼閱讀(結合源代碼)和編程
    (入門)
    《邊干邊學Linux內核指導》
    (高級)
    《Linux Kernel Development》
    《Linux內核源代碼情景分析》
    《深入分析Linux內核源代碼》 陳莉君
    《 Understanding Linux Network Internals 》即《 深入理解Linux網路內幕(英文影印版)》Christian Benvenuti
    內核模塊編程
    《The Linux Kernel Mole Programming Guide》
    Linux設備驅動編程
    Linux設備驅動程序/Linux Device
    Drivers 作者 Alessandro Ruibini
    多線程編程
    《多線程編程指南》

    『叄』 linux內存管理的特點

    什麼是虛擬內存?
    Linux支持虛擬內存(virtual memory),虛擬內存是指使用磁碟當作RAM的擴展,這樣可用的內存的大小就相應地增大了。內核會將暫時不用的內存塊的內容寫到硬碟上,這樣一來,這塊內存就可用於其它目的。當需要用到原始的內容時,它們被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內存可供使用而並沒有注意到時不時它們的一部分是駐留在硬碟上的。當然,讀寫硬碟要比直接使用真實內存慢得多(要慢數千倍),所以程序就不會象一直在內存中運行的那樣快。用作虛擬內存的硬碟部分被稱為交換空間(swap space)。
    Linux能夠使用文件系統中的一個常規文件或一個獨立的分區作為交換空間。交換分區要快一些,但是很容易改變交換文件的大小(也就無需重分區整個硬碟,並且可以從臨時分區中安裝任何東西)。當你知道你需要多大的交換空間時,你應該使用交換分區,但是如果你不能確定的話,你可以首先使用一個交換文件,然後使用一陣子系統,你就可以感覺到要有多大的交換空間,此時,當你能夠確信它的大小時就創建一個交換分區。
    你應該知道,Linux允許同時使用幾個交換分區以及/或者交換文件。這意味著如果你只是偶爾地另外需要一個交換空間時,你可以在當時設置一個額外的交換文件,而不是一直分配這個交換空間。
    操作系統術語注釋:計算機科學常常將交換[swapping](將整個進程寫到交換空間)與頁面調度[paging](在某個時刻,僅僅固定大小的幾千位元組寫到交換空間內)加以區別。頁面調度通常更有效,這也是Linux的做法,但是傳統的Linux術語卻指的是交換。
    創建交換空間
    一個交換文件是一個普通的文件;對內核來說一點也不特殊。對內核有關系的是它不能有孔,並且它是用mkswap來准備的。而且,它必須駐留在一個本地硬碟上,它不能由於實現的原因而駐留在一個通過NFS載入的文件系統中。
    關於孔是重要的。交換文件保留了磁碟空間,以至於內核能夠快速地交換出頁面而無需做分配磁碟扇區給文件時所要做的一些事。內核僅僅是使用早已分配給交換文件的任何扇區而已。因為文件中的一個孔意味著沒有磁碟扇區分配(給該文件的孔的相應部分),對內核來說就不能使用這類有孔的文件。
    創建無孔的交換文件的一個好方法是通過下列命令:
    $ dd if=/dev/zero of=/extra-swap bs=1024 count=1024 \

    上面/extra-swap是交換文件的名字,大小由count=後面的數值給出。大小最好是4的倍數,因為內核寫出的內存頁面(memory pages)大小是4千位元組。如果大小不是4的倍數,最後幾千位元組就用不上了。
    一個交換分區也並沒有什麼特別的。你可以象創建其它分區一樣地創建它;唯一的區別在於它是作為一個原始的分區使用的,也即,它不包括任何的文件系統。將交換分區標記為類型82(Linux交換分區)是個好主意;這將使得分區的列表更清楚,盡管對內核來說並不是一定要這樣的。
    在創建了一個交換文件或一個交換分區以後,你必須在它的開頭部分寫上一個簽名;這個簽名中包括了一些由內核使用的管理信息。這是用\cmd{mkswap}命令來做到的,用法如下:
    $ mkswap /extra-swap 1024
    Setting up swapspace, size = 1044480 bytes

    請注意此時交換空間還沒有被使用:它已存在,但內核還沒有用它作為虛擬內存。你必須非常小心地使用mkswap,因為它不檢查這個文件或分區是否已被別人使用。你可以非常容易地使用mkswap來覆蓋重要的文件以及分區!幸運的是,僅僅在安裝系統時,你才需要使用mkswap。
    Linux內存管理程序限制每個交換空間最大約為127MB(由於各種技術上的原因,實際的限制大小為(4096-10) * 8 * 4096 = 133890048$ 位元組,或127.6875兆位元組)。然而,你可以同時使用多至16個交換空間,總容量幾乎達2GB。
    交換空間的使用
    一個已初始化的交換空間是使用命令swapon投入正式使用的。該命令告訴內核這個交換空間可以被使用了。到交換空間的路徑是作為參數給出的,所以,開始在一個臨時交換文件上使用交換的命令如下:
    $ swapon /extra-swap

    通過把交換空間列入/etc/fstab文件中就能被自動地使用了。
    /dev/hda8 none swap sw 0 0

    /swapfile none swap sw 0 0

    啟動描述文件會執行命令swapon –a,這個命令會啟動列於/etc/fstab中的所有交換空間。因此,swapon命令通常僅用於需要有外加的交換空間時。
    你可以用free命令監視交換空間的使用情況。它將給出已使用了多少的交換空間。
    total used free shared buffers
    Swap: 32452 6684 25768

    輸出的第一行(Mem:)顯示出物理內存的使用情況。總和(total)列中並沒有顯示出被內核使用的內存,它通常將近一兆位元組。已用列(used column)顯示出已用內存的總和(第二行沒有把緩沖算進來)。空閑列(free column)顯示了所有未被使用的空閑內存。共享列(shared column)顯示出了被幾個進程共享的內存的大小;共享的內存越多,情況就越好。緩存列(buffer column)顯示出了當前磁碟緩存的大小。已緩沖列(cached column)顯示出了已使用的緩存的大小。
    最後一行(Swap:)顯示出了與交換空間相應的信息。如果這一行的數值都是零,表示你的交換空間沒有被擊活。
    也可通過用top命令來獲得同樣的信息,或者使用proc文件系統中的文件/proc/meminfo 。通常要取得指定交換空間的使用情況是困難的。
    可以使用命令swapoff來移去一個交換空間。通常沒有必要這樣做,但臨時交換空間除外。一般,在交換空間中的頁面首先被換入內存;如果此時沒有足夠的物理內存來容納它們又將被交換出來(到其他的交換空間中)。如果沒有足夠的虛擬內存來容納所有這些頁面,Linux就會波動而不正常;但經過一段較長的時間Linux會恢復,但此時系統已不可用了。在移去一個交換空間之前,你應該檢查(例如,用free)是否有足夠的空閑內存。
    任何由swapon –a而自動被使用的所有交換空間都能夠用swapoff –a命令移去;該命令參考/etc/fstab文件來確定移去什麼。任何手工設置使用的交換空間將始終可以被使用。
    有時,盡管有許多的空閑內存,仍然會有許多的交換空間正被使用。這是有可能發生的,例如如果在某一時刻有進行交換的必要,但後來一個佔用很多物理內存的大進程結束並釋放內存時。被交換出的數據並不會自動地交換進內存,除非有這個需要時。此時物理內存會在一段時間內保持空閑狀態。對此並沒有什麼可擔心的,但是知道了是怎麼一回事我們也就放心了。
    許多操作系統使用了虛擬內存的方法。因為它們僅在運行時才需要交換空間,以即決不會在同一時間使用交換空間,因此,除了當前正在運行的操作系統的交換空間,其它的就是一種浪費。所以讓它們共享一個交換空間將會更有效率。這是可能的,但需要有一定的了解。在HOWTO技巧文檔中含有如何實現這種做法的一些建議。
    有些人會對你說需要用物理內存的兩倍容量來分配交換空間,但這是不對的。下面是合適的做法:
    。估計你的總內存需求。這是某一時刻你所需要的最大的內存容量,也就是在同一時刻你想運行的所有程序所需內存的總和。通過同時運行所有的程序你可以做到這一點。
    例如,如果你要運行X,你將給它分配大約8MB內存,gcc需要幾兆位元組(有些文件要求異呼尋常的大量的內存量,多至幾十兆位元組,但通常約4兆位元組應該夠了),等等。內核本身要用大約1兆位元組、普通的shell以及其它一些工具可能需要幾百千位元組(就說總和要1兆位元組吧)。並不需要進行精確的計算,粗率的估計也就足夠了,但你必須考慮到最壞的情況。
    注意,如果會有幾個人同時使用這個系統,他們都將消耗內存。然而,如果兩個人同時運行一個程序,內存消耗的總量並不是翻倍,因為代碼頁以及共享的庫只存在一份。
    Free以及ps命令對估計所需的內存容量是很有幫助的。
    對第一步中的估計放寬一些。這是因為對程序在內存中佔用多少的估計通常是不準的,因為你很可能忘掉幾個你要運行的程序,以及,確信你還要有一些多餘的空間用於以防萬一。這需幾兆位元組就夠了。(多分配總比少分配交換空間要好,但並不需要過分這樣以至於使用整個硬碟,因為不用的交換空間是浪費的空間;參見後面的有關增加交換空間。)同樣,因為處理數值更好做,你可以將容量值加大到整數兆位元組。
    基於上面的計算,你就知道了你將需要總和為多少的內存。所以,為了分配交換空間,你僅需從所需總內存量中減去實際物理內存的容量,你就知道了你需要多少的交換空間。(在某些UNIX版本中,你還需要為物理內存的映像分配空間,所以第二步中算出的總量正是你所需要的交換空間的容量,而無需再做上述中的減法運算了。)
    如果你計算出的交換空間容量遠遠大於你的物理內存(大於兩倍以上),你通常需要再買些內存來,否則的話,系統的性能將非常低。
    有幾個交換空間是個好主意,即使計算指出你一個都不需要。Linux系統常常動不動就使用交換空間,以保持盡可能多的空閑物理內存。即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間:當磁碟閑著,就可以提前做好交換。
    可以將交換空間分散在幾個硬碟之上。針對相關磁碟的速度以及對磁碟的訪問模式,這樣做可以提高性能。你可能想實驗幾個方案,但是你要認識到這些實驗常常是非常困難的。不要相信其中一個方案比另一個好的說法,因為並不總是這樣的。

    高速緩沖
    與訪問(真正的)的內存相比,磁碟[3]的讀寫是很慢的。另外,在相應較短的時間內多次讀磁碟同樣的部分也是常有的事。例如,某人也許首先閱讀了一段e-mail消息,然後為了答復又將這段消息讀入編輯器中,然後又在將這個消息拷貝到文件夾中時,使得郵件程序又一次讀入它。或者考慮一下在一個有著許多用戶的系統中ls命令會被使用多少次。通過將信息從磁碟上僅讀入一次並將其存於內存中,除了第一次讀以外,可以加快所有其它讀的速度。這叫作磁碟緩沖(disk buffering),被用作此目的的內存稱為高速緩沖(buffer cache)。
    不幸的是,由於內存是一種有限而又不充足的資源,高速緩沖不可能做的很大(它不可能包容要用到的所有數據)。當緩沖充滿了數據時,其中最長時間不用的數據將被舍棄以騰出內存空間用於新的數據。
    對寫磁碟操作來說磁碟緩沖技術同樣有效。一方面,被寫入磁碟的數據常常會很快地又被讀出(例如,原代碼文件被保存到一個文件中,又被編譯器讀入),所以將要被寫的數據放入緩沖中是個好主意。另一方面,通過將數據放入緩沖中,而不是將其立刻寫入磁碟,程序可以加快運行的速度。以後,寫的操作可以在後台完成,而不會拖延程序的執行。
    大多數操作系統都有高速緩沖(盡管可能稱呼不同),但是並不是都遵守上面的原理。有些是直接寫(write-through):數據將被立刻寫入磁碟(當然,數據也被放入緩存中)。如果寫操作是在以後做的,那麼該緩存被稱為後台寫(write-back)。後台寫比直接寫更有效,但也容易出錯:如果機器崩潰,或者突然掉電,或者是軟盤在緩沖中等待寫的數據被寫入軟盤之前被從驅動器中取走,緩沖中改變過的數據就被丟失了。如果仍未被寫入的數據含有重要的薄記信息,這甚至可能意味著文件系統(如果有的話)已不完整。
    由於上述原因,在使用適當的關閉過程之前,絕對不要關掉電源(見第六章),不要在卸載(如果已被載入)之前將軟盤從驅動器中取出來,也不要在任何正在使用軟盤的程序指示出完成了軟盤操作並且軟盤燈熄滅之前將軟盤取出來。sync命令傾空(flushes)緩沖,也即,強迫所有未被寫的數據寫入磁碟,可用以確定所有的寫操作都已完成。在傳統的UNIX系統中,有一個叫做update的程序運行於後台,每隔30秒做一次sync操作,因此通常無需手工使用sync命令了。Linux另外有一個後台程序,bdflush,這個程序執行更頻繁的但不是全面的同步操作,以避免有時sync的大量磁碟I/O操作所帶來的磁碟的突然凍結。
    在Linux中,bdflush是由update啟動的。通常沒有理由來擔心此事,但如果由於某些原因bdflush進程死掉了,內核會對此作出警告,此時你就要手工地啟動它了(/sbin/update)。
    緩存(cache)實際並不是緩沖文件的,而是緩沖塊的,塊是磁碟I/O操作的最小單元(在Linux中,它們通常是1KB)。這樣,目錄、超級塊、其它文件系統的薄記數據以及非文件系統的磁碟數據都可以被緩沖了。
    緩沖的效力主要是由它的大小決定的。緩沖大小太小的話等於沒用:它只能容納一點數據,因此在被重用時,所有緩沖的數據都將被傾空。實際的大小依賴於數據讀寫的頻次、相同數據被訪問的頻率。只有用實驗的方法才能知道。
    如果緩存有固定的大小,那麼緩存太大了也不好,因為這會使得空閑的內存太小而導致進行交換操作(這同樣是慢的)。為了最有效地使用實際內存,Linux自動地使用所有空閑的內存作為高速緩沖,當程序需要更多的內存時,它也會自動地減小緩沖的大小。
    在Linux中,你不需要為使用緩沖做任何事情,它是完全自動處理的。除了上面所提到的有關按照適當的步驟來關機和取出軟盤,你不用擔心它。

    『肆』 Linux 的虛擬內存管理有幾個關鍵概念

    Linux 的虛擬內存管理有幾個關鍵概念:
    1、每個進程都有獨立的虛擬地址版空間,進程訪問權的虛擬地址並不是真正的物理地址;
    2、虛擬地址可通過每個進程上的頁表(在每個進程的內核虛擬地址空間)與物理地址進行映射,獲得真正物理地址;
    3、如果虛擬地址對應物理地址不在物理內存中,則產生缺頁中斷,真正分配物理地址,同時更新進程的頁表;如果此時物理內存已耗盡,則根據內存替換演算法淘汰部分頁面至物理磁碟中。

    『伍』 介紹Linux內核的書求推薦

    第一:《Linux內核設計與實現》
    簡稱LKD,從入門開始,介紹了諸如進程管理、系統調用、中斷和中斷處理程序、內核同步、時間管理、內存管理、地址空間、調試技術等方面,內容比較淺顯易懂,個人認為是內核新人首先必讀的書籍。新人得有此書,足矣!
    第二:《深入理解Linux內核》
    簡稱ULK,相比於LKD的內容不夠深入、覆蓋面不廣,ULK要深入全面得多。
    前面這兩本,一本提綱挈領,一本全面深入。
    第三:《Linux設備驅動程序》
    簡稱LDD,驅動開發者都要人手一本了。
    第四:《深入理解Linux虛擬內存管理》
    簡稱LVMM,是一本介紹Linux虛擬內存管理機制的書。如果你希望深入的研究Linux的內存管理子系統,仔細的研讀這本書無疑是最好的選擇。
    第五:《深入理解LINUX網路內幕》
    一本講解網路子系統實現的書,通過這本書,我們可以了解到Linux內核是如何實現復雜的網路功能的。
    了解更多開源相關,去LUPA社區看看吧。

    『陸』 LINUX系統的內存管理知識詳解

    內存是Linux內核所管理的最重要的資源之一。內存管理系統是操作系統中最為重要的部分,因為系統的物理內存總是少於系統所需要的內存數量。虛擬內存就是為了克服這個矛盾而採用的策略。系統的虛擬內存通過在各個進程之間共享內存而使系統看起來有多於實際內存的內存容量。Linux支持虛擬內存, 就是使用磁碟作為RAM的擴展,使可用內存相應地有效擴大。核心把當前不用的內存塊存到硬碟,騰出內存給其他目的。當原來的內容又要使用時,再讀回內存。以下就是我為大家整理到的詳細LINUX系統內存管理的知識,歡迎大家閱讀!!!

    LINUX系統教程:內存管理的知識詳解

    一、內存使用情況監測

    (1)實時監控內存使用情況

    在命令行使用「Free」命令可以監控內存使用情況

    代碼如下:

    #free

    total used free shared buffers cached

    Mem: 256024 192284 63740 0 10676 101004

    -/+ buffers/cache: 80604 175420

    Swap: 522072 0 522072

    上面給出了一個256兆的RAM和512兆交換空間的系統情況。第三行輸出(Mem:)顯示物理內存。total列不顯示核心使用的物理內存(通常大約1MB)。used列顯示被使用的內存總額(第二行不計緩沖)。 free列顯示全部沒使用的內存。Shared列顯示多個進程共享的內存總額。Buffers列顯示磁碟緩存的當前大小。第五行(Swap:)對對換空間,顯示的信息類似上面。如果這行為羨芹全0,那麼沒使用對換空間。在預設的狀態下,free命令以千位元組(也就是1024位元組為單位)來顯示內存使用情況。可以使用—h參數以位元組為單位顯示內存使用情況,或者可以兄晌使用—m參數以兆位元組為單位顯示內存使用情況。還可以通過—s參數使用命令來不間斷地監視內存使用情況:

    #free –b –s2

    這個命令將會在終端窗口中連續不斷地報告內存的使用情況,每2秒鍾更新一次。

    (2)組合watch與 free命令用來實時監控內存使用情況:

    代碼如下:

    #watch -n 2 -d free

    Every 2.0s: free Fri Jul 6 06:06:12 2007

    total used free shared buffers cached

    Mem: 233356 218616 14740 0 5560 64784

    -/+ buffers/cache: 148272 85084

    Swap: 622584 6656 615928

    watch命令會每兩秒執行 free一次,執行前會清除屏幕,在同樣位置顯示數據。因為 watch命令不會卷動屏幕,所以適合出長時間的監測內存使用率。可以使用 -n選項,控制執行的頻率;也可以利用 -d選項,讓命令將每次不同的地方顯示出來。Watch命令會一直執行,直到您按下 [Ctrl]-[C] 為止。

    二、虛擬內存的概念

    (1)Linux虛擬內存實現機制

    Linux虛擬內存的實現需要六種機制的支持:地址映射機制、內存分配回收機制、緩存和刷新機制、請求頁機制、交換機制、內存共享機制。

    首先內存管理程序通過映射機制把用戶程序的邏輯地址映射到物理地址,在用戶程序運行時如果發現程序中要用的虛地址沒有對應的物理內存時,就發出了請求頁要求;如果有空閑的內存可供分配,就請求分配內存(於是用到了內存的分配和回收),並把正在使用的物理頁記錄在緩存中(使用了緩存機制)。 如果沒有足夠的內存可供分配,那麼就調用交換機制,騰出一部分內存。另外在地址映射中要通過TLB(翻譯後援存儲器)來尋找物理頁;交換機制中也要羨派鋒用到交換緩存,並且把物理頁內容交換到交換文件中後也要修改頁表來映射文件地址。

    (2)虛擬內存容量設定

    也許有人告訴你,應該分配2倍於物理內存的虛擬內存,但這是個不固定的規律。如果你的物理保存比較小,可以這樣設定。如果你有1G物理內存或更多的話,可以縮小一下虛擬內存。Linux會把大量的內存用做Cache的,但在資源緊張時回收回.。你只要看到swap為0或者很小就可以放心了,因為內存放著不用才是最大的浪費。

    三、使甩vmstat命令監視虛擬內存使用情況

    vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監視。它是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。通常使用vmstat 5 5(表示在5秒時間內進行5次采樣)命令測試。將得到一個數據匯總它可以反映真正的系統情況。

    代碼如下:

    #vmstat 5 5

    procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

    r b swpd free buff cache si so bi bo in cs us sy id wa

    1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2

    0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0

    0 0 62792 3400 9132 88092 0 0 0 14 877 424 4 15 81 0

    1 0 62792 3400 9140 88092 0 0 0 14 868 418 6 20 74 0

    1 0 62792 3400 9148 88092 0 0 0 15 847 400 9 25 67 0

    vmstat命令輸出分成六個部分:

    (1)進程procs:

    r:在運行隊列中等待的進程數 。

    b:在等待io的進程數 。

    (2)內存memoy:

    swpd:現時可用的交換內存(單位KB)。

    free:空閑的內存(單位KB)。

    buff: 緩沖去中的內存數(單位:KB)。

    cache:被用來做為高速緩存的內存數(單位:KB)。

    (3) swap交換頁面

    si: 從磁碟交換到內存的交換頁數量,單位:KB/秒。

    so: 從內存交換到磁碟的交換頁數量,單位:KB/秒。

    (4) io塊設備:

    bi: 發送到塊設備的塊數,單位:塊/秒。

    bo: 從塊設備接收到的塊數,單位:塊/秒。

    (5)system系統:

    in: 每秒的中斷數,包括時鍾中斷。

    cs: 每秒的環境(上下文)切換次數。

    (6)cpu中央處理器:

    cs:用戶進程使用的時間 。以百分比表示。

    sy:系統進程使用的時間。 以百分比表示。

    id:中央處理器的空閑時間 。以百分比表示。

    如果 r經常大於 4 ,且id經常小於40,表示中央處理器的負荷很重。 如果bi,bo 長期不等於0,表示物理內存容量太小。

    四、Linux 伺服器的內存泄露和回收內存的方法

    1、內存泄漏的定義:

    一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完後必須顯示釋放的內存。應用程序一般使用malloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。

    2、內存泄露的危害

    從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的`是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到。存在內存泄漏問題的程序除了會佔用更多的內存外,還會使程序的性能急劇下降。對於伺服器而言,如果出現這種情況,即使系統不崩潰,也會嚴重影響使用。

    3、內存泄露的檢測和回收

    對於內存溢出之類的麻煩可能大家在編寫指針比較多的復雜的程序的時候就會遇到。在 Linux 或者 unix 下,C、C++語言是最使用工具。但是我們的 C++ 程序缺乏相應的手段來檢測內存信息,而只能使用 top 指令觀察進程的動態內存總額。而且程序退出時,我們無法獲知任何內存泄漏信息。

    使用kill命令

    使用Linux命令回收內存,我們可以使用Ps、Kill兩個命令檢測內存使用情況和進行回收。在使用超級用戶許可權時使用命令「Ps」,它會列出所有正在運行的程序名稱,和對應的進程號(PID)。Kill命令的工作原理是:向Linux操作系統的內核送出一個系統操作信號和程序的進程號(PID)。

    應用例子:

    為了高效率回收內存可以使用命令ps 參數v:

    代碼如下:

    [root@www ~]# ps v

    PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND

    2542 tty1 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty1

    2543 tty2 Ss+ 0:00 0 8 1631 428 0.1 /sbin/mingetty tty2

    2547 tty3 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty3

    2548 tty4 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty4

    2574 tty5 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty5

    2587 tty6 Ss+ 0:00 0 8 1627 424 0.1 /sbin/mingetty tty6

    2657 tty7 Ss+ 1:18 12 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a

    2670 pts/2 Ss 0:01 2 682 6213 1496 0.6 -bash

    3008 pts/4 Ss 0:00 2 682 6221 1472 0.6 /bin/bash

    3029 pts/4 S+ 0:00 2 32 1783 548 0.2 ping 192.168.1.12

    3030 pts/2 R+ 0:00 2 73 5134 768 0.3 ps v

    然後如果想回收Ping命令的內存的話,使用命令:

    代碼如下:

    # Kill -9 3029

    使用工具軟體

    Memprof是一個非常具有吸引力且非常易於使用的軟體,它由Red Hat的Owen Talyor創立。這個工具是用於GNOME前端的Boehm-Demers-Weiser垃圾回收器。這個工具直接就可以執行,並且其工作起來無需對源代碼進行任何修改。在程序執行時,這個工具會以圖形化的方式顯示內存的使用情況。

    相關介紹:Linux

    嚴格來講,Linux這個詞本身只表示Linux內核,但人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU 工程各種工具和資料庫的操作系統。

    Linux擁有以下特性:類似於Unix的基本思想,支持完全免費與自由傳播,完全兼容POSIX1.0標准,支持多用戶、多任務、有著良好的界面、支持多種平台。Linux 能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。

    Linux有著許多不同的版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。

    『柒』 Linux內存機制(swap)

    我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。

    物理內存就是系統硬體提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。

    作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。

    Linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。

    要深入了解linux內存運行機制,需要知道下面提到的幾個方面:

    Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。

    Linux 進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「演算法,僅僅將一些不經常使用的頁面文件交換到虛擬 內存,有時我們會看到這么一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的進程運行時,需 要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被交換出去的頁面 文件並不會自動的交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關於這點,不 用擔心什麼,只要知道是怎麼一回事就可以了。

    交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁 面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖 然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。

    因此,合理規劃和設計Linux內存的使用,是非常重要的.

    在Linux 操作系統中,當應用程序需要讀取文件中的數據時,操作系統先分配一些內存,將數據從磁碟讀入到這些內存中,然後再將數據分發給應用程序;當需要往文件中寫 數據時,操作系統先分配內存接收用戶數據,然後再將數據從內存寫到磁碟上。然而,如果有大量數據需要從磁碟讀取到內存或者由內存寫入磁碟時,系統的讀寫性 能就變得非常低下,因為無論是從磁碟讀數據,還是寫數據到磁碟,都是一個很消耗時間和資源的過程,在這種情況下,Linux引入了buffers和 cached機制。

    buffers與cached都是內存操作,用來保存系統曾經打開過的文件以及文件屬性信息,這樣當操作系統需要讀取某些文件時,會首先在buffers 與cached內存區查找,如果找到,直接讀出傳送給應用程序,如果沒有找到需要數據,才從磁碟讀取,這就是操作系統的緩存機制,通過緩存,大大提高了操 作系統的性能。但buffers與cached緩沖的內容卻是不同的。

    buffers是用來緩沖塊設備做的,它只記錄文件系統的元數據(metadata)以及 tracking in-flight pages,而cached是用來給文件做緩沖。更通俗一點說:buffers主要用來存放目錄裡面有什麼內容,文件的屬性以及許可權等等。而cached直接用來記憶我們打開過的文件和程序。

    為了驗證我們的結論是否正確,可以通過vi打開一個非常大的文件,看看cached的變化,然後再次vi這個文件,感覺一下兩次打開的速度有何異同,是不是第二次打開的速度明顯快於第一次呢?接著執行下面的命令:

    find / -name .conf 看看buffers的值是否變化,然後重復執行find命令,看看兩次顯示速度有何不同。

    上面這個60代表物理內存在使用40%的時候才會使用swap(參考網路資料:當剩餘物理內存低於40%(40=100-60)時,開始使用交換空間) swappiness=0的時候表示最大限度使用物理內存,然後才是 swap空間,swappiness=100的時候表示積極的使用swap分區,並且把內存上的數據及時的搬運到swap空間裡面。

    值越大表示越傾向於使用swap。可以設為0,這樣做並不會禁止對swap的使用,只是最大限度地降低了使用swap的可能性。

    通常情況下:swap分區設置建議是內存的兩倍 (內存小於等於4G時),如果內存大於4G,swap只要比內存大就行。另外盡量的將swappiness調低,這樣系統的性能會更好。

    B. 修改swappiness參數

    永久性修改:

    立即生效,重啟也可以生效。

    一般系統是不會自動釋放內存的 關鍵的配置文件/proc/sys/vm/drop_caches。這個文件中記錄了緩存釋放的參數,默認值為0,也就是不釋放緩存。他的值可以為0~3之間的任意數字,代表著不同的含義:

    0 – 不釋放 1 – 釋放頁緩存 2 – 釋放dentries和inodes 3 – 釋放所有緩存

    前提:首先要保證內存剩餘要大於等於swap使用量,否則會宕機!根據內存機制,swap分區一旦釋放,所有存放在swap分區的文件都會轉存到物理內存上。通常通過重新掛載swap分區完成釋放swap。
    a.查看當前swap分區掛載在哪?b.關停這個分區 c.查看狀態:d.查看swap分區是否關停,最下面一行顯示全 e.將swap掛載到/dev/sda5上 f.查看掛載是否成功

    『捌』 Linux 內核的內存管理 - 概念

    Concepts overview — The Linux Kernel documentation

    Linux中的內存管理是一個復雜的系統,經過多年的發展,它包含越來越多的功能,以支持從 MMU-less microcontrollers 到 supercomputers 的各種系統。
    沒有MMU內存管理的系統被稱為 nommu ,它值得寫一份專門的文檔進行描述。
    盡管有些概念是相同的,這里我們假設MMU可用,CPU可以將虛擬地址轉換為物理地址。

    計算機系統中的物理內存是有限資源,即便支持內存熱插拔,其可以安裝的內存也有限的。物理內存不一定必須是連續的;它可以作為一組不同的地址范圍被訪問。此外,不同的CPU架構,甚至同架構的不同實現對如何定義這些地址范圍都是不同的。

    這使得直接處理物理內存異常復雜,為了避免這種復雜性,開發了 虛擬內存 (virtual memory) 的概念。

    虛擬內存從應用軟體中抽象出物理內存的細節,只允許在物理內存中保留需要的信息 (demand paging) ,並提供一種機制來保護和控制進程之間的數據共享。

    通過虛擬內存,每次內存訪問都訪問一個 虛擬地址 。當CPU對從系統內存讀取(或寫入)的指令進行解碼時,它將該指令中編碼的虛擬地址轉換為內存控制器可以理解的物理地址。

    物理內存被切分為 頁幀 page frames 頁 pages 。頁的大小是基於架構的。一些架構允許從幾個支持的值中選擇頁大小;此選擇在內核編譯時設置到內核配置。

    每個物理內存頁都可以映射為一個或多個 虛擬頁(virtual pages) 。映射關系描述在 頁表(page tables) 中,頁表將程序使用的虛擬地址轉換為物理內存地址。頁表以層次結構組織。

    最底層的表包含軟體使用的實際內存頁的物理地址。較高層的表包含較低層表頁的物理地址。頂層表的指針駐留在寄存器中。
    當CPU進行地址轉換的時候,它使用寄存器訪問頂級頁表。

    虛擬地址的高位,用於頂級頁表的條目索引。然後,通過該條目訪問下級,下級的虛擬地址位又作為其下下級頁表的索引。虛擬地址的最低位定義實際頁內的偏移量。

    地址轉換需要多次內存訪問,而內存訪問相對於CPU速度來說比較慢。為了避免在地址轉換上花費寶貴的處理器周期,CPU維護著一個稱為 TLB (Translation Lookaside Buffer)的用於地址轉換緩存(cache)。通常TLB是非常稀缺的資源,需要大內存工作應用程序會因為TLB未命中而影響性能。

    很多現代CPU架構允許頁表的高層直接映射到內存頁。例如,x86架構,可以通過二級、三級頁表的條目映射2M甚至1G內存頁。在Linux中,這些內存頁稱為 大頁 (Huge) 。大頁的使用顯著降低了TLB的壓力,提高了TLB命中率,從而提高了系統的整體性能。

    Linux提供兩種機制開啟使用大頁映射物理內存。

    第一個是 HugeTLB 文件系統,即 hugetlbfs 。它是一個偽文件系統,使用RAM作為其存儲。在此文件系統中創建的文件,數據駐留在內存中,並使用大頁進行映射。
    關於 HugeTLB Pages

    另一個被稱為 THP (Transparent HugePages) ,後出的開啟大頁映射物理內存的機制。
    hugetlbfs 不同,hugetlbfs要求用戶和/或系統管理員配置系統內存的哪些部分應該並可以被大頁映射;THP透明地管理這些映射並獲取名稱。
    關於 Transparent Hugepage Support

    通常,硬體對不同物理內存范圍的訪問方式有所限制。某些情況下,設備不能對所有可定址內存執行DMA。在其他情況下,物理內存的大小超過虛擬內存的最大可定址大小,需要採取特殊措施來訪問部分內存。還有些情況,物理內存的尺寸超過了虛擬內存的最大可定址尺寸,需要採取特殊措施來訪問部分內存。

    Linux根據內存頁的使用情況,將其組合為多個 zones 。比如, ZONE_DMA 包含設備用於DMA的內存, ZONE_HIGHMEM 包含未永久映射到內核地址空間的內存, ZONE_NORMAL 包含正常定址內存頁。
    內存zones的實際層次架構取決於硬體,因為並非所有架構都定義了所有的zones,不同平台對DMA的要求也不同。

    多處理器機器很多基於 NUMA (Non-Uniform Memory Access system - 非統一內存訪問系統 )架構。 在這樣的系統中,根據與處理器的「距離」,內存被安排成具有不同訪問延遲的 banks 。每個 bank 被稱為一個 node ,Linux為每個 node 構造一個獨立的內存管理子系統。 Node 有自己的zones集合、free&used頁面列表,以及各種統計計數器。
    What is NUMA?
    NUMA Memory Policy

    物理內存易失,將數據放入內存的常見情況是讀取文件。讀取文件時,數據會放入 頁面緩存(page cache) ,可以在再次讀取時避免耗時的磁碟訪問。同樣,寫文件時,數據也會被放入 頁面緩存 ,並最終進入存儲設備。被寫入的頁被標記為 臟頁(dirty page) ,當Linux決定將其重用時,它會將更新的數據同步到設備上的文件。

    匿名內存 anonymous memory 匿名映射 anonymous mappings 表示沒有後置文件系統的內存。這些映射是為程序的stack和heap隱式創建的,或調用mmap(2)顯式創建的。通常,匿名映射只定義允許程序訪問的虛擬內存區域。讀,會創建一個頁表條目,該條目引用一個填充有零的特殊物理頁。寫,則分配一個常規物理頁來保存寫入數據。該頁將被標記為臟頁,如果內核決定重用該頁,則臟頁將被交換出去 swapped out

    縱貫整個系統生命周期,物理頁可用於存儲不同類型的數據。它可以是內核內部數據結構、設備驅動DMA緩沖區、讀取自文件系統的數據、用戶空間進程分配的內存等。
    根據內存頁使用情況,Linux內存管理會區別處理。可以隨時釋放的頁面稱為 可回收(reclaimable) 頁面,因為它們把數據緩存到了其他地方(比如,硬碟),或者被swap out到硬碟上。
    可回收頁最值得注意的是 頁面緩存 匿名頁面

    在大多數情況下,存放內部內核數據的頁,和用作DMA緩沖區的頁無法重用,它們將保持現狀直到用戶釋放。這樣的被稱為 不可回收頁(unreclaimable)
    然而,在特定情況下,即便是內核數據結構佔用的頁面也會被回收。
    例如,文件系統元數據的緩存(in-memory)可以從存儲設備中重新讀取,因此,當系統存在內存壓力時,可以從主內存中丟棄它們。

    釋放可回收物理內存頁並重新調整其用途的過程稱為 (surprise!) reclaim
    Linux支持非同步或同步回收頁,取決於系統的狀態。
    當系統負載不高時,大部分內存是空閑的,可以立即從空閑頁得到分配。
    當系統負載提升後,空閑頁減少,當達到某個閾值( low watermark )時,內存分配請求將喚醒 kswapd 守護進程。它將以非同步的方式掃描內存頁。如果內存頁中的數據在其他地方也有,則釋放這些內存頁;或者退出內存到後置存儲設備(關聯 臟頁 )。

    隨著內存使用量進一步增加,並達到另一個閾值- min watermark -將觸發回收。這種情況下,分配將暫停,直到回收到足夠的內存頁。

    當系統運行時,任務分配並釋放內存,內存變得碎片化。
    雖然使用虛擬內存可以將分散的物理頁表示為虛擬連續范圍,但有時需要分配大的連續的物理內存。這種需求可能會提升。例如,當設備驅動需要一個大的DMA緩沖區時,或當THP分配一個大頁時。
    內存地址壓縮(compaction ) 解決了碎片問題。
    該機制將佔用的頁從內存zone的下部移動到上部的空閑頁。壓縮掃描完成後,zone開始處的空閑頁就並在一起了,分配較大的連續物理內存就可行了。

    reclaim 類似, compaction 可以在 kcompactd守護進程中非同步進行,也可以作為內存分配請求的結果同步進行。

    在存在負載的機器上,內存可能會耗盡,內核無法回收到足夠的內存以繼續運行。
    為了保障系統的其餘部分,引入了 OOM killer

    OOM killer 選擇犧牲一個任務來保障系統的總體健康。選定的任務被killed,以期望在它退出後釋放足夠的內存以繼續正常的操作。

    『玖』 Linux的內存管理機制是什麼樣的

    物理內存和虛擬內存
    我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。

    物理內存就是系統硬體提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。
    作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。
    linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。
    要深入了解linux內存運行機制,需要知道下面提到的幾個方面:
    首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。
    其次,linux進行頁面交換是有
    條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「演算法,僅僅將一些不經常使用的頁面文件交換到虛擬內存,有時我們會
    看到這么一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的進程運行時,需要耗費很多內存資
    源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被交換出去的頁面文件並不會自動的
    交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關於這點,不用擔心什麼,只要
    知道是怎麼一回事就可以了。
    最後,交換空間的頁面在使用時會首
    先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最
    終會導致linux出現假死機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。
    因此,合理規劃和設計linux內存的使用,是非常重要的.
    內存的監控
    作為一名linux系統管理員,監控內存的使用狀態是非常重要的,通過監控有助於了解內存的使用狀態,比如內存佔用是否正常,內存是否緊缺等等,監控內存最常使用的命令有free、top等,下面是某個系統free的輸出:
    [haixigov@WEBServer ~]$ free
    total used free shared buffers cached
    Mem: 16402432 16360492 41940 0 465404 12714880
    -/+ buffers/cache: 3180208 13222224
    Swap: 8193108 264 8192844

    我們解釋下輸出結果中每個選項的含義:
    首先是第一行:
     total:物理內存的總大小。
     used:已經使用的物理內存多小。
     free:空閑的物理內存值。
     shared:多個進程共享的內存值。
     buffers/cached:磁碟緩存的大小。
    第二行Mem:代表物理內存使用情況。
    第三行(-/+ buffers/cached):代表磁碟緩存使用狀態。
    第四行:Swap表示交換空間內存使用狀態。
    free命令輸出的內存狀態,可以通過兩個角度來查看:一個是從內核的角度來看,一個是從應用層的角度來看的。

    從內核的角度來查看內存的狀態
    就是內核目前可以直接分配到,不需要額外的操作,即為上面free命令輸出中第二行Mem項的值,可以看出,此系統物理內存有16G,空閑的內存只有41940K,也就是40M多一點,我們來做一個這樣的計算:
    16402432-16360492=41940

    其實就是總的物理內存減去已經使用的物理內存得到的就是空閑的物理內存大小,注意這里的可用內存值41940並不包含處於buffers和cached狀態的內存大小。

    如果你認為這個系統空閑內存太小,那你就錯了,實際上,內核完全控制著內存的使用情況,linux會在需要內存的時候,或在系統運行逐步推進時,將buffers和cached狀態的內存變為free狀態的內存,以供系統使用。

    從應用層的角度來看系統內存的使用狀態
    也就是linux上運行的應用程序可以使用的內存大小,即free命令第三行「(-/+ buffers/cached)」的輸出,可以看到,此系統已經使用的內存才3180208K,而空閑的內存達到13222224K,繼續做這樣一個計算:
    41940+(465404+12714880)=13222224

    過這個等式可知,應用程序可用的物理內存值是Mem項的free值加上buffers和cached值之和,也就是說,這個free值是包括
    buffers和cached項大小的,對於應用程序來說,buffers/cached佔有的內存是可用的,因為buffers/cached是為了提
    高文件讀取的性能,當應用程序需要用到內存的時候,buffers/cached會很快地被回收,以供應用程序使用。

    buffers與cached的異同

    Linux
    操作系統中,當應用程序需要讀取文件中的數據時,操作系統先分配一些內存,將數據從磁碟讀入到這些內存中,然後再將數據分發給應用程序;當需要往文件中寫
    數據時,操作系統先分配內存接收用戶數據,然後再將數據從內存寫到磁碟上。然而,如果有大量數據需要從磁碟讀取到內存或者由內存寫入磁碟時,系統的讀寫性
    能就變得非常低下,因為無論是從磁碟讀數據,還是寫數據到磁碟,都是一個很消耗時間和資源的過程,在這種情況下,linux引入了buffers和
    cached機制。

    buffers與cached都是內存操作,用來保存系統曾經打開過的文件以及文件屬性信息,這樣當操作系統需要讀取
    某些文件時,會首先在buffers與cached內存區查找,如果找到,直接讀出傳送給應用程序,如果沒有找到需要數據,才從磁碟讀取,這就是操作系統
    的緩存機制,通過緩存,大大提高了操作系統的性能。但buffers與cached緩沖的內容卻是不同的。

    buffers是用來緩沖塊設
    備做的,它只記錄文件系統的元數據(metadata)以及 tracking in-flight
    pages,而cached是用來給文件做緩沖。更通俗一點說:buffers主要用來存放目錄裡面有什麼內容,文件的屬性以及許可權等等。而cached
    直接用來記憶我們打開過的文件和程序。

    為了驗證我們的結論是否正確,可以通過vi打開一個非常大的文件,看看cached的變化,然後再次vi這個文件,感覺一下兩次打開的速度有何異同,是不是第二次打開的速度明顯快於第一次呢?
    接著執行下面的命令:
    find /* -name *.conf
    看看buffers的值是否變化,然後重復執行find命令,看看兩次顯示速度有何不同。
    Linux操作系統的內存運行原理,很大程度上是根據伺服器的需求來設計的,例如系統的緩沖機制會把經常使用到的文件和數據緩存在cached
    中,linux總是在力求緩存更多的數據和信息,這樣再次需要這些數據時可以直接從內存中取,而不需要有一個漫長的磁碟操作,這種設計思路提高了系統的整
    體性能。
    交換空間swap的使用
    雖然現在的內存已經變得非常廉價,但是swap仍然有很大的使用價值,合理的規劃和使用swap分區,對系統穩定運行至關重要。Linux下可以使用文件系統中的一個常規文件或者一個獨立分區作為交換空間使用。同時linux允許使用多個交換分區或者交換文件。

    創建swap交換空間
    創建交換空間所需的交換文件是一個普通的文件,但是,創建交換文件與創建普通文件不同,必須通過dd命令來完成,同時這個文件必須位於本地硬碟上,不能在網路文件系統(NFS)上創建swap交換文件。例如:
    [root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536
    65536+0 records in
    65536+0 records out
    這樣就創建一個有連續空間的交換文件,大小為60M左右,關於dd命令做簡單的講述:
    if=輸入文件,或者設備名稱。
    of=輸出文件或者設備名稱。
    ibs=bytes 表示一次讀入bytes 個位元組(即一個塊大小為 bytes 個位元組)。
    obs=bytes 表示一次寫bytes 個位元組(即一個塊大小為 bytes 個位元組)。
    bs=bytes,同時設置讀寫塊的大小,以bytes為單位,此參數可代替 ibs 和 obs。
    count=blocks 僅拷貝blocks個塊。
    skip=blocks 表示從輸入文件開頭跳過 blocks 個塊後再開始復制。
    seek=blocks表示從輸出文件開頭跳過 blocks 個塊後再開始復制。(通常只有當輸出文件是磁碟或磁帶時才有效)
    這里的輸入設備/dev/zero代表一個輸出永遠為0的設備文件,使用它作輸入可以得到全為空的文件。
    激活和使用swap
    首先通過mkswap命令指定作為交換空間的設備或者文件:
    [root@localhost ~]#mkswap /data/swapfile
    Setting up swapspace version 1, size = 67104 kB
    [root@localhost backup]# free
    total used free shared buffers cached
    Mem: 2066632 1998188 68444 0 26160 1588044
    -/+ buffers/cache: 383984 1682648
    Swap: 4088500 101036 3987464
    從上面輸出可知,我們指定了一個67104 kB的交換空間,而此時新建的交換空間還未被使用,下面簡單介紹下mkswap命令,mkswap的一般使用格式為:
    mkswap [參數] [設備名稱或文件][交換區大小]
    參數:
    -c:建立交換區前,先檢查是否有損壞的區塊。
    -v0:建立舊式交換區,此為預設值。
    -v1:建立新式交換區。
    交換區大小:指定交換區的大小,單位為1024位元組。
    設置交換分區後,接著通過swapon命令激活swap:
    [root@localhost ~]#/usr/sbin/swapon /data/swapfile
    [root@localhost backup]# free
    total used free shared buffers cached
    Mem: 2066632 1997668 68964 0 27404 1588880
    -/+ buffers/cache: 381384 1685248
    Swap: 4154028 100976 4053052


    過free命令可以看出,swap大小已經由4088500k變為4154028k,相差的值是60M左右,剛好等於我們增加的一個交換文件大小,這說明
    新增的交換分區已經可以使用了,但是如果linux重啟,那麼新增的swap空間將變得不可用,因此需要在/etc/fstab中添加自動載入設置:
    /data/swapfile none swap sw 0 0
    如此以來,linux在重啟後就可以實現自動載入swap分區了。其實linux在啟動過程中會執行「swapon -a」命令,此命令會載入列在/etc/fstab中的所有交換空間。

    移除swap
    通過swapoff即可移除一個交換空間
    [root@localhost ~]#/usr/sbin/swapoff /data/swapfile
    其實也可以通過「swapoff -a」移除在/etc/fstab中定義的所有交換空間,這里的「swapoff -a」與上面提到的「swapon -a」對應。執行「swapoff -a」後,free命令輸出如下:
    [root@localhost backup]# free
    total used free shared buffers cached
    Mem: 2066632 2048724 17908 0 30352 1642748
    -/+ buffers/cache: 375624 1691008
    Swap: 0 0 0

    『拾』 linux 的虛擬內存是什麼怎麼用我可以把虛擬內存當內存用嗎

    虛擬內存可以理解為將磁碟中的一個大文件作為內存的擴充,如果內存不夠用,將不常使用的頁面換出到磁碟上,如果需要該頁面,再從磁碟中讀入到內存中
    實現了從2G內存到4G的擴充。不過這樣做的效率會很低,因為讀寫磁碟是非常慢的,系統如果使用虛擬內存會比較卡。

    閱讀全文

    與深入理解linux虛擬內存管理書評相關的資料

    熱點內容
    海霧結局沒看懂 瀏覽:562
    黃金店鋪app是干什麼用 瀏覽:674
    拍視頻刪除了怎麼還出現在文件 瀏覽:155
    最全的下載小說的論壇 瀏覽:410
    求個小說網站 瀏覽:19
    可緩沖視頻網站 瀏覽:606
    app拖動效果 瀏覽:2
    家裡面網路很差是什麼原因 瀏覽:714
    tsnme 瀏覽:605
    機器和數據科學哪個好 瀏覽:96
    有沒有那網址直接可以在線看片 瀏覽:350
    樓上偷窺樓下韓國電影 瀏覽:533
    海災難電影中國 瀏覽:395
    香港在線 瀏覽:499
    大數據採集平台設計 瀏覽:77
    韓國強奸經典三及電影有哪些 瀏覽:9
    優酷默認的文件在哪裡 瀏覽:556
    建立網站教程 瀏覽:946
    linux怎樣修改帶括弧的文件 瀏覽:408
    大尺度同性 瀏覽:150

    友情鏈接