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

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

修改 軟件工程 調用 多個進程 引用 由於 作用 num 總數

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

教材學習內容總結

  1. 理解虛擬存儲器的概念和作用
  2. 理解地址翻譯的概念
  3. 理解存儲器映射
  4. 掌握動態存儲器分配的方法
  5. 理解垃圾收集的概念
  6. 了解C語言中與存儲器有關的錯誤
  • 虛擬存儲器(Virtual Memory),是硬件異常,硬件地址翻譯,主存,磁盤文件和內核軟件的完善交互,它為每個進程提供一個大的,一致的,私有地址空間。通過一個清晰的機制,虛擬存儲器提供了三個要重的能力:

    • 它將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,並根據需要在磁盤和主存之間來回傳送數據,通過這種方式,高效的使用了主存
    • 它為每個進程提供了一致的地址空間,從而簡化了存儲器管理
    • 它保護了每個進程的地址空間不被其他進程破壞
  • 程序員需要虛擬內存的原因:
    • 虛擬內存是核心的
    • 虛擬內存是強大的
    • 虛擬內存是危險的
  • 物理地址:計算機系統的主存被組織成一個人由M個連續的字節到校的單元組成的數組。每字節都有一個唯一的物理地址。第一個字節的地CPU生成址為0,接下來的字節地址為1,再下一個是2,依次類推。給定這種簡單的結構,CPU訪問存儲器的最自然的方式就是使用物理地址。
    技術分享圖片

  • 虛擬地址:早期的PC使用物理尋址,而且諸如數字信號處理器,嵌入式微控制器以及Cray超級計算機這樣的系統仍然繼續使用這種尋址方式。而為通用計算機設計師的現代處理器使用的是虛擬尋址。使用虛擬尋址時,CPU通過生成一個虛擬地址來訪問主存,這個虛擬地址在被送到存儲器之前先轉換成適當的物理地址(這個過程叫做地址翻譯,相關硬件為存儲器管理單元MMU)
    技術分享圖片

  • 地址空間:一個非負整數地址的有序集合。

    • 線性地址空間:地址空間中的整數是連續的

    • 虛擬地址空間:一個帶有虛擬存儲器的系統中,CPU從一個有N=2^n個地址的地址空間中生成虛擬地址,這個地址空間稱為虛擬地址空間。

  • 虛擬存儲器被組織為一個由存放在磁盤上的N個連續的字節大小的單元組成的數組,每個字節都有一個唯一的虛擬地址,這個唯一的虛擬地址是作為到數組的索引的。

  • VM系統通過將虛擬存儲器分割為稱為虛擬頁的大小固定的塊作為磁盤和主存之間的傳輸單元,每個虛擬頁大小為P=2^p。物理存儲器被分割為大小也為P字節的物理頁稱為幀。

  • 在任意時刻,虛擬頁的集合通常被分為三個不相交的子集:
    • 未分配的
    • 緩存的
    • 未緩存的
  • DRAM緩存的組織結構是由巨大的不命中開銷驅動的。

    • 全相聯:任何虛擬頁可以放在任何的物理頁中
    • 因為對磁盤的訪問時間很長,總是使用寫回而不是直寫
    • 更復雜精密的替換算法
  • 軟硬件聯合,包括操作系統軟件、MMU(內存管理單元)中的地址翻譯硬件、一個存放在物理內存中叫做頁表的數據結構,提供虛擬內存系統判定虛擬頁是否換存在DRAM中的某個地方的功能。
    • 如果是,確定虛擬內存放在哪個物理頁中。
    • 如果不命中,系統判斷虛擬頁存放在磁盤的哪個位置,在物理內存中選擇一個犧牲頁,並將虛擬頁從磁盤復制到DRAM中,替換這個犧牲頁。
  • 頁表:存放在物理存儲器一個數據結構,叫做頁表(page table)。頁表將虛擬頁映射到物理頁。

  • 頁表就是一個PTE(page table entry,頁表條目)的數組。虛擬地址空間中的每個頁在頁表中的一個固定偏移量處都有一個PTE。

  • 假設每個PTE,一般由一個有效位和一個n位地址字段組成。有效位表明了該虛擬頁是否被緩存在DRAM中。
    • 如果設置了有效位,地址字段就表示DRAM中相應的物理頁的起始位置,這個物理頁中緩存了該虛擬頁。
    • 如果未設置有效位,一個空地址表示虛擬頁未分配,否則,這個地址就指向該虛擬頁在磁盤中的起始位置。
      技術分享圖片
  • DRAM緩存的組織結構

    • 不命中處罰很大
    • 是全相聯的——任何虛擬頁都可以放在任何的物理頁中。
    • 替換算法精密
    • 總是使用寫回而不是直寫。
  • 頁命中

  • 缺頁:就是指DRAM緩存不命中。
    • 缺頁異常:會調用內核中的缺頁異常處理程序,選擇一個犧牲頁。
    • 頁:虛擬存儲器的習慣說法,就是塊
    • 交換=頁面調度:磁盤和存儲器之間傳送頁的活動
    • 按需頁面調度:直到發生不命中時才換入頁面的策略,所有現代系統都使用這個。
  • 局部性原則保證了在任意時刻,程序將往往在一個較小的活動頁面集合上工作,這個集合叫做工作集/常駐集。

  • 顛簸:工作集大小超出了物理存儲器的大小。

  • 虛擬存儲器作為存儲器管理的工具

    • 操作系統每個進程都有一個獨立的頁表,因而也就是一個獨立的虛擬地址空間。
    • 按需頁面調度和獨立的虛擬地址空間的結合,對系統中存儲器的使用和管理造成了深遠的影響。特別地,VM簡化了鏈接和加載、代碼和數據共享,以及應用程序的存儲器分配。
    • 簡化鏈接:獨立的地址空間允許每個進程為它的存儲器映像使用相同的基本格式,因而不管代碼和數據實際存放在物理存儲器的何處,它的一致性極大地簡化了鏈接器的設計和實現,允許生成全鏈接的可執行文件,這些可執行文件是獨立於物理存儲器中代碼和數據的最終位置的。
    • 簡化加載:虛擬存儲器使得容易向存儲器中加載可執行文件和共享文件對象。系統加載時只需分配那些數據和代碼區域的連續的虛擬頁面區域,將它們標識為無效,且頁面條目地址指向目標文件中適當的位置。
    • 簡化共享:操作系統通過不同進程的頁表,將各自的私有的數據和代碼映射到不同的物理頁面;而對共享的代碼和數據,就將適當的虛擬頁面映射到相同的物理頁面,從而安排多個進程共享這部分代碼的一個拷貝。
    • 簡化存儲器分配:由於頁表的工作方式,操作系統只需分配一個適當數字個連續的虛擬存儲器頁面,但可以映射到任意分散的物理存儲器中。
    • 一個概念:將一組連續的虛擬頁面映射到任意一個文件中的任意一個位置的表示法叫做存儲器映射。
  • 虛擬存儲器作為存儲器保護的工具

    • PTE的三個許可位:
      • SUP:表示進程是否必須運行在內核模式下才能訪問該頁
      • READ:讀權限
      • WRITE:寫權限
    • 在PTE上添加一些額外的許可位來控制對一個虛擬頁面內容的訪問。例如:SUP位表示進程是否必須運行在內核模式下才能訪問網頁;READ位和WRITE位的讀和寫進行訪問。如果一條指令違反了這些許可條件,那麽cpu就觸發一個一般保護故障,將控制傳遞給一個內核中的異常處理程序。
  • 地址翻譯:地址翻譯是一個N元素的虛擬地址空間(VAS)中的元素和一個M元素的物理地址空間(PAS)中元素之間的映射。
  • 頁表基址寄存器:

    • CPU中的一個控制寄存器,叫做頁表基址寄存器(page table base register,PTBR)指向當前頁表。N位的虛擬地址包含兩個部分:一個p位的VPO(virtual page offset,虛擬頁面偏移)和一個n-p位的VPN(virtual page number)。MMU利用VPN來選擇適當的PTE。如VPN0選擇PTE0。因為物理和虛擬頁面都是p字節的,所以PPO(physical page offset物理頁面偏移)和VPO是相同的,所以,將頁表條目中PPN(physical page number,物理頁號)和虛擬地址中的VPO串聯起來,就是相應的物理地址。
  • 頁面命中完全由硬件處理的,而處理缺頁要求硬件和OS內核協作完成。 - 多級頁表——采用層次結構,用來壓縮頁表。
    • 以兩層頁表層次結構為例,好處是:
      • 如果一級頁表中的一個PTE是空的,那麽相應的二級頁表就根本不會存在
      • 只有一級頁表才需要總是在主存中,虛擬存儲器系統可以在需要時創建、頁面調入或調出二級頁表,只有最經常使用的二級頁表才緩存在主存中。
  • Linux虛擬存儲器系統
    • Linux為每個進程維持了一個單獨的虛擬地址空間。內核存儲器包含內核中的代碼和數據結構。一部分區域映射到所有進程共享的物理頁面另一部分包含每個進程都不相同的數據。
    • 區域:就是已分配的虛擬存儲器的連續片,這些頁是相關聯的。
    • 每個存在的虛擬頁面都保存在某個區域中。內核為系統中的每個進程維護一個單獨的任務結構task_struct:
  • 一個具體區域的區域結構包括:
    • vm_start:指向起始處
    • vm_end:指向結束處
    • vm_prot:描述這個區域包含的所有頁的讀寫許可權限
    • vm_flags:是共享的還是私有的
    • vm_next:指向下一個區域
  • Linux缺頁異常處理
  1. 虛擬地址A是否合法?

