1. 程式人生 > >2017-2018-1 20155216 《信息安全系統設計基礎》第十一周學習總結

2017-2018-1 20155216 《信息安全系統設計基礎》第十一周學習總結

速度 linux中 角度 調試 第九周 程序 高速 由於 設計

2017-2018-1 20155216 《信息安全系統設計基礎》第十一周學習總結

教材學習內容總結

一、虛擬存儲器的概念和作用

為解決內存小而作業大、作業多的矛盾, 以及執行過程中只是把當前運行需要的那部分程序和數據裝入內存。 所以,操作系統把各級存儲器統一管理起來。就是說, 應該把一個程序當前正在使用的部分放在內存, 而其余部分放在磁盤上,啟動執行它。操作系統根據程序執行時的要求和內存的實際使用情況, 隨機地對每個程序進行換入/換出。
這樣, 就給用戶提供一個比正式的內存空間大的多的地址空間, 這就是虛擬存儲器。所謂虛擬存儲器是用戶能作為可編址內存對待的存儲空間, 在這種計算機系統中虛地址被映射成實地址。簡單地說,虛擬存儲器:是由操作系統提供的一個假想的特大存儲器。就是說, 虛擬存儲器並不是實際的內存,它的大小比內存空間大的多; 用戶感覺所能使用的“內存”非常大, 但這是操作系統對物理內存的擴充。

虛擬內存是硬件異常、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互,它為每個進程提供了一個大的、一致的和私有的地址空間。

三個重要功能:

1、它將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據需要在磁盤和主存之間來回傳送數據,通過這種方式,它高效地使用了主存。

2、它為每個進程提供了一致的地址空間,從而簡化了內存管理。

3、它保護了每個進程的地址空間不被其他進程破壞。

二、地址翻譯的概念

地址翻譯是一個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垃圾收集器
技術分享圖片

六、C語言中與存儲器有關的錯誤

1、間接引用壞指針

2、讀未初始化的內存

3、允許棧緩沖區溢出

4、假設指針和它們指向的對象是相同大小的

5、造成錯位錯誤

6、引用指針,而不是它所指向的對象

7、誤解指數運算

8、引用不存在的變量

9、引用空閑堆塊中的數據

10、引起內存泄漏

教材學習中的問題和解決過程

  • 問題1:

對於內存泄漏不夠理解

  • 問題1解決方案:

內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。

內存泄漏缺陷具有隱蔽性、積累性的特征,比其他內存非法訪問錯誤更難檢測。因為內存泄漏的產生原因是內存塊未被釋放,屬於遺漏型缺陷而不是過錯型缺陷。此外,內存泄漏通常不會直接產生可觀察的錯誤癥狀,而是逐漸積累,降低系統整體性能,極端的情況下可能使系統崩潰。

內存泄漏分為四類:
常發性內存泄漏:發生內存泄漏的代碼會被多次執行到,每次被執行時都會導致一塊內存泄漏。

偶發性內存泄漏:發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。

一次性內存泄漏:發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊且僅有一塊內存發生泄漏。

隱式內存泄漏:程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裏並沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。從用戶使用程序的角度來看,內存泄漏本身不會產生什麽危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麽危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到。

代碼調試中的問題和解決過程

  • 問題1:

實驗四中的加載和卸載模塊無法被執行

  • 問題1解決方案:

使用另一版本的虛擬機,以保證內核路徑和版本的正確性。

代碼托管

技術分享圖片

結對及互評

本周結對學習情況

- [20155214](http://www.cnblogs.com/besti155214/p/7782336.html)
- 結對照片
- 結對學習內容

其他(感悟、思考等,可選)

1、虛擬內存的利用解決了諸多計算機作業相關的矛盾,極大地提高了計算機的運行效率。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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小時

  • 改進情況:

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《深入理解計算機系統V3》學習指導
  • ...

2017-2018-1 20155216 《信息安全系統設計基礎》第十一周學習總結