2018-2019-1 20165330 《資訊安全系統設計基礎》第十一週學習總結
阿新 • • 發佈:2018-12-01
學習目標
- 理解虛擬儲存器的概念和作用
- 理解地址翻譯的概念
- 理解儲存器對映
- 掌握動態儲存器分配的方法
- 理解垃圾收集的概念
- 瞭解C語言中與儲存器有關的錯誤
學習內容
虛擬儲存器
- 計算機系統的主存被組織成一個由M個連續的位元組大小的單元組成的陣列,每位元組都有一個唯一的實體地址
- 物理定址:CPU訪問記憶體的最自然的方式就是使用實體地址
- 現代處理器使用是的虛擬定址:CPU通過生成一個虛擬地址來訪問主存,這個虛擬地址在被送到記憶體之前先轉換成適當的實體地址。
- 地址空間
- 一個地址空間的大小是由表示最大地址所需要的位數來描述的。例如:一個包含N=2^n個地址的虛擬地址空間就叫做一個n位地址空間。
- 一個系統還有一個實體地址空間,對應於系統中實體記憶體的M個位元組
- 快取
- 虛擬記憶體被組織為一個由存放在磁碟上的N個連續的位元組大小的單元組成的陣列,磁碟上陣列的內容被快取在主存中。
- VM系統通過將虛擬記憶體分割成虛擬頁大小固定的塊作為傳輸單元,每個虛擬頁的大小為P=2^p位元組
- 實體記憶體被分割成物理頁,大小也為P位元組(頁幀)
- DRAM快取表示虛擬記憶體系統的快取,它在主存中快取虛擬頁。
- 儲存器對映:將虛擬地址對映到實體地址空間
地址翻譯
- 地址翻譯是一個N元素的虛擬地址空間中的元素和一個M元素的實體地址空間中元素之間的對映:MAP:VAS→PAS∪∅
- n位的虛擬地址包含兩個部分:一個p位的虛擬頁面偏移和一個(n-p)位的虛擬頁號
動態記憶體分配
- 在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法
建立虛擬記憶體區域
#include <unistd.h> #include <sys/mman.h> void *mmap(void *start,size_t length,int prot,int flag,int fd,off_t offset); 返回:若成功時則指向對映區域的指標,若出錯則為MAP_FAILED(-1)。
刪除虛擬記憶體的區域
#include <unistd.h> #include <sys/mman.h> int munmap(void *start,size_t length); 返回:若成功則為0,若出錯則為-1。
- 動態記憶體分配器維護著一個程序的虛擬記憶體區域成為堆,分配器將堆視為一組不同大小的塊的集合來維護,每個塊就是一個連續的虛擬記憶體片。空閒塊保持空閒,直到它顯式地被應用所分配;一個已分配的塊保持已分配狀態,直到它被釋放。
- 分配塊
malloc
函式#include <stdlib.h> void *malloc(size_t size); 返回:若成功則為已分配塊的指標,若出錯則為NULL。
sbrk
函式#include <unistd.h> void *sbrk(intptr_t incr); 返回:若成功則為舊的brk指標,若出錯則為-1。
釋放已分配的塊
#include <stdlib.h> void free(void *ptr);
垃圾收集
- 在顯示分配器中,應用通過呼叫
malloc
和free
來分配和釋放堆塊,應用要負責釋放所有不再需要的已分配塊。 - 未能釋放已分配的塊是一種常見的程式設計錯誤
- 垃圾收集器:一種動態記憶體分配器,它自動釋放程式不再需要的已分配塊,這些塊被稱為垃圾。
- 垃圾收集:自動回收堆儲存的過程
- 垃圾收集器定期識別垃圾塊,並相應地呼叫
free
,將這些塊放回到空閒連結串列中 - 將一個C程式的垃圾收集器加入到已存在的
malloc
包中