看**的時候,從能看到通過mmap對映一段匿名記憶體,但是為什麼非要對映一段匿名記憶體呢,匿名記憶體到底是幹啥用的?對這個問題一直不解,今天google了很多資料,總結一下自己理解的內容。
1 匿名記憶體的定義
匿名記憶體是指那些在檔案系統裡沒有相對應的」儲備檔案「的那些記憶體,堆和棧空間的記憶體都屬於匿名記憶體。
2 匿名記憶體的用途
匿名記憶體**於交換分割槽,即linux下的swap分割槽。
swap空間的作用可簡單描述為:當系統的物理記憶體不夠用的時候,就需要將物理記憶體中的一部分空間釋放出來,以供當前執行的程式使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程式,這些被釋放的空間被臨時儲存到swap空間中,等到那些程式要執行時,再從swap中恢復儲存的資料到記憶體中。這樣,系統總是在物理記憶體不夠時,才進行swap交換。
你可能會經常遇這種現象。例如,在使用linux系統同時執行多個程式時,當你切換到乙個很長時間沒有理會的程式時,會聽到硬碟「嘩嘩」直響。這是因為這個程式的記憶體被那些頻繁執行的程式給「偷走」了,放到了swap區中。因此,一旦此程式被放置到前端,它就會從swap區取回自己的資料,將其放進記憶體,然後接著執行。
需要說明一點,並不是所有從物理記憶體中交換出來的資料都會被放到swap中(如果這樣的話,swap就會不堪重負),有相當一部分資料被直接交換到檔案系統。例如,有的程式會開啟一些檔案,對檔案進行讀寫(其實每個程式都至少要開啟乙個檔案,那就是執行程式本身),當需要將這些程式的記憶體空間交換出去時,就沒有必要將檔案部分的資料放到swap空間中了,而可以直接將其放到檔案裡去。如果是讀檔案操作,那麼記憶體資料被直接釋放,不需要交換出來,因為下次需要時,可直接從檔案系統恢復;如果是寫檔案,只需要將變化的資料儲存到檔案中,以便恢復。但是那些用malloc和new函式生成的物件的資料則不同,它們需要swap空間,因為它們在檔案系統中沒有相應的「儲備」檔案,因此被稱作「匿名」(anonymous)記憶體資料。這類資料還包括堆疊中的一些狀態和變數資料等。所以說,swap空間是「匿名」資料的交換空間
3 swap分割槽對效能的影響
分配太多的swap空間會浪費磁碟空間,而swap空間太少,則系統會發生錯誤。 如果系統的物理記憶體用光了,系統就會跑得很慢,但仍能執行;如果swap空間用光了,那麼系統就會發生錯誤。例如,web伺服器能根據不同的請求數量衍生出多個服務程序(或執行緒),如果swap空間用完,則服務程序無法啟動,通常會出現「application is out of memory」的錯誤,嚴重時會造成服務程序的死鎖。因此swap空間的分配是很重要的。
4 swap空間的監測方法
swap空間的分配固然很重要,而系統執行時的效能監控卻更加有價值。通過效能監視工具,可以檢查系統的各項效能指標,找到系統效能的瓶頸。本文只介紹一下在solaris下和swap相關的一些命令和用途。
最常用的是vmstat命令,此命令可以檢視大多數效能指標。
命令說明:
vmstat 後面的引數指定了效能指標捕獲的時間間隔。3表示每三秒鐘捕獲一次。第一行資料不用看,沒有價值,它僅反映開機以來的平均效能。從第二行開始,反映每三秒鐘之內的系統效能指標。這些效能指標中和swap有關的包括以下幾項:
procs下的w
它表示當前(三秒鐘之內)需要釋放記憶體、交換出去的程序數量。
memory下的swpd
它表示使用的swap空間的大小。
swap下的si,so
si表示當前(三秒鐘之內)每秒交換回記憶體(swap in)的總量,單位為kbytes;so表示當前(三秒鐘之內)每秒交換出記憶體(swap out)的總量,單位為kbytes。
以上的指標數量越大,表示系統越忙。這些指標所表現的系統繁忙程度,與系統具體的配置有關。系統管理員應該在平時系統正常執行時,記下這些指標的數值,在系統發生問題的時候,再進行比較,就會很快發現問題,並制定本系統正常執行的標準指標值,以供效能監控使用。
5 增加和刪除swap空間的方法
增加swap空間,分以下幾步:
1)成為超級使用者
$su passwd root
2)建立swap檔案
# dd if=/dev/zero of=swapfile bs=1024 count=65536
建立乙個有連續空間的交換檔案。
3)啟用swap檔案
#/usr/sbin/swapon swapfile
swapfile指的是上一步建立的交換檔案。4)現在新加的swap檔案已經起作用了,但系統重新啟動以後,並不會記住前幾步的操作。因此要在/etc/fstab檔案中記錄檔案的名字,和swap型別,如:
/path/swapfile none swap sw,pri=3 0 0
5)檢驗swap檔案是否加上
/usr/sbin/swapon -s
刪除多餘的swap空間。
1)成為超級使用者
2)使用swapoff命令收回swap空間。
#/usr/sbin/swapoff swapfile
3)編輯/etc/fstab檔案,去掉此swap檔案的實體。
4)從檔案系統中**此檔案。
#rm swapfile
5)當然,如果此swap空間不是乙個檔案,而是乙個分割槽,則需建立乙個新的檔案系統,再掛接到原來的檔案系統上。
擴大swap分割槽記憶體
1 執行命令free m命令,檢視swap檔案的大小 2 執行dd命令對其增加記憶體 我這裡增加了3個g的記憶體 3 執行mkswap命令製作乙個swap檔案 mkswap tmp swap 4 執行swapon命令啟動swap檔案 swapon tmp swap 5 現在通過free m 檢視sw...
SWAP交換分割槽(虛擬記憶體)
swap 交換 分割槽是一種通過在硬碟中預先劃分一定的空間,然後將把記憶體中暫時不常用的資料臨時存放到硬碟中,以便騰出物理記憶體空間讓更活躍的程式服務來使用的技術,其設計目的是為了解決真實物理記憶體不足的問題。但由於交換分割槽畢竟是通過硬碟裝置讀寫資料的,速度肯定要比物理記憶體慢,所以只有當真實的物...
Linux下如何釋放記憶體 swap分割槽滿了怎麼辦
linux下如何釋放記憶體 swap分割槽滿了怎麼辦 在linux系統下,我們一般不需要去釋放記憶體,因為系統已經將記憶體管理的很好。但是凡事也有例外,有的時候記憶體會被快取占用掉,導致系統使用swap空間影響效能,此時就需要執行釋放記憶體 清理快取 的操作了。linux系統的快取機制是相當先進的,...