導航:首頁 > 操作系統 > linux進程的虛擬內存

linux進程的虛擬內存

發布時間:2022-05-27 13:21:44

linux進程內存管理方法

Linux系統提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。在Linux系統中,進程的4GB內存空間被分為兩個部分——用戶空間與內核空間。用戶空間的地址一般分布為0~3GB(即PAGE_OFFSET,在Ox86中它等於OxC0000000),這樣,剩下的3~4GB為內核空間,用戶進程通常只能訪問用戶空間的虛擬地址,不能訪問內核空間的虛擬地址。用戶進程只有通過系統調用(代表用戶進程在內核態執行)等方式才可以訪問到內核空間。每個進程的用戶空間都是完全獨立、互不相乾的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它並不會跟著進程改變,是固定的。內核空間的虛擬地址到物理地址映射是被所有進程共享的,內核的虛擬空間獨立於其他程序。Linux中1GB的內核地址空間又被劃分為物理內存映射區、虛擬內存分配區、高端頁面映射區、專用頁面映射區和系統保留映射區這幾個區域。對於x86系統而言,一般情況下,物理內存映射區最大長度為896MB,系統的物理內存被順序映射在內核空間的這個區域中。當系統物理內存大於896MB時,超過物理內存映射區的那部分內存稱為高端內存(而未超過物理內存映射區的內存通常被稱為常規內存),內核在存取高端內存時必須將它們映射到高端頁面映射區。Linux保留內核空間最頂部FIXADDR_TOP~4GB的區域作為保留區。當系統物理內存超過4GB時,必須使用CPU的擴展分頁(PAE)模式所提供的64位頁目錄項才能存取到4GB以上的物理內存,這需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以後的CPU允許內存最大可配置到64GB,它們具備36位物理地址空間定址能力。由此可見,對於32位的x86而言,在3~4GB之間的內核空間中,從低地址到高地址依次為:物理內存映射區隔離帶vmalloc虛擬內存分配器區隔離帶高端內存映射區專用頁面映射區保留區。

② linux裡面虛擬內存和swap有什麼區別

為了提高磁碟存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache.前者針對磁碟塊的讀寫,後者針對文件inode的讀寫.這些Cache有效縮短了I/O系統調用(比如 read,write,getdents)的時間.
內存活動基本上可以用3個數字來量化:活動虛擬內存總量,交換(swapping)率和調頁(paging)率.其中第一個數字表明內存的總需求量,後兩個數字表示那些內存中有多少比例正處在使用之中.目標是減少內存活動或增加內存量,直到調頁率保持在一個可以接受的水平上為止.
活動虛擬內存的總量(VM)=實際內存大小(size of real memory)(物理內存)+使用的交換空間大小(amount of swap space used)
當程序運行需要的內存大於物理內存時,Linux系統採用了調頁機制,即系統一些內存中的頁面到磁碟上,騰出來空間供進程使用。
大多數系統可以忍受偶爾的調頁,但是頻繁的調頁會使系統性能急劇下降。
Linux內存管理:Linux系統通過2種方法進行內存管理,「調頁演算法」,「交換技術」。
調頁演算法是將內存中最近不常使用的頁面換到磁碟上,把常使用的頁面(活動頁面)保留在內存中供進程使用。
交換技術是系統將整個進程,而不是部分頁面,全部換到磁碟上。正常情況下,系統會發生一些交換過程。
當內存嚴重不足時,系統會頻繁使用調頁和交換,這增加了磁碟I/O的負載。進一步降低了系統對作業的執行速度,即系統I/O資源問題又會影響到內存資源的分配。
Linux的虛擬內存是一個十分復雜的子系統,它實現了進程間代碼與數據共享機制的透明性,並能夠分配比系統現有物理內存更多的內存,某些操作系統的虛存甚至能通過提供緩存功能影響到文件系統的性能,各種風格的Linux的虛存的實現方式區別很大,但都離不開下面的4個概念。

