©author:zzb
文章目录
- 12.虚拟存储器
- 虚拟内存
- 流程
- 设计
- 分页式虚拟存储器
- 页表
- 快表TLB
- CPU访存过程
- 缺失组合
- 分段式虚拟存储器
- 段页式虚拟存储器
12.虚拟存储器
系统软件并不是操作系统
实用程序一般是指程序的创建,文件管理等
当然操作系统本身也是一个程序,自身还是需要占用资源的,同时又在分配计算机的资源
通过仅将当前需要的页调用主存,其他的页暂时放在外存上,可以让主存中尽可能多的包含更多的任务,提高CPU的利用率
分区方式:(系统区占用的大小在不同分区方式中都是一样的,不同分区方式是针对用户分区的)
- 简单固定分区:把用户区划分成长度不等的固定长度的区域,给任务分配一个可用且可以容纳它的最小分区。注意一个分区只能放一个任务,不能多个任务一起放在一个分区,因此会非常浪费内存
- **可变长分区:**根据任务需要的大小来分配内存,提高主存利用率,但时间长了之后,碎片会变多,这些碎片很难被利用
利用页可以使得一个任务的不同页不需要用连续的页框来存储,注意这里是把一个任务的所有部分都分成页装进来(还不是下面的请求分页的思想)
虚拟内存
任务越来越多,对内存的需求越来越大
基本思想:
- 请求分页:仅仅把需要的页面载进来,而不是把任务的所有页都载进来。因此会存在未命中的问题
优点:
- 在物理内存不变的情况下,可以载入更多的任务
- 编写程序时无需考虑物理内存的情况,因此程序可以在不同内存大小的计算机上运行
- 可以在比物理内存还大的虚拟地址空间中编程
流程
所有使用的页面要载入到硬盘里,当前使用的页面载入到内存里,同时被替换且已经被修改的页重新存储到硬盘中,即写回法
设计
cache比主存快10倍,而主存比硬盘快100000倍,因此在cache中缺失来访问主存比在内存中缺失来访问硬盘的开销要小很多,所以要尽可能减少对硬盘的访问
- 增大页大小,一次能多加载些:如4KB
- 使用关联映射,增大命中率
- 采用写回法,减少对硬盘的访问
分页式虚拟存储器
程序运行时,会生成一个页表,记录程序所有虚拟页的信息,页表同样也是存在内存里
页表
在页表中,虚拟页号是不用记录的,因为页表中是所有页的信息,数组的下标就代表了页的标号
物理地址和虚拟地址的页内地址是一样的,所以只要替换虚拟页号就可以,一般来说,虚拟地址的长度会比物理地址的长度要长
快表TLB
页表的使用增加了主存的访问,每次访存都要通过页表去得知这个虚拟地址所对应的物理地址是多少,而之前的cache就是要尽可能减少主存的访问
而页表很大,不能全部放到cache中,所以把最活跃使用的几个页表项放到cache中,称为快表(TLB),对应的主存中的页表就称为慢表
快表采取关联/组关联映射,增大命中率;替换方法采用随机替换法
CPU访存过程
如果在TLB中hit了,那么这个页一定已经被载入内存中了。
要出现TLB中命中但页没有被载入的情况,只有一种可能就是,TLB中有记录,但主存中对应的那一页被其他页给替换了,但这时新的页进来,那么TLB和页表自然也要更新,所以只要把刚刚被替换掉的那一页的记录也给替换掉即可。这样就可以保证TLB中的记录一定是已经被载入的
缺失组合
第8种情况和上面的TLB命中必定载入同理,当一个页从主存中被替换出去后,cache中也会发生替换,那么这个新的数据自然是去把被替换掉的页的信息给替换掉最好
TLB缺失可以由硬件处理也可以由软件处理
缺页由软件处理,虚拟地址到物理地址的转换由硬件处理
分段式虚拟存储器
分页式可能会把数据分到不同的页,不利于保护和管理
分段式和前面的分区类似,但同样是把需要的段载入内存中去,而不是和前面的分区那样是全部载入。同样会出现碎片化的问题
段页式虚拟存储器
每一个段都有一个自己的页表
img-sfYeMUje-1656554972342)]
每一个段都有一个自己的页表[外链图片转存中…(img-dHhmtGqX-1656554972343)]
[外链图片转存中…(img-0xYxihWU-1656554972344)]