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

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

教材學習內容總結

虛擬存儲器
  • 虛擬存儲器是硬件異常、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互,它爲每一個進程提供了一個大的、一致的和私有的地址空間。
  • 虛擬存儲器提供了三個重要的能力:
  1. 它將主存當作是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據須要在磁盤和主存之間來回傳送數據,經過這種方式,它高效地使用了主存。
  2. 它爲每一個進程提供了一致的地址空間,從而簡化了存儲器管理。
  3. 它保護了每一個進程的地址空間不被其餘進程破壞。
如何理解虛擬存儲器
  • 虛擬存儲器是中心的。
  • 虛擬存儲器是強大的。
  • 虛擬存儲器是危險的。

地址翻譯

  • 地址翻譯符號小結:

存儲器映射

  • Linux (以及其餘一些形式的 Unix) 經過將一個虛擬存儲器區域與一個磁盤上的對象 (object) 關聯起來,以初始化這個虛擬存儲器區域的內容,這個過程稱爲存儲器映射 (memory mapping)。
  1. Unix 文件系統中的普通文件:一個區域能夠映射到一個普通磁盤文件的連續部分。文件區 (sectÎon) 被分紅頁大小的片,每一片包含一個虛擬頁面的初始內容。由於按需進行頁面調度,因此這些虛擬頁面沒有實際交換進入物理存儲器,直到 CPU 第一 次引用到頁面(即發射一個虛擬地址,落在地址空間這個頁面的範圍以內)。若是區域比文件區要大,那麼就用零來填充這個區域的餘下部分。
  2. 匿名文件:一個區域也能夠映射到一個匿名文件,匿名文件是由內核建立的,包含的全是二進制零。 CPU 第一次引用這樣一個區域內的虛擬頁面時,內核就在物理存儲器中找到一個 合適的犧牲頁面,若是該頁面被修改過,就將這個頁面換出來,用二進制零覆蓋犧牲頁面並更新頁表,將這個頁面標記爲是駐留在存儲器中的。注意在磁盤和存儲器之間並無實際的數據傳送。由於這個緣由,映射到匿名文件的區域中的頁面有時也叫作請求二進制零的頁 (demand zeropage)。
    一旦一個虛擬頁面被初始化了,它就在一個由內核維護的專門的交換文件 (swap file) 之間換來換去。交換文件也叫作交換空間 (swap space) 或者交換區域 (swap area)。在任什麼時候刻,交換空間都限制着當前運行着的進程可以 分配的虛擬頁面的總數。html

    動態存儲器分配

  • 當運行時須要額外虛擬存儲器時,用動態存儲器分配器 (dynamic memory allocator) 更方便,也有更好的可移植性。
  • 動態存儲器分配器維護着一個進程的虛擬存儲器區域,稱爲堆 (heap)
  • 分配器將堆視爲一組不一樣大小的塊 (block) 的 集合來維護。每一個塊就是一個連續的虛擬存儲器片 (chunk),要麼是已分配的,要麼是空閒的。己分配的 塊顯式地保留爲供應用程序使用。空閒塊可用來分配。空閒塊保持空閒,直到它顯式地被應用所分配。一個已分配的塊保持已分配狀態,直到它被釋放,這種釋放要麼是應用程序顯式執行的,要麼是存儲器分配器自身隱式執行的。
  • 分配器有兩種基本風格。兩種風格都要求應用顯式地分配塊。它們的不一樣之處在於由哪一個實體來負責釋放己分配的塊。
  • 顯式分配器 (explicit allocator),要求應用顯式地 釋聽任何已分配的塊。
  • 隱式分配器 (implicit allocator),另外一方面,要求分配器檢測一個已分配塊什麼時候再也不被程序 所使用,那麼就釋放這個塊。隱式分配器也叫作垃圾收集器 (garbage collector),而自動釋放未使用的己分配的塊的過程叫作垃圾收集 (garbage collection)。程序員

    爲何要使用動態存儲器分配
  • 程序使用動態存儲器分配的最重要的緣由是常常直到程序實際運行時,它們才知道某些數據結構的大小。
  • 最簡單的方法就是用某種硬編碼的最大數組大小靜態地定義這個數組。
    一種更好的方法是在運行時,在己知了 n 的值以後,動態地分配這個數組。使用這種方法,數組大小的最大值就只由可用的虛擬存儲器數量來限制了。數組

    垃圾收集

  • 應用經過調用 malloc 和 free 來分配和釋放堆塊。應用要負責釋放全部再也不須要的已分配塊。
  • 垃圾收集器 (garbage collector) 是一種動態存儲分配器,它自動釋放程序再也不須要的己分配 塊。這些塊稱爲垃圾 (garbage) 。
  • 自動回收堆存儲的過程叫作垃圾收集 (garbage collection)。在一個支持垃圾收集的系統中,應用顯式分配堆塊,可是從不顯示地釋放它們。在 C 程序的上下文中,應用調用 malloc,可是從不調用 free。反之,垃圾收集器按期識別垃圾塊,並相應地調用 free,將這些塊放回到空閒鏈表中。緩存

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

    C 程序中常見的與存儲器有關的錯誤

  • 間接引用壞指針
    在進程的虛擬地址空間中有較大的洞,沒有映射到任何有意義的數據。若是咱們試圖間接引用一個指向這些洞的指針,那麼操做系統就會以段異常停止 咱們的程序。並且,虛擬存儲器的某些區域是隻讀的。試圖寫這些區域將會以保護異常停止這個程序。安全

  • 讀未初始化的存儲器
    常見的錯誤就是假設堆存儲器被初始化爲零。服務器

  • 容許棧緩衝區溢出
    若是一個程序不檢查輸入串的大小就寫人梳中的目標緩衝 區,那麼這個程序就會有緩衝區溢出錯誤 (buffer overflow bug)。
    必須使用 fgets 函數,這個函數限制了輸入串的大小數據結構

  • 假設指針和它們指向的對象是相同大小的
    常見的錯誤是假設指向對象的指針和它們所指向的對象是相同大小的app

  • 形成錯位錯誤函數

  • 引用指針,而不是它所指向的對象
    不太注意 C 操做符的優先級和結合性,咱們就會錯誤地操做指針,而不是指針所指向的對象。學習

  • 誤解指針運算
    忘記了指針的算術操做是以它們指向的對象的大小爲單位來進行的,而 這種大小單位並不必定是字節。

  • 引用不存在的變量

  • 引用空閒堆塊中的故據
    引用已經被釋放了的堆塊中的數據

  • 引發存儲器泄漏
    存儲器泄漏是緩慢、隱性的殺手,當程序員不當心忘記釋放已分配塊,而在堆裏建立了垃圾時,會發生這種問題。
    若是常常調用 leak,那麼漸漸地,堆裏就會充滿了垃圾,在最糟糕的狀況下,會佔用整個虛擬地址空間。對於像守護進程和服務器這樣的程序來講,存儲器泄漏是特別嚴重的,根據定義這些程序是不會終止的。

