內存管理-交換文件與ramdisk 虛擬內存是指使用磁盤當作物理內存的擴展,這樣可用的內存的大小就相應增大了。內核會將暫時不用的內存塊的內容寫到磁盤上,然後就可以把這塊內存用於其它目的。這些寫到磁盤上的內容或許會被淘汰,只有需要用到這些內容時,它們才會被重新讀入內存。這些操作對用戶來說是完全透明的;Linux下運行的程序只是看到有大量的內存可供使用而並沒有注意到這些內存是在哪裡的。當然,讀寫硬盤要比直接使用真實內存慢得多,所以程序就不會象一直在內存中運行的那樣快。用作虛擬內存的硬盤部分被稱為交換空間(swap space)。 Linux能夠使用文件系統中的一個常規文件或一個獨立的分區作為交換空間。交換分區要快一些,但是交換文件的大小很容易改變,而且無需重分區整個硬盤,當你知道你需要多大的交換空間時,你應該使用交換分區,但是如果你不能確定的話,你可以首先使用一個交換文件,然後使用一段時間,你就能得到你確實需要的交換空間的大小,然後,你就能夠創建一個合適大小交換分區。Linux允許同時使用幾個交換分區以及/或者交換文件,如果你只是偶爾地另外需要一個交換空間時,你可以在當時設置一個額外的交換文件,而不是重新分區來改變交換分區的大小。 現在介紹如何創建交換空間。一個交換文件是一個普通的文件,它的要求是它不能有空洞,並且它是用mkswap來准備的,所以它必須在本地硬盤上。如何創建一個交換文件呢?你可以用如下命令創建一個能用的交換文件: #dd if=/dev/zero of=/SwapFile bs=1024 count=2048 這樣就創建一個2048K字節的交換文件,由於內存頁面的大小是4K字節,所以count最好是4的倍數才能完全利用。而交換分區的創建和其他分區的創建是一樣的,只是類型不一樣而已。 創建完交換空間後,就需要用mkswap給交換空間加上一些必要的初始化信息: #mkswap /SwapFile 2048 此時交換空間還沒有被內核作為虛擬內存使用,它現在只是存在而已。使用mkswap的時候必須非常小心,因為它不檢查這個文件或分區是否已被別人使用,這樣就有可能覆蓋到重要的文件以及分區。 一個已初始化的交換空間必須使用命令swapon命令告訴內核這個交換空間可以被使用了。命令如下: #swapon /SwapFile 如果把相關信息寫入/etc/fstab就能啟動系統後自動使用交換空間了。 #swapon –a 這個命令會把所有列在fstab中的交換空間啟動起來。而 #swapoff 這個命令則會把swapon –a啟動的交換空間移走。 要看內存的使用情況,可以使用命令: #free 輸出的第一行(Mem:)顯示出物理內存的使用情況。總和(total)列中並沒有顯示出被內核使用的內存,它通常將近一兆字節。已用列(used column)顯示出已用內存的總和(第二行沒有把緩沖算進來)。空閒列(free column)顯示了所有未被使用的空閒內存。共享列(shared column)顯示出了被幾個進程共享的內存的大小;共享的內存越多,情況就越好。緩存列(buffer column)顯示出了當前磁盤緩存的大小。已緩沖列(cached column)顯示出了已使用的緩存的大小。 最後一行(Swap:)顯示出了與交換空間相應的信息。如果這一行的數值都是零,表示你的交換空間沒有被擊活。 這裡討論一下交換空間的大小問題:有些人會對你說需要用物理內存的兩倍容量來分配交換空間,這種方法是不符合實際的。合適的做法應該是: 估計你某一時刻你所需要的最大的內存容量,也就是在同一時刻你運行的所有程序所需內存的總和,你可以通過同時運行所有的程序做到這一點。 舉些實際的例子,運行X系統將需要分配大約8MB內存,gcc需要幾兆字節,內核本身要用大約1兆字節、普通的shell以及其它一些工具可能需要幾百千字節。粗略的估計一下就能得到個接近的數字,但你必須考慮到最壞的情況,例如有幾個人同時使用這個系統,他們都將消耗內存。Free以及ps命令對估計所需的內存容量是很有幫助的。基於上面的計算,你就知道了你將需要總和為多少的內存。所以,為了分配交換空間,你僅需從所需總內存量中減去實際物理內存的容量,你就知道了你需要多少的交換空間。如果你計算出的交換空間容量遠遠大於你的物理內存(大於兩倍以上),你通常需要再買些內存來,否則的話,系統的性能將非常低。 上面講的交換空間是把磁盤空間當內存使用,但是在有些場合,我們需要一個高速的磁盤空間,這個剛好和上面相反,我們可以用RamDisk把物理內存當磁盤使用,以實現這個需求。 使用ramdisk是一件很簡單的事。首先,需要你的內核支持RamDisk,然後你所需要做的就是格式化一個ramdisk並且把他掛接到一個目錄上。可以用: #ls -al /dev/ram* 列出所有可用的ramdisk。這些ramdisk並不搶奪內存,除非進行格式化的一類操作。這裡有一個使用ramdisk的例子: #mkdir /tmp/ramdisk #mke2fs /dev/ram0 #mount /dev/ram0 /tmp/ramdisk 這三個命令將為ramdisk創建一個目錄,創建ramdisk文件系統,並且加載這個ramdisk到/tmp/ramdisk.。現在你可以將這個目錄象使用其它的目錄一樣使用。 ramdisk的默認大小是 4Mb=4096 blocks. 在你進行mke2fs的時候你可以看到你的ramdisk的大小。執行df -k /dev/ram0 你實際用了多少空間: #df -k /dev/ram0 在系統重新啟動的時候,將刷新這個區域,所以不要將任何沒有拷貝的數據放在這個區域。如果你對這個目錄進行了修改,並且需要保留這些修改,采取一些辦法進行備份。 那麼如何改變 ramdisks 的大小呢?你可以在lilo.conf文件中加入這一行: ramdisk_size=10000,這樣在你使用lilo命令和重新啟動計算機之後,ramdisk的默認大小將會是10M。這是一個/etc/lilo.conf文件的例子: boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=10 image=/boot/vmlinuz label=linux root=/dev/hda1 read-only ramdisk_size=10000 當你以模塊的形式編譯ramdisk時,你可以在加載的時候決定ramdisk的大小。這也可以通過修改/etc/conf.modules 的選項設置來做到。 options rd rd_size=10000 ,或是在命令行中指定參數給ismod insmod rd rd_size=10000 以下是介紹如何使用這樣的模塊 1)卸載ramdisk, #umount /tmp/ramdisk 2)卸載模塊(再上一節所提到的過程中自動加載), #rmmod rd 3)加載ramdisk模塊並且把它的大校設為20M, #insmod rd rd_size=20000 4)創建一個文件系統, #mke2fs /dev/ram0 5)加載ramdisk, # mount /dev/ram0 /tmp/ramdisk 在實際應用中,我們可以把RamDisk掛接到web服務器的目錄,或者mail服務的目錄,以實現快速的反應。