2017-2018-1 20155204 《信息安全系统设计基础》第十一周学习总结
2017-2018-1 20155204 《信息安全系統(tǒng)設(shè)計(jì)基礎(chǔ)》第十一周學(xué)習(xí)總結(jié)
教材學(xué)習(xí)內(nèi)容總結(jié)
9.1物理和虛擬地址
物理地址:計(jì)算機(jī)系統(tǒng)的主存被組織成一個(gè)人由M個(gè)連續(xù)的字節(jié)到校的單元組成的數(shù)組。每字節(jié)都有一個(gè)唯一的物理地址。第一個(gè)字節(jié)的地CPU生成址為0,接下來的字節(jié)地址為1,再下一個(gè)是2,依次類推。給定這種簡(jiǎn)單的結(jié)構(gòu),CPU訪問存儲(chǔ)器的最自然的方式就是使用物理地址。
虛擬地址:CPU生成一個(gè)虛擬地址來訪問主存,這個(gè)虛擬地址在被送到存儲(chǔ)器之前先轉(zhuǎn)換成適當(dāng)?shù)奈锢淼刂贰?/p>
9.2地址空間
地址空間:一個(gè)非負(fù)整數(shù)地址的有序集合。
線性地址空間:地址空間中的整數(shù)是連續(xù)的
虛擬地址空間:一個(gè)帶有虛擬存儲(chǔ)器的系統(tǒng)中,CPU從一個(gè)有N=2^n個(gè)地址的地址空間中生成虛擬地址,這個(gè)地址空間稱為虛擬地址空間。
9.3虛擬內(nèi)存作為緩存的工具
虛擬存儲(chǔ)器被組織為一個(gè)由存放在磁盤上的N個(gè)連續(xù)的字節(jié)大小的單元組成的數(shù)組,每個(gè)字節(jié)都有一個(gè)唯一的虛擬地址,作為到數(shù)組的索引。
VM系統(tǒng)通過將虛擬存儲(chǔ)器分割為稱為虛擬頁的大小固定的塊來處理這個(gè)問題。每個(gè)虛擬頁大小為P=2^p。物理存儲(chǔ)器被分割為大小也為P字節(jié)的物理頁稱為幀。
在任意時(shí)刻,虛擬頁的集合通常被分為三個(gè)不相交的子集:未分配的、緩存的、未緩存的。
9.4虛擬內(nèi)存作為存儲(chǔ)器管理的工具
- 按需頁面調(diào)度和獨(dú)立的虛擬地址空間的結(jié)合,對(duì)系統(tǒng)中內(nèi)存的使用和管理造成了深遠(yuǎn)的影響。特別地,VM簡(jiǎn)化了鏈接和加載、代碼和數(shù)據(jù)共享,以及應(yīng)用程序的內(nèi)存分配。
- 簡(jiǎn)化鏈接:獨(dú)立的地址空間允許每個(gè)進(jìn)程為它的內(nèi)存映像使用相同的基本格式,因而不管代碼和數(shù)據(jù)實(shí)際存放在物理內(nèi)存的何處,它的一致性極大地簡(jiǎn)化了鏈接器的設(shè)計(jì)和實(shí)現(xiàn),允許生成全鏈接的可執(zhí)行文件,這些可執(zhí)行文件是獨(dú)立于物理內(nèi)存中代碼和數(shù)據(jù)的最終位置的。
- 簡(jiǎn)化加載:虛擬內(nèi)存使得容易向內(nèi)存中加載可執(zhí)行文件和共享文件對(duì)象。系統(tǒng)加載時(shí)只需分配那些數(shù)據(jù)和代碼區(qū)域的連續(xù)的虛擬頁面區(qū)域,將它們標(biāo)識(shí)為無效,且頁面條目地址指向目標(biāo)文件中適當(dāng)?shù)奈恢谩?/li>
- 簡(jiǎn)化共享:操作系統(tǒng)通過不同進(jìn)程的頁表,將各自的私有的數(shù)據(jù)和代碼映射到不同的物理頁面;而對(duì)共享的代碼和數(shù)據(jù),就將適當(dāng)?shù)奶摂M頁面映射到相同的物理頁面,從而安排多個(gè)進(jìn)程共享這部分代碼的一個(gè)拷貝。
- 簡(jiǎn)化內(nèi)存分配:由于頁表的工作方式,操作系統(tǒng)沒有必要分配k個(gè)連續(xù)的物理內(nèi)存頁面,頁面可以隨機(jī)的分散在物理內(nèi)存中。
9.5虛擬內(nèi)存作為存內(nèi)存保護(hù)的工具
在PTE上添加一些額外的許可位來控制一個(gè)虛擬頁面的內(nèi)容訪問十分簡(jiǎn)單。
9.6地址翻譯
形式上說。地址翻譯是一個(gè)N元素的虛擬地址空間(VAS)中元素和一個(gè)M元素的物理地址空間(PAS)中元素的映射。
使用頁表的地址翻譯:頁表基址寄存器指向當(dāng)前頁表,通過n位的虛擬地址中n-p位的虛擬頁號(hào)(VPN)從頁表中選出適當(dāng)?shù)捻摫項(xiàng)l目,將頁表?xiàng)l目中中的物理頁號(hào)(PPN)和虛擬地址中的p位虛擬頁面偏移(VPO)串聯(lián)起來,得到物理地址。因?yàn)閂PO和PPO是相同的。
頁命中時(shí)CPU硬件執(zhí)行的步驟:
處理器生成一個(gè)虛擬地址,并把它傳送給MMU
MMU生成PTE地址,并從高速緩存/主存請(qǐng)求得到它
高速緩存/主存向MMU返回PTE
MMU構(gòu)造物理地址,并把它傳送給高速緩存/主存
高速緩存/主存返回所請(qǐng)求數(shù)據(jù)給處理器。處理缺頁:
第一步到第三步和頁面命中步驟內(nèi)容相同
第四步:PTE有效位為0,所以MMU觸發(fā)了一次異常,傳遞cpu中的控制到操作系統(tǒng)內(nèi)核的缺頁處理程序
第五步:缺頁處理程序確定出物理內(nèi)存中犧牲頁,若犧牲頁已被修改過,則將其換到磁盤
第六步:缺頁處理程序調(diào)入新的頁面,并更新內(nèi)存中的PTE
第七部:缺頁處理程序返回到原來的進(jìn)程,驅(qū)使導(dǎo)致缺頁的指令重新啟動(dòng),會(huì)出現(xiàn)頁面命中接下來的步驟。
9.8內(nèi)存映射
通過將一個(gè)虛擬內(nèi)存區(qū)域與一個(gè)磁盤上的對(duì)象關(guān)聯(lián)起來,以初始化這個(gè)虛擬內(nèi)存區(qū)域的內(nèi)容,這個(gè)過程叫做內(nèi)存映射。
虛擬內(nèi)存區(qū)域可以映射到兩種類型的對(duì)象:
- 普通文件:一個(gè)區(qū)域可以映射到一個(gè)普通磁盤的其他部分。
- 匿名文件:內(nèi)核創(chuàng)建的,包含的全是二進(jìn)制零。
再看共享對(duì)象
一個(gè)對(duì)象可以被映射到虛擬內(nèi)存的一個(gè)區(qū)域,要么作為共享對(duì)象,要么作為私有對(duì)象。
對(duì)共享對(duì)象,某個(gè)進(jìn)程的任何寫操作于那些也把這個(gè)共享對(duì)象映射到它們虛擬內(nèi)存中的其它進(jìn)
程而言也是可見的,這些變化會(huì)反映到磁盤中的原始文件上;而對(duì)私有對(duì)象,某個(gè)進(jìn)程的任何寫操作對(duì)其它進(jìn)程來說都是不可見的。
私有對(duì)象一般使用一種寫時(shí)拷貝的技術(shù)來映射到虛擬內(nèi)存中。一個(gè)私有對(duì)象開始時(shí)與共享對(duì)象一樣,都是每個(gè)進(jìn)程虛擬空間中各自有一個(gè)映射,但物理內(nèi)存中只有一份拷貝。而當(dāng)?shù)侥硞€(gè)進(jìn)程試圖寫私有對(duì)象的某個(gè)區(qū)域時(shí),會(huì)觸發(fā)一個(gè)保護(hù)故障,故障處理程序就會(huì)在物理內(nèi)存中創(chuàng)建這個(gè)頁面的一個(gè)新拷貝,并更新相應(yīng)PTE和恢復(fù)寫權(quán)限,再將控制返回到寫指令處。
9.9動(dòng)態(tài)內(nèi)存分配
大多數(shù)C程序在運(yùn)行時(shí)需要額外虛擬內(nèi)存時(shí),會(huì)使用一個(gè)動(dòng)態(tài)內(nèi)存分配器,它維護(hù)者一個(gè)進(jìn)程的虛擬內(nèi)存區(qū)域,稱為堆。堆是一個(gè)請(qǐng)求二進(jìn)制零的區(qū)域,它緊接在未初始化的bss區(qū)域后開始,并向上生長,對(duì)于每個(gè)進(jìn)程,內(nèi)核維護(hù)著一個(gè)變量brk,它指向堆的頂部。
分配器將堆視為一組不同大小的塊的集合來維護(hù),每個(gè)塊就是虛擬內(nèi)存組塊,分配的或空閑的。分配的供應(yīng)用使用或被進(jìn)程釋放,空閑的等待被應(yīng)用所分配。
分配器有兩種基本風(fēng)格:
- 顯式分配器:要求程序顯式地釋放任何已分配的塊
- 隱式分配器:(也叫垃圾收集器)要求分配器檢測(cè)何時(shí)一個(gè)已分配塊不再被程序使用,然后釋放這個(gè)塊。
malloc和free函數(shù)
C標(biāo)準(zhǔn)庫提供了稱為malloc程序包的顯式分配器,可以調(diào)用它來從堆中分配塊。Malloc不會(huì)初始化它返回的內(nèi)存。Free用來釋放已分配的堆塊,注意其參數(shù)必須指向一個(gè)從malloc中獲得的已分配塊的起始位置。為什么要使用動(dòng)態(tài)分配器分配:
程序使用動(dòng)態(tài)內(nèi)存分配的最重要的原因是它經(jīng)常直到程序?qū)嶋H運(yùn)行時(shí)才知道某些數(shù)據(jù)結(jié)構(gòu)的大小。分配器的要求:
處理任意請(qǐng)求序列
立即響應(yīng)請(qǐng)求
只使用堆
對(duì)齊塊
不修改已分配的塊。
最大化吞吐率:每個(gè)單位時(shí)間里完成的請(qǐng)求數(shù),包括分配請(qǐng)求和釋放請(qǐng)求
最大化內(nèi)存利用率:可通過峰值利用率Uk來測(cè)量,一般為聚集有效載荷Pk和當(dāng)前堆大小的比值。
碎片
-------------------,
- 隱式空閑鏈表:
通過將空閑塊和已分配塊的頭部的信息將這些塊連接起來直到最后一個(gè)設(shè)置了已分配位和大小為零的終止頭部,成為一個(gè)鏈表結(jié)構(gòu)。
- 放置已分配的塊:
當(dāng)應(yīng)用請(qǐng)求一個(gè)K字節(jié)的塊時(shí),分配器搜索空閑鏈表,并查找出足夠大、可以放置所請(qǐng)求的空閑塊的方式。一般有首次適配、下一次適配和最佳適配策略。
- 分割空閑塊:
當(dāng)查找出空閑塊后決定分配這個(gè)塊中多少空間給分配請(qǐng)求。
- 合并空閑段塊
當(dāng)分配器釋放一個(gè)已分配塊時(shí),可能有其他空閑塊與這個(gè)新釋放的空閑塊相鄰。
9.10垃圾收集
垃圾收集:應(yīng)用負(fù)責(zé)釋放不再需要的已分配塊。
垃圾收集器:它將內(nèi)存視為一張有向可達(dá)圖,它的角色是維護(hù)可達(dá)圖的某種表示,并通過釋放不可達(dá)節(jié)點(diǎn)并將它們返回給空閑鏈表,來定期回收它們。
Mark&Sweep垃圾收集器:
由標(biāo)記階段和清除階段組成,標(biāo)記階段標(biāo)記出根節(jié)點(diǎn)的所有可達(dá)的和已分配的后繼,清除階段釋放每個(gè)未標(biāo)記的已分配塊。
9.11C程序中常見的與內(nèi)存有關(guān)的錯(cuò)誤
- 間接引用壞指針
- 讀未初始化的內(nèi)存
- 允許棧緩沖區(qū)溢出
- 假設(shè)指針和它們執(zhí)行的對(duì)象是相同大小的
- 造成錯(cuò)位錯(cuò)誤
- 誤解指針運(yùn)算
- 引用不存在的變量
- 引用空閑堆塊中的數(shù)據(jù)
- 引起內(nèi)存泄露
教材學(xué)習(xí)中的問題和解決過程
- 問題1:造成堆利用率低的主要原因是什么?
- 問題1解決方案: 在雖然有未使用的內(nèi)存但不能滿足分配請(qǐng)求時(shí)就稱出現(xiàn)碎片。碎片又分為——內(nèi)部碎片:一個(gè)已分配塊比有效載荷大時(shí)發(fā)生的;外部碎片:是當(dāng)空閑內(nèi)存合計(jì)起來足夠滿足一個(gè)分配請(qǐng)求,但沒有一個(gè)單獨(dú)的空閑塊足夠大到可以來處理這個(gè)請(qǐng)求而發(fā)生的。
- 問題2:如何理解常見錯(cuò)誤中的
允許棧緩沖區(qū)溢出? - 問題2解決方案:棧溢出就是緩沖區(qū)溢出的一種。 由于緩沖區(qū)溢出而使得有用的存儲(chǔ)單元被改寫,往往會(huì)引發(fā)不可預(yù)料的后果。程序在運(yùn)行過程中,為了臨時(shí)存取數(shù)據(jù)的需要,一般都要分配一些內(nèi)存空間,通常稱這些空間為緩沖區(qū)。如果向緩沖區(qū)中寫入超過其本身長度的數(shù)據(jù),以致于緩沖區(qū)無法容納,就會(huì)造成緩沖區(qū)以外的存儲(chǔ)單元被改寫,這種現(xiàn)象就稱為緩沖區(qū)溢出。緩沖區(qū)長度一般與用戶自己定義的緩沖變量的類型有關(guān)。
代碼托管
本周結(jié)對(duì)學(xué)習(xí)情況
- [20155203](http://www.cnblogs.com/xhwh/p/7940497.html)
- 結(jié)對(duì)學(xué)習(xí)內(nèi)容課下練習(xí)、一起讀書、一起研究課下測(cè)試。 學(xué)習(xí)進(jìn)度條
| 代碼行數(shù)(新增/累積) | 博客量(新增/累積) | 學(xué)習(xí)時(shí)間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標(biāo) | 5000行 | 30篇 | 400小時(shí) | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 18/38 | |
| 第三周 | 500/1000 | 3/7 | 22/60 | |
| 第四周 | 300/1300 | 2/9 | 30/90 | |
| 第五周 | 200/1500 | 2/11 | 10/100 | |
| 第六周 | 200/1700 | 2/13 | 10/110 | |
| 第七周 | 302/2020 | 1/14 | 10/120 | |
| 第八周 | 892/2912 | 1/14 | 10/130 | |
| 第九周 | 892/2912 | 3/17 | 10/140 | |
| 第十周 | 239/3151 | 0/17 | 10/150 | |
| 第十一周 | 181/3332 | 2/19 | 10/160 |
嘗試一下記錄「計(jì)劃學(xué)習(xí)時(shí)間」和「實(shí)際學(xué)習(xí)時(shí)間」,到期末看看能不能改進(jìn)自己的計(jì)劃能力。這個(gè)工作學(xué)習(xí)中很重要,也很有用。
耗時(shí)估計(jì)的公式
:Y=X+X/N ,Y=X-X/N,訓(xùn)練次數(shù)多了,X、Y就接近了。
參考:軟件工程軟件的估計(jì)為什么這么難,軟件工程 估計(jì)方法
計(jì)劃學(xué)習(xí)時(shí)間:10小時(shí)
實(shí)際學(xué)習(xí)時(shí)間:10小時(shí)
改進(jìn)情況:
(有空多看看現(xiàn)代軟件工程 課件
軟件工程師能力自我評(píng)價(jià)表)
參考資料
- 《深入理解計(jì)算機(jī)系統(tǒng)V3》學(xué)習(xí)指導(dǎo)
- 棧溢出
轉(zhuǎn)載于:https://www.cnblogs.com/20155204wh/p/7954205.html
總結(jié)
以上是生活随笔為你收集整理的2017-2018-1 20155204 《信息安全系统设计基础》第十一周学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注销公司需要多少钱啊?
- 下一篇: 数论:素数判定