不合法,觸發段錯誤,終止進程

合法,進入下一條

  1. 存儲器訪問是否合法?即,是否有權限?

不合法,觸發保護異常,終止程序

合法,進入下一條

  1. 這時,是針對合法的虛擬地址進行合法的操作。所以:選擇一個犧牲頁面,如果被修改過就換新的並更新頁表。
  • 存儲器映射:

Linux通過將一個虛擬存儲器區域與一個磁盤上的對象關聯起來,以初始化這個虛擬存儲器區域的內容的過程叫做存儲器映射。

  • 映射對象:

1.Unix文件系統中的普通文件

2.匿名文件(由內核創建,全都是二進制0)

  • 共享對象和私有對象
    • 共享對象
      共享對象對於所有把它映射到自己的虛擬存儲器進程來說都是可見的

      • 即使映射到多個共享區域,物理存儲器中也只需要存放共享對象的一個拷貝。
    • 私有對象
      • 私有對象運用的技術:寫時拷貝
      • 在物理存儲器中只保存有私有對象的一份拷貝

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

        (一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據我的實踐,我得到這些經驗(描述自己的經驗)。 但是我還是不太懂,我的困惑是(說明困惑)。【或者】我反對作者的觀點(提出作者的觀點,自己的觀點,以及理由)。 )

  • 問題1:顯式空閑鏈表與隱式空閑鏈表的不同之處比較。
  • 問題1解決方案:
  1. 分配時間