1:實際內存
實際內存是指一個系統中實際存在的物理內存,稱為RAM。實際內存是存儲臨時數據最快最有效的方式,因此必須盡可能地分配給應用程序,現在的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用糾錯機制(ECC)。
2:交換空間
交換空間是專門用於臨時存儲內存的一塊磁碟空間,通常在頁面調度和交換進程數據時使用,通常推薦交換空間的大小應該是物理內存的二到四倍。
3:頁面調度
頁面調度是指從磁碟向內存傳輸數據,以及相反的過程,這個過程之所以被稱為頁面調度,是因為Linux內存被平均劃分成大小相等的頁面;通常頁面大小為 4KB和8KB(在Solaris中可以用pagesize命令查看)。當可執行程序開始運行時,它的映象會一頁一頁地從磁碟中換入,與此類似,當某些內存在一段時間內空閑,就可以把它們換出到交換空間中,這樣就可以把空閑的RAM交給其他需要它的程序使用。
4:交換
頁面調度通常容易和交換的概念混淆,頁面調度是指把一個進程所佔內存的空閑部分傳輸到磁碟上,而交換是指當系統中實際的內存已不夠滿足新的分配需求時,把整個進程傳輸到磁碟上,交換活動通常意味著內存不足。
vmstat監視內存性能:該命令用來檢查虛擬內存的統計信息,並可顯示有關進程狀態、空閑和交換空間、調頁、磁碟空間、CPU負載和交換,cache刷新以及中斷等方面的信息。

③ Linux 的虛擬內存管理有幾個關鍵概念

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

④ linux 下怎麼查看一個進程佔用內存大小

這里介紹下查看一個進程佔用內存大小的方法。

1、首先單擊桌面左上角的應用程序,選擇系統工具選項,如下圖所示。

⑤ 如何讓linux程序只使用虛擬內存

虛擬內存
,其實是硬碟上的一段存儲空間,存取速度比內存慢得多。一般系統管理器,都是優先用內存。實在不夠用,再通過交換,使用虛擬內存。
自己編程,可以使用memory
map函數,緩沖區使用的,也是硬碟空間。

⑥ linux中查看虛擬內存和cpu佔用率的命令是什麼

top,free,cat/proc/meminfo,cat/proc/cpuinfo。

[root@centerlisdbproc]#dmidecode|grep-A16"MemoryDevice"|more[objectObject]。

查看內存使用情況:cat/proc/meminfo,查看CPU使用情況:cat /proc/cpuinfo。

在系統維護的過程中,隨時可能有需要查看 CPU 使用率,並根據相應信息分析系統狀況的需要。在 CentOS 中,可以通過 top 命令來查看 CPU 使用狀況。

運行 top 命令後,CPU 使用狀態會以全屏的方式顯示,並且會處在對話的模式 -- 用基於 top 的命令,可以控制顯示方式等等。退出 top 的命令為 q (在 top 運行中敲 q 鍵一次)。

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。

可以直接使用top命令後,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用如下的命令:$ top -u oracle。

(6)linux進程的虛擬內存擴展閱讀:

一、查看內存佔用:

1、free

# free -m。

以MB為單位顯示內存使用情況。

# free -h。

以GB為單位顯示內存使用情況。

# free -t。

以總和的形式查詢內存的使用信息。

# free -s 5。

周期性的查詢內存使用信息。

每5秒執行一次命令。

二、查看CPU使用情況:

1、top。

top後鍵入P看一下誰佔用最大。

# top -d 5。

周期性的查詢CPU使用信息。

每5秒刷新一次。

2、ps auxw(查看本機的進程所佔cpu和mem的百分比情況)。

使用"ps auxw" 可以查看到本機的進程所佔cpu和mem的百分比情況。

# ps auxw | head -1

%CPU 進程的cpu佔用率。

%MEM 進程的內存佔用率。

3、查看本機所有進程的CPU佔比之和。

# cat cpu_per.sh

三、查看cpu信息(信息記錄在/proc/cpuinfo中)

