YNZH's Blog

虚拟内存

为什么会有虚拟内存?

我们知道计算机程序要运行必须要加载到物理内存中,很早的时候计算机系统设计中都是一次性将整个程序加载到内存中,然而随着计算机的发展物理内存的增长速度远比不上程序规模和数量的增长。类似与一个word程序可能会有很多功能代码,但是很多在实际中可能并不会使用,如果一次性加载进入物理内存会造成很大的浪费,同时一次性加载也会限制内存中进程的个数。但是我们可以将程序分段,根据需要动态的加载进入物理内存,这样既可以极大的节省物理内存,也会增加系统的并发。这种情况下我们可以看到一个程序或者进程只有部分片段加载到内存中,其他的很多片段暂存到磁盘中,即将计算机磁盘作为虚拟内存,对于程序员来说可使用的逻辑地址空间或者虚拟地址空间远远的大于实际的物理内存空间。下面要将到的分页就是一种常用的虚拟内存管理技术。

什么是分页?如何实现分页?

分页是一种虚拟内存管理技术,分页是指将物理内存按照固定大下的帧划分,如将大小为4M的内存划分为每帧1024个字节的大小,可划分出4K个大小相同的帧,同时按相同大小的帧大小对程序进行分页,那cpu在加载进程的时如何知道对应的虚拟地址到内存地址的转换呢?这就须要页表来实现映射关系,由于逻辑地址是从0开始一次增大的顺序划分的地址空间,所以页表中并不需要保存逻辑页号(默认从0开始索引页表),只需要保存虚拟页索引号对应的物理内存帧号以及偏移量,同时包含一些属性如脏位(已经加载到内存中的数据是否已经改变)、是否加载到内存中的标志位(如果没有就会产生缺页中断,切换到内核模式进行加载当前页)等等。由于物理内存很大、每帧或者页的大小很小就会使得页表很大就需要将页表放入物理内存中。分页不会产生外部碎片因为是按照帧来划分的,但是会产生内部碎片。

分页带来的问题?

上一个问题提到分页的页表很大,不能放入cache或i寄存器中,只能放入物理内存,这就导致每次访问一个物理地址需要先通过页表基寄存器得到页表地址,在访问页表,得到对应帧号和偏移量才能得到真正需要访问的物理地址,也就是说总共需要访问两次内存才可以,这使得系统性能直接下降一半。。。为了解决这个问题采用了转换表缓冲区( translation look -aside buffer, TLB)。 TLB是通过硬件实现的很小的页表可以实现快速的页表查询。同时借助页表完成TLB未能命中的补救。
此外还可以使用反向页表结合哈希技术解决。

分页和分段的区别

分页和分段系统有许多相似之处,但在概念上两者完全不同,主要表现在:
1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要,对用户是不可见的。
段是信息的逻辑单位,它含有一组意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。
段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。


 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。
载入天数...载入时分秒...