2018-2019-1 20165330 《信息安全系统设计基础》第十一周学习总结
学习目标
- 理解虚拟存储器的概念和作用
- 理解地址翻译的概念
- 理解存储器映射
- 掌握动态存储器分配的方法
- 理解垃圾收集的概念
- 了解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
包中