# 總核數 = 物理CPU個數 X 每顆物理CPU的核數。

# 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數。



⑦ Java程序在linux系統下運行,為什麼會佔用很多虛擬內存

RSS列 表示, 程序佔用了多少物理內存。 虛擬內存可以不用考慮,它並不佔用實際物理內存。 (2). top 命令也可以 其中VIRT(或VSS)列 表示,程序佔用了多少虛擬內存。 同 ps aux 中的 VSZ列 RES列 表示, 程序佔用了多少物理內存。同 ps aux 中的RSS列 2.在linux下, 查看當前系統佔用了多少內存, 一般的命令是 free其中, free就是系統還有多少內存可以使用。但由於 linux 系統對內存使用有一個原則, 就是, 內存是寶貴的, 能使用多少就使用多少。 所以, linux會把已經調用過的包緩存起來,放在內存里。這樣,實際上,可以使用的內存,就可以理解為, free+buffers+cached3.當你了解完這些命令以後, 再去使用ps aux 命令去查看的時候, 會發現一個奇怪的現象。 所有的 RSS 列的數據,加起來, 比物理內存的數要大很多。 比如, 物理內存為2G, 而RSS列的數據加起來,可能有5個G之多, 這是怎麼回事了? 這是因為RSS列的值騙了我們。 linux的內存機制是這樣的: 在運行一個程序時, linux會調用該程序依賴的鏈接庫, 如lib.xx.so。 首先看該鏈接庫是否被映射進內存中,如果沒有被映射,則將代碼段與數據段映射到內存中,否則只是將其加入進程的地址空間。 這樣,當N個程序,依賴到lib.xx.so的時候, 實際上,內存中只有一個lib.xx.so ,而不是N個。 而RSS在顯示一個程序佔用的實際物理內存時, 將lib.xx.so也算了進來。 比如, X程序, 本身佔用內存為5M, lib.xx.so 佔用內存2M,lib.xx.so被N個程序共享依賴。 則RSS顯示為,X程序運行,佔用內存為7M。 實際上, X程序佔用了5M空間。 多餘的2m被討入到RSS中了。 當你在用ps aux顯示內存佔用情況時, N個共享依賴lib.xx.so的N個程序,都把這2m空間,算在自己的RSS中了, 這樣RSS的sum值,就比實際物理內存多了。 當然, linux的內存使用機制很復雜, 不是一句兩句能說清楚的。這里只是簡單的說明了一下, ps aux中的RSS值, 並不能真實反映物理內存的使用情況。 4. 如果查看更詳細的內存使用情況, 可用以下幾種方法, 或者幾種方法結合使用:這幾種方法,都需要root賬戶的許可權(1). pmap -d $pid $pid 是正在運行的程序的pid(2). cat /proc/$pid/smaps smaps的數據比較詳細,可簡單的歸納一下,歸納的命令如下: cat /proc/$pid/smaps awk '//{val_name=gensub(/([a-zA-Z_]*).*/,"\\1",1,$1); list[val_name]+=$2; }END{for(val in list)print val,list[val];}' (3). cat /proc/$pid/maps(4). cat /proc/$pid/statm輸出解釋第一列 size:任務虛擬地址空間大小 第二列 Resident:正在使用的物理內存大小 第三列 Shared:共享頁數 第四列 Trs:程序所擁有的可執行虛擬內存大小 第五列 Lrs:被映像倒任務的虛擬內存空間的庫的大小 第六列 Drs:程序數據段和用戶態的棧的大小 第七列 dt:臟頁數量(5). vmstat這個命令據說也可以提供一些參考信息,具體還未研究 5.作為phper,嘗試過使用php的函數memory_get_usage(), 該函數也不能得到php當前運行的程序,實際的,真正佔用的內存數量。 如果真想得到,php真正佔用的內存, 大概只能在, 程序運行的開始,執行一次memory_get_usage(). 在程序運行結束,執行一次memory_get_usage()。 將兩者的值相減,得到的值, 應該是一個相對比較准確的,內存佔用數量了。 這個方法還沒有測試, 考慮到, 得到這個數量,也沒有實際意義, 加上平時又比較忙,懶得試了。