小結

虛擬存儲器是對主存的一個抽象。支持虛擬存儲器的處理器經過使用一種叫作虛擬尋址的間接形式來引用主存。處理器產生一個虛擬地址,在被髮送到主存以前,這個地址被翻譯成一個物理地址。從虛擬地址空間到物理地址空間的地址翻譯要求硬件和軟件緊密合做。專門的硬件經過使用頁表來翻譯虛擬地址,而頁表的內容是由操做系統提供的。
虛擬存儲器提供三個重要的功能:

  1. 它在主存中自動緩存最近使用的存放磁盤上的虛擬地址空間的內容。虛擬存儲器緩存中的塊叫作頁。對磁盤上頁的引用會觸發缺頁,缺頁將控制轉 移到操做系統中的一個缺頁處理程序。缺頁處理程序將頁面從磁盤拷貝到主存緩存,若是必要, 將寫回被驅逐的頁。
  2. 虛擬存儲器簡化了存儲器管理,進而又簡化了連接、在進程間共享數 據、進程的存儲器分配以及程序加載。
  3. 最後,虛擬存儲器經過在每條頁表條目中加人保護位,從而了簡化了存儲器保護。
    地址翻譯的過程必須和系統中全部的硬件緩存的操做集成在一塊兒。大多數頁表條目位於L1 高速緩存中,可是一個稱爲 TLB 的頁表條目的片上高速緩存, 一般會消除訪問在L1上的頁表條目的開銷。
    現代系統經過將虛擬存儲器片和磁盤上的文件片關聯起來,以初始化虛擬存儲器片,這個過程稱爲存儲器映射。存儲器映射爲共享數據、建立新的進程以及加載程序提供了一種高效的機制。應用可使用 mmap 函數來手工地建立和刪除虛擬地址空間的區域。然而, 大多數程序依賴 於動態存儲器分配器,例如 malloc,它管理虛擬地址空間區域內一個稱爲堆的區域。動態存儲器分配器是一個感受像系統級程序的應用級程序,它直接操做存儲器,而無需類型系統的不少幫助。分配器有兩種類型。顯式分配器要求應用顯式地釋放它們的存儲器塊。隱式分配器(垃圾收集器)自動釋聽任何未使用的和不可達的塊。
    管理和使用虛擬存儲器是一件困難和容易出錯的任務。常見的錯誤示例包括:
    間接引用壞指針,
    讀取未初始化的存儲器,
    容許找緩衝區溢出,
    假設指針和它們指向的 對象大小相同,
    引用指針而不是它所指向的對象,
    誤解指針運算,
    引用不存在的變量,
    引發存儲器泄漏。

學習進度條

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進狀況:

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

參考資料

相關文章
相關標籤/搜索