一.內存
物理內存也稱為主存,大多數計算機用的主存都是動態隨機訪問內存(DRAM)。只有內核才可以直接訪問物理內存。
Linux 內核給每個進程都提供了一個獨立的虛擬地址空間,並且這個地址空間是連續的。這樣,進程就可以很方便地訪問內存,更確切地說是訪問虛擬內存。
通過這里可以看出,32位系統的內核空間占用 1G,位於最高處,剩下的3G是用戶空間。而 64 位系統的內核空間和用戶空間都是 128T,分別占據整個內存空間的最高和最低處,剩下的中間部分是未定義的。
進程在用戶態時,只能訪問用戶空間內存;只有進入內核態后,才可以訪問內核空間內存。雖然每個進程的地址空間都包含了內核空間,但這些內核空間,其實關聯的都是相同的物理內存。這樣,進程切換到內核態后,就可以很方便地訪問內核空間內存。
每個進程都有整個虛擬空間可用,但只有實際應用了才分配物理內存。分配后的物理內存,是通過內存映射來管理的。那加起來所有進程的虛擬內存加起來,要比實際的物理內存大得多。
內存映射,其實就是將虛擬內存地址映射到物理內存地址。為了完成內存映射,內核為每個進程都維護了一張頁表,記錄虛擬地址與物理地址的映射關系,如下圖所示:
頁表實際上存儲在 CPU 的內存管理單元 MMU中,這樣,正常情況下,處理器就可以直接通過硬件,找出要訪問的內存。
而當進程訪問的虛擬地址在頁表中查不到時,系統會產生一個缺頁異常,進入內核空間分配物理內存、更新進程頁表,最后再返回用戶空間,恢復進程的運行。
二.內存占用
虛擬存儲器的基本思想是:程序、數據和堆棧的總大小可能超過可用的物理內存的大小。由操作系統把程序當前使用的那些部分保留在主存中,而把其他部分保存在磁盤上。例如,對於一個16MB的程序,通過仔細地選擇在每個時刻將哪4MB內容保留在內存中,並在需要時在內存和磁盤間交換程序的片段,這樣這個程序就可以在一個4MB的機器上運行。
內存的最小單位是字節 1M=1024byte(字節)
1字節=8bit(比特) 所以一個字節最大存儲值為255,就是8個1
具體占用幾個字節,和解釋器版本,系統版本有關。數字4字節
變量=100 1字節直接可以存儲100
變量=100(字符串) 一個字符占用一個字節 漢子占用2個字節表示
這里的變量,就會占用內存,但是不大,一個int類型的變量占4個字節,一個字節是8個bit,每個bit里只能存放0或1
所以int類型的4個字節一共是4*8=32 bit
最大表示 1111111111.....(32個1)
轉換為10進程,,就是int類型的在實際計算中的2的32次冪
如果程序很復雜,定義的變量很多,占用的內存空間就很大
從內存模型上,最簡單的堆和棧
某些變量在棧中,某些變量在堆中。計算完成后(程序結束),變量銷毀,內存空間回收,所以你能看到你的內存又降下來了。