⑧ linux虛擬內存佔用高

RSS列表示,程序佔用了多少物理內存。虛擬內存可以不用考慮,它並不佔用實際物理內存。(2).top命令也可以其中VIRT(或VSS)列表示,程序佔用了多少虛擬內存。同psaux中的VSZ列RES列表示,程序佔用了多少物理內存。

⑨ linux虛擬內存有什麼作用

linux下的vm(虛擬內存)和windows下的作用是一樣的,均是防止真實內存資源不足准備的.
linux的vm相關參數介紹

1. 保證linux有足夠的物理內存,可以調整vm的如下參數

vm.min_free_kbytes=409600;//默認值是3797,保證物理內存有足夠空閑空間,防止突發性換頁

vm.vfs_cache_pressure=200;//默認是100,增大這個參數設置了虛擬內存回收directory和i-node緩沖的傾向,這個值越大。越易回收

vm.swappiness=40 //預設60,減少這個參數會使系統盡快通過swapout不使用的進程資源來釋放更多的物理內存

一般在rac的配置環境中配置這三個參數,可以防止換頁引起節點短暫無響應,導致節點重啟

2. 改善io系統的性能

overcommit_memory = 0
vm.overcommit_ratio = 10 //默認值是50,用於虛擬內存的物理內存的百分比

vm.dirty_ratio = 20 //默認值是40,為了保持穩定,持續的寫入,把這個值調整的小一些,經驗值是20

vm.dirty_background_ratio //預設數值是500,也就是5秒,如果系統要求穩定持續的寫,可以適當降低該值,把峰值的寫操作平均多次,也避免宕機丟失更多的數據

vm.dirty_expire_centisecs //預設是3000,也就是30秒,如果系統寫操作壓力很大,可以適當減小該值,但也不要太小;建議設置為 1500

vm的相關參數在/proc/sys目錄下

相關命令

sysctl -p //修改vm參數後,運行這個命令可以立即生效
sysctl -a //查看所有的vm參數

與磁碟IO子系統有關的

/proc/sys/vm/dirty_ratio
這個參數控制文件系統的文件系統寫緩沖區的大小,單位是百分比,表示系統內存的百分比,
表示當寫緩沖使用到系統內存多少的時候,開始向磁碟寫出數據。增大之會使用更多系統內
存用於磁碟寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆定的寫入場合
時,應該降低其數值,一般啟動上預設是 10。下面是增大的方法:

echo '40' > /proc/sys/vm/dirty_ratio

/proc/sys/vm/dirty_background_ratio
這個參數控制文件系統的pdflush進程,在何時刷新磁碟。單位是百分比,表示系統內存的百
分比,意思是當寫緩沖使用到系統內存多少的時候,pdflush開始向磁碟寫出數據。增大之會
使用更多系統內存用於磁碟寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恆
定的寫入場合時,應該降低其數值,一般啟動上預設是 5。下面是增大的方法:

echo '20' > /proc/sys/vm/dirty_background_ratio

/proc/sys/vm/dirty_writeback_centisecs
這個參數控制內核的臟數據刷新進程pdflush的運行間隔。單位是 1/100 秒。預設數值是500,
也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可
以把尖峰的寫操作削平成多次寫操作。設置方法如下:

echo "200" > /proc/sys/vm/dirty_writeback_centisecs

如果你的系統是短期地尖峰式的寫操作,並且寫入數據不大(幾十M/次)且內存有比較多富裕,那麼應該增大此數值:

echo "1000" > /proc/sys/vm/dirty_writeback_centisecs

/proc/sys/vm/dirty_expire_centisecs
這個參數聲明Linux內核寫緩沖區裡面的數據多「舊」了之後,pdflush進程就開始考慮寫到磁碟中去。
單位是 1/100秒。預設是 3000,也就是 30 秒的數據就算舊了,將會刷新磁碟。對於特別重載的寫
操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。建
議設置為 1500,也就是15秒算舊。