隱式的,分配時間是塊總數的線性時間

但是顯式的,是空閑塊數量的線性時間。

  1. 鏈表形式

隱式——隱式空閑鏈表

顯式——雙向鏈表,有前驅和後繼,比頭部腳部好使。

代碼托管

(statistics.sh腳本的運行結果截圖)

上周考試錯題總結

  • Unix/Linux中,對於代碼fd=open("foo",O_WRONLY,0766),umask=022,下面說法正確的是()
    A .
    進程對foo是只寫的
    B .
    同組成員能寫foo
    C .
    使用者可以執行foo
    D .
    任何人都可以寫foo
    正確答案: A C 你的答案: A B C D

  • 關於open(2),下面說法正確的是( )
    A .
    flag 參數中O_RDONLY,O_WRONLY,O_RDWR至少要有一個
    B .
    O_RDONLY|O_WRONLY == O_RDWR
    C .
    fd=open("foo.txt",O_WRONLY|O_APPEND,0),調用write(fd,buff,n)寫入foo.txt的數據不會破壞已有數據。
    D .
    fd=open("foo.txt",O_WRONLY|O_APPEND,0644),必將導致其他人不能寫foo.txt
    正確答案: A C 你的答案: A C D

  • Linux中下列概念中可以用Unix I/O處理的是()
    A .
    普通文件
    B .
    設備文件
    C .
    目錄
    D .
    套接字
    正確答案: A B C D 你的答案: A C D

  • 輸入輸出是針對()來講的?
    A .
    CPU
    B .
    主存
    C .
    I/O設備
    D .
    計算機
    正確答案: B 你的答案: C

結對及互評

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 其他

本周結對學習情況

- [20155219](http://www.cnblogs.com/paypay/)
- 結對照片

技術分享圖片

- 結對學習內容
    - 第九章教材內容

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

xxx
xxx

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

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進情況:

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

參考資料

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

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