2018-2019-1 20165330 《信息安全系統設計基礎》第十一周學習總結
阿新 • • 發佈:2018-12-01
垃圾收集器 物理 free all 之間 之前 led 總結 com
學習目標
- 理解虛擬存儲器的概念和作用
- 理解地址翻譯的概念
- 理解存儲器映射
- 掌握動態存儲器分配的方法
- 理解垃圾收集的概念
- 了解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
包中
2018-2019-1 20165330 《信息安全系統設計基礎》第十一周學習總結