爲解決內存小而做業大、做業多的矛盾, 以及執行過程當中只是把當前運行須要的那部分程序和數據裝入內存。 因此,操做系統把各級存儲器統一管理起來。就是說, 應該把一個程序當前正在使用的部分放在內存, 而其他部分放在磁盤上,啓動執行它。操做系統根據程序執行時的要求和內存的實際使用狀況, 隨機地對每一個程序進行換入/換出。
這樣, 就給用戶提供一個比正式的內存空間大的多的地址空間, 這就是虛擬存儲器。所謂虛擬存儲器是用戶能做爲可編址內存對待的存儲空間, 在這種計算機系統中虛地址被映射成實地址。簡單地說,虛擬存儲器:是由操做系統提供的一個假想的特大存儲器。就是說, 虛擬存儲器並非實際的內存,它的大小比內存空間大的多; 用戶感受所能使用的「內存」很是大, 但這是操做系統對物理內存的擴充。html
虛擬內存是硬件異常、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互,它爲每一個進程提供了一個大的、一致的和私有的地址空間。java
三個重要功能:git
一、它將主存當作是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據須要在磁盤和主存之間來回傳送數據,經過這種方式,它高效地使用了主存。算法
二、它爲每一個進程提供了一致的地址空間,從而簡化了內存管理。緩存
三、它保護了每一個進程的地址空間不被其餘進程破壞。安全
地址翻譯是一個N元素的虛擬地址空間(VAS)中的元素和一個M元素的物理地址空間(PAS)中的元素之間的映射。
服務器
地址翻譯符號:
數據結構
MMU利用頁表來實現映射
函數
舉例:Core i7地址翻譯
性能
Linux經過將一個虛擬內存區域與一個磁盤上的對象關聯起來,以初始化這個虛擬內存區域的內容,這個過程爲內存映射。
Linux中文件系統中的普通文件:一個區域能夠映射到一個普通磁盤文件的連續部分。
匿名文件:一個區域能夠映射到一個匿名文件,匿名文件是由內核建立的,包含的全是二進制零。
共享對象:
一個共享對象:
一個私有的寫時複製對象:
fork()函數:
當fork函數被當前進程調用時,內核爲新進程建立各類數據結構,並分配給它一個惟一的PID。
當fork在新進程中返回時,新進程如今的虛擬內存恰好和調用fork是存在的虛擬內存相同。
execve函數:
格式:execve("a.out", NULL, NULL);
execve函數在當前進程中加載並運行包含在可執行目標文件a.out中的程序。
使用mmap函數的用戶級內存映射
參數的可視化解釋:
動態內存分配的兩種基本風格:
函數使用:
經過調用malloc函數從堆中分配塊:
include <stdlib.h> void *malloc(size_t size);
使用sbrk函數顯示地分配和釋放堆內存:
#include <unistd.h> void *sbrk(intptr_t incr);
調用free函數釋放已分配的內存:
#include <stdlib.h> void free(void *ptr);
分配器的要求和目標:
應用經過調用malloc和free來分配和釋放堆塊。應用要負責釋放全部再也不須要的已分配塊。
收集過程:
Mark和Sweep垃圾收集器
一、間接引用壞指針
二、讀未初始化的內存
三、容許棧緩衝區溢出
四、假設指針和它們指向的對象是相同大小的
五、形成錯位錯誤
六、引用指針,而不是它所指向的對象
七、誤解指數運算
八、引用不存在的變量
九、引用空閒堆塊中的數據
十、引發內存泄漏
對於內存泄漏不夠理解
內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。
內存泄漏缺陷具備隱蔽性、積累性的特徵,比其餘內存非法訪問錯誤更難檢測。由於內存泄漏的產生緣由是內存塊未被釋放,屬於遺漏型缺陷而不是過錯型缺陷。此外,內存泄漏一般不會直接產生可觀察的錯誤症狀,而是逐漸積累,下降系統總體性能,極端的狀況下可能使系統崩潰。
內存泄漏分爲四類:
常發性內存泄漏:發生內存泄漏的代碼會被屢次執行到,每次被執行時都會致使一塊內存泄漏。
偶發性內存泄漏:發生內存泄漏的代碼只有在某些特定環境或操做過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。因此測試環境和測試方法對檢測內存泄漏相當重要。
一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者因爲算法上的缺陷,致使總會有一塊且僅有一塊內存發生泄漏。
隱式內存泄漏:程序在運行過程當中不停的分配內存,可是直到結束的時候才釋放內存。嚴格的說這裏並無發生內存泄漏,由於最終程序釋放了全部申請的內存。可是對於一個服務器程序,須要運行幾天,幾周甚至幾個月,不及時釋放內存也可能致使最終耗盡系統的全部內存。因此,咱們稱這類內存泄漏爲隱式內存泄漏。從用戶使用程序的角度來看,內存泄漏自己不會產生什麼危害,做爲通常的用戶,根本感受不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終耗盡系統全部的內存。從這個角度來講,一次性內存泄漏並無什麼危害,由於它不會堆積,而隱式內存泄漏危害性則很是大,由於較之於常發性和偶發性內存泄漏它更難被檢測到。
實驗四中的加載和卸載模塊沒法被執行
使用另外一版本的虛擬機,以保證內核路徑和版本的正確性。
- [20155214](http://www.cnblogs.com/besti155214/p/7782336.html) - 結對照片 - 結對學習內容
一、虛擬內存的利用解決了諸多計算機做業相關的矛盾,極大地提升了計算機的運行效率。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第三週 | 114/114 | 3/3 | 20/20 | |
第四周 | 136/250 | 2/5 | 18/38 | |
第五週 | 87/337 | 2/7 | 22/60 | |
第六週 | 271/608 | 2/9 | 30/90 | |
第七週 | 185/716 | 2/11 | 30/90 | |
第八週 | 531/1247 | 3/14 | 30/90 | |
第九周 | 439/1686 | 3/17 | 30/90 | |
第十一週 | 153/1839 | 2/19 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:25小時
實際學習時間:20小時
改進狀況:
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)