九.虚拟内存VM
1.寻址
2.虚拟页
VM将虚拟内存分割为称为
虚拟页的大小固定的块
1247是缓存的、36是未缓存的、05是未分配的
下图为缺页及处理后
页表将虚拟页映射到物理页
页表是一个页表条目(
PTE)的数组
多个虚拟页面可以映射到同一个物理共享页面
内存映射:将一组连续的虚拟页映射到一个文件中的任意位置的表示法
如果工作集的大小超出了物理内存的大小,页面将不断换进换出,即抖动
3.地址翻译
PPO=VPO
在MMU中包括一个关于PTE的小的缓存,称为翻译后备缓冲器(
TLB
)
若TLB有
个组,则TLBI由VPN的低t位组成,TLBT由VPN的其他位组成
多级页表
4.内存映射
将一个虚拟内存区域与一个磁盘上的对象关联,以初始化这个虚拟内存区域的内容
匿名文件:内核创建,包含是全是二进制0
用二进制0覆盖牺牲页面并更新页表,将这个页表标记为是驻留在内存中的。
私有对象的写时复制:
在物理内存中创建这个页面的一个新副本,更新页表条目指向这个新的副本,然后恢复这个页表的可写权限
fork将两个进程的每个页面都标记为只读、区域结构标记为写时复制。
在新进程返回时,虚拟内存相同,对任一个执行写操作时,写时复制创建新页面,因此为每个进程保持了私有地址空间的概念
execve("a.out", NULL ,NULL);
在当前进程中加载并运行a.out中的层序,用其替代当前程序。
删除已存在的用户区域、映射私有区域、映射共享区域、设置PC
void *mmap(void *start, size_t length, int prog, int flags, int fd, off_t offset);
mmap和函数创建新的虚拟内存区域,并将对象映射到这些区域中
start通常设为NULL
prog为访问权限位:CPU执行、可读2、可写、不能访问
flags描述映射对象类型的位组成:匿名对象、私有写时复制对象、共享对象
int munmap(void *start, size_t length);
删除虚拟内存区域,成功为0,失败为-1
5.动态内存分配
分配内存块时会
对齐
malloc不初始化它返回的内存
calloc将内存初始化为0
realloc可以改变一个以前已分配的块的大小
内部碎片:已分配块比有效载荷大
外部碎片:空闲内存合计足够满足分配请求,但单独哪个都不足够
隐式空闲链表:空闲块通过头部中的大小字段隐含地连接
假碎片:其他空闲块与新释放的空闲块相邻,就是有许多可用的空闲块被分割成小的、无法用的
边界标记:每个块的结尾加一个脚部,存放块大小和是否空闲,以便合并空闲块
显式空闲链表
分类存储:维护多个空闲链表,所有块分成一些等价类,即
size class(大小类)
简单分离存储:每个片大小相等,不分割,不合并,每个块内存开销很小,容易产生碎片
分离适配:块的大小不同,,做首次适配查找合适的块
伙伴系统:每个size class的大小是2的幂,递归地二分割
6.垃圾收集
标记:根节点的所有可达的和已分配的后继
垃圾:未标记的已分配块
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/395815.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!