echo "1500" > /proc/sys/vm/dirty_expire_centisecs

當然,如果你的系統內存比較大,並且寫入模式是間歇式的,並且每次寫入的數據不大(比如幾十M),
那麼這個值還是大些的好。

與網路IO子系統有關的

/proc/sys/net/ipv4/tcp_retrans_collapse
這個參數控制TCP雙方Window協商出現錯誤的時候的一些重傳的行為。但是在老的2.6的核
(<2.6.18)里頭,這個重傳會導致kernel oops,kernel panic,所以,如果出現有
tcp_retrans_*樣子的kernel panic,可以把這個參數給設置成0:

echo '0' > /proc/sys/net/ipv4/tcp_retrans_collapse

提高Linux應對短連接的負載能力
在存在大量短連接的情況下,Linux的TCP棧一般都會生成大量的 TIME_WAIT 狀態的socket。
你可以用下面的命令看到:

netstat -ant| grep -i time_wait

有時候,這個數目是驚人的:

netstat -ant|grep -i time_wait |wc -l

可能會超過三四萬。這個時候,我們需要修改 linux kernel 的 tcp time wait的時間,縮短之,
有個 sysctl 參數貌似可以使用,它是 /proc/sys/net/ipv4/tcp_fin_timeout,預設值是 60,
也就是60秒,很多網上的資料都說將這個數值設置低一些就可以減少netstat 裡面的TIME_WAIT狀態,
但是這個說法是錯誤的。經過認真閱讀Linux的內核源代碼,我們發現這個數值其實是輸出用的,
修改之後並沒有真正的讀回內核中進行使用,而內核中真正管用的是一個宏定義,在
$KERNEL/include/net/tcp.h裡面,有下面的行:

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
* state, about 60 seconds */

而這個宏是真正控制 TCP TIME_WAIT 狀態的超時時間的。如果我們希望減少 TIME_WAIT 狀態的數目
(從而節省一點點內核操作時間),那麼可以把這個數值設置低一些,根據我們的測試,設置為 10
秒比較合適,也就是把上面的修改為:

#define TCP_TIMEWAIT_LEN (10*HZ) /* how long to wait to destroy TIME-WAIT
* state, about 60 seconds */

然後重新編譯內核,重啟系統即可發現短連接造成的TIME_WAIT狀態大大減少:

netstat -ant | grep -i time_wait |wc -l

一般情況都可以至少減少2/3。也能相應提高系統應對短連接的速度。

/proc/irq/{number}/smp_affinity
在多 CPU 的環境中,還有一個中斷平衡的問題,比如,網卡中斷會教給哪個 CPU 處理,
這個參數控制哪些 CPU 可以綁定 IRQ 中斷。其中的 {number} 是對應設備的中斷編號,
可以用下面的命令找出:

cat /proc/interrupt

比如,一般 eth0 的 IRQ 編號是 16,所以控制 eth0 中斷綁定的 /proc 文件名是
/proc/irq/16/smp_affinity。上面這個命令還可以看到某些中斷對應的CPU處理的次數,
預設的時候肯定是不平衡的。

設置其值的方法很簡單,smp_affinity 自身是一個位掩碼(bitmask),特定的位對應特
定的 CPU,這樣,01 就意味著只有第一個 CPU 可以處理對應的中斷,而 0f(0x1111)
意味著四個 CPU 都會參與中斷處理。

幾乎所有外設都有這個參數設置,可以關注一下。

這個數值的推薦設置,其實在很大程度上,讓專門的CPU處理專門的中斷是效率最高的,比如,
給磁碟IO一個CPU,給網卡一個CPU,這樣是比較合理的。

閱讀全文

與linux進程的虛擬內存相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:422
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:192
pdf劈開合並 瀏覽:28
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:298
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:946
安卓導航無聲音怎麼維修 瀏覽:333
app怎麼裝視頻 瀏覽:431
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491