❶ linux內核一般佔用多大內存
[root@scs-2 tmp]# free
total used free shared buffers cached
Mem: 3266180 3250004 16176 0 110652 2668236
-/+ buffers/cache: 471116 2795064
Swap: 2048276 80160 1968116
下面是對這些數值的解釋:
total:總計物理內存的大小。
used:已使用多大。
free:可用有多少。
Shared:多個進程共享的內存總額。
Buffers/cached:磁碟緩存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解釋了。
區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 這兩個的區別在於使用的角度來看,第一行是從OS的角度來看,因為對於OS,buffers/cached 都是屬於被使用,所以他的可用內存是16176KB,已用內存是3250004KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是從應用程序角度來看,對於應用程序來說,buffers/cached 是等於可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached。
如上例:
2795064=16176+110652+2668236
接下來解釋什麼時候內存會被交換,以及按什麼方交換。 當可用內存少於額定值的時候,就會開會進行交換。
如何看額定值:
cat /proc/meminfo
[root@scs-2 tmp]# cat /proc/meminfo
MemTotal: 3266180 kB
MemFree: 17456 kB
Buffers: 111328 kB
Cached: 2664024 kB
SwapCached: 0 kB
Active: 467236 kB
Inactive: 2644928 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 3266180 kB
LowFree: 17456 kB
SwapTotal: 2048276 kB
SwapFree: 1968116 kB
Dirty: 8 kB
Writeback: 0 kB
Mapped: 345360 kB
Slab: 112344 kB
Committed_AS: 535292 kB
PageTables: 2340 kB
VmallocTotal: 536870911 kB
VmallocUsed: 272696 kB
VmallocChunk: 536598175 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
用free -m查看的結果:
[root@scs-2 tmp]# free -m
total used free shared buffers cached
Mem: 3189 3173 16 0 107 2605
-/+ buffers/cache: 460 2729
Swap: 2000 78 1921
查看/proc/kcore文件的大小(內存鏡像):
[root@scs-2 tmp]# ll -h /proc/kcore
-r——– 1 root root 4.1G Jun 12 12:04 /proc/kcore
備註:
佔用內存的測量
測量一個進程佔用了多少內存,linux為我們提供了一個很方便的方法,/proc目錄為我們提供了所有的信息,實際上top等工具也通過這里來獲取相應的信息。
/proc/meminfo 機器的內存使用信息
/proc/pid/maps pid為進程號,顯示當前進程所佔用的虛擬地址。
/proc/pid/statm 進程所佔用的內存
[root@localhost ~]# cat /proc/self/statm
654 57 44 0 0 334 0
輸出解釋
CPU 以及CPU0。。。的每行的每個參數意思(以第一行為例)為:
參數 解釋 /proc//status
Size (pages) 任務虛擬地址空間的大小 VmSize/4
Resident(pages) 應用程序正在使用的物理內存的大小 VmRSS/4
Shared(pages) 共享頁數 0
Trs(pages) 程序所擁有的可執行虛擬內存的大小 VmExe/4
Lrs(pages) 被映像到任務的虛擬內存空間的庫的大小 VmLib/4
Drs(pages) 程序數據段和用戶態的棧的大小 (VmData+ VmStk )4
dt(pages) 04
查看機器可用內存
/proc/28248/>free
total used free shared buffers cached
Mem: 1023788 926400 97388 0 134668 503688
-/+ buffers/cache: 288044 735744
Swap: 1959920 89608 1870312
我們通過free命令查看機器空閑內存時,會發現free的值很小。這主要是因為,在linux中有這么一種思想,內存不用白不用,因此它盡可能的cache和buffer一些數據,以方便下次使用。但實際上這些內存也是可以立刻拿來使用的。
所以 空閑內存=free+buffers+cached=total-used
❷ Win7系統內核編程,內核物理內存
問題有點多,我一個一個回答吧 1.要編譯linux需稿租要帶敬沖到linux系統下的gcc編譯工具去編譯,如果是新手,編譯內核用來做什麼呢?編譯內核需要先配置內核再編譯,還是挺復雜的。 2.安裝雙系統: 以ubuntu 10.04的方法 1.下載iso鏡像文件; 2.ultraiso將文件導入到U盤(這是安裝在物理機上); 3.電腦BISO開機設置為U盤啟動; 4.插入U盤,蠢殲重啟電腦進入安裝界面; 5.進入安裝界面後,基本只要選擇默認安裝,下一步下一步就OK了。 3.linux ubuntu就有中文版的。
❸ Linux內核編程時(我要編寫系統調用內存分配)要用到malloc函數,但是Linux不允許訪問C庫中的malloc函數
Linux內核運行在X86機器的物理內存管理使用簡單平坦內存模型,每個用戶進程內存(虛擬內存)地址范圍為從0到TASK_SIZE位元組,超過此內存的限制不能被用戶訪問。用戶進程被分為幾個邏輯段,成為虛擬內存區域,內核跟蹤和管理用戶進程的虛擬內存區域
❹ 運行linux內核,最小需要多大內存
VMware這樣的虛擬安裝的默認都會選擇1G左右; 如果安裝字元界面最小化安裝512-1G夠了,但是現在的內存都比較普及一般的電腦都是4G以上內存,所以呢添加新的虛擬機的時候一般設置個1-2G,一般的操作測試是夠用了。
❺ 每個進程都有自己的內存堆棧區域嗎,以及堆內存為什麼要程序員自己釋放
第一個問題回答只有一個字「是」,建議你看一本書叫《程序員的自我修養》。
第二個問題:對SP寄存器的值進行操作而形成邏輯上的棧,而局部變數是在函數內部定義的,就是在棧上定義的,函數的調用和對棧的操作這是一個很基礎的也是很重要的知識點,你把局部變數的釋放理解成了一個單獨的動作,事實上編譯器沒有對這個局部變數的空間做任何內存管理意義上的操作。只是一個簡單的對SP寄存器的值的一個改變即形成了棧的恢復動作。棧一恢復了,那之前那段棧內存上的數據你肯定找不到了,但那個物理內存地址上的數據卻還是原狀,所以我建義你把 」自動釋放局部變數「 這幾個字改成「自動丟棄局部變數」,丟了的東西就是找不回了,你沒法用了,但那東西不會憑空從地球上消失,只是從你的視野里消失了,可能別人撿到了,別人就能用得著了,就像在函數A里創建的局部變數 local_a 可能在進程的地址空間里是地址0X11,但函數A返回之後,可能主程序又要調用函數B,而在函數B里創建的局部變數 local_b 也可能就是在0X11這個地址,那麼地址0X11上邊的值從A函數結束到B函數開始這段時間一直沒變,只是在這段時間里沒有人管理它的值。而這個過程就叫釋放,或叫丟棄,
對堆內存的操作實際是動態內存操作,就涉及到內存管理了,其實現在的操作系統內核對用戶空間的進程這塊的創建與注銷都加入了內存保護,你在用戶空間的程序中釋不釋放堆內存,系統都會在這個程序結束時做內存回收動作,但這僅限於用戶空間的程序,如果是內核編程的話,就一定要嚴格釋放掉動態分配的內存,否則造成系統內存泄漏,內存泄漏的後果就是可用內存被你人為的弄成了不可用內存,到最後導至系統無動態內存可分配,就無法載入程序。
對於你的提問,其實沒有辦法回答得讓你理解透澈,你現在對程序的運行機制和操作系統原理基本上是一個零的認識,慢慢來吧,多看操作系統原理的書,其實用戶程序都是基於操作系統編程,理解一些原理性的東西是非常重要的。