進程優化實驗 node
Coding: shell
圖1 Coding 數據結構
圖2 shell輸出 ide
圖3 進程文件maps輸出信息 函數
圖4 cat smaps相關內存信息 優化
圖5 cat statm相關信息顯示 spa
分析: 進程
/proc 文件系統是一種內核和內核模塊用來向進程發送信息的機制(因此叫/proc)。這個僞文件系統讓你能夠和內核內部數據結構進行交互,獲取有關進程的有用信息,在運行中改變設置(經過改變內核參數)。與其餘文件系統不一樣,/proc 存在於內存之中而不是硬盤上。 內存
/proc 由內核控制,沒有承載/proc的設備。由於/proc主要存放由控制的狀態信息,因此大部分這些信息的邏輯位置位於內核控制的內存。對/proc進行一個 ‘ls -l’能夠看到大部分文件都是0字節大的;可是查看這些文件的時候,確實能夠看到一些信息。由於/proc文件系統和其餘常規的文件系統同樣把本身註冊到虛擬文件系統層(VFS)了。然而,知道當VFS調用他,請求文件、目錄的i-node的時候,/proc文件根據內核中的信息創建相應的文件和目錄。 map
如圖5所示,很簡單地返回7組數字,每個單位都是一頁也就是4KB
他們分別是:
Size:任務虛擬地址空間大小
Resident:應用程序正在使用的物理內存大小
Shared:共享頁數
Trs:程序所擁有的可執行虛擬內存大小
Lrs:被映像到任務的虛擬內存空間的庫的大小
Drs:程序數據段和用戶態的棧的大小
dt: 髒頁數量
如圖1所示在char *p = (char *)malloc(20),只是分配了虛擬內存,內核不會分配物理頁面給進程,在strcpy(p , 「123」);進程須要使用這塊內存了,內核會產生了一個頁故障,從而爲系統分配了一個物理頁面。
如圖3所示查看進程的maps文件能夠看到進程的內存狀況stack 也就是函數的棧大小系統固定的分配了84KB的大小,而堆大小132KB。在咱們的代碼中只申請了20個字節,而系統卻爲其分配了132KB的虛擬內存。
(0Xbffd7000 – 0X00110000 ) / (1024)D / (1024)D / (1024)D = 2.998806 約等於 3G的大小。即Linux下執行一個小應用程序,系統就會自動給用戶分配最低3G大小的虛擬空間。
每一個進程經過系統調用訪問內核,Linux內核空間由系統內的全部進程共享。從進程的角度來看,每一個進程擁有4G的虛擬地址空間。其中0~3GB爲各個進程的私有用戶空間,這個空間對系統中的其餘進程是可見的,最高的1G內核空間則爲全部進程以及內核所共享。