有关虚拟内存的一点思考

虚拟内存使用已经很久了,对于其中的关键技术,例如换页一直没有搞清楚,之前的题目做的也是一知半解。找到一篇文章,全篇看下来,总算明白了些,链接如下:https://www.cnblogs.com/qionglouyuyu/p/4175484.html

读完小结如下:

1.当前linux操作系统中,交换的技术已经不再使用,这会引起严重的性能损耗。在linux里,术语swapping用于指代paging。

2.交换技术中,会产生内存碎片。

3.操作系统管理内存,链式管理法更加有效。因为在内存中连续搜索大量的内存空间,是非常消耗资源的

4.虚拟内存,可以解决大进程的内存要求。每个进程有用独立的逻辑地址空间,内存被分为大小相等的多个块,称为页(Page).每个页都是一段连续的地址。对于进程来看,逻辑上貌似有很多内存空间,其中一部分对应物理内存上的一块(称为页框,通常页和页框大小相等),还有一些没加载在内存中的对应在硬盘上。

5.虚拟内存可以比物理内存要大很多,当内存管理单元去匹配对应的物理地址,如果虚拟内存的页不存在物理内存中,会产生缺页中断。这个频繁或者激增的缺页中断也会指示性能问题,在性能测试过程中需要注意,可能导致大的延时。

6.当虚拟内存所求的页不在物理内存中,此时物理内存的容量已满,需要把物理内存中的页替换出去,选择替换的算法,也是调优的方向。当前使用较多的是最近最少使用,和最近未使用。这两种内存会被移动到二级存储,仅在需要时再次搬回主存。

7.一个虚拟地址,大小4个字节,分为3个部分:第22位到第31位这10位(最高10位)是页目录中的索引,第12位到第21位这10位是页表中的索引,第0位到第11位这12位(低12位)是页内偏移。一个一级页表有1024项,虚拟地址最高的10bit刚好可以索引1024项(2的10次方等于1024)。一个二级页表也有1024项,虚拟地址中间部分的10bit,刚好索引1024项。虚拟地址最低的12bit(2的12次方等于4096),作为页内偏移,刚好可以索引4KB,也就是一个物理页中的每个字节。

8.高楼老师提到过,swap被用,性能肯定会下降,性能测试过程中,建议把swap直接关掉测试性能,让问题早点暴露。

9.windows下的虚拟内存设置,只是为了在物理内存不够时,作为对物理内存的一个补充,使用的是二级存储。和linux下的交换空间(swap)是一个概念。但上述提到的虚拟内存的页表,其实是1个表单,会占用一定的物理内存空间,但不会很大,尤其是使用了二级页表的技术后。回想我们当前项目,windows上运行,物理内存32G,已经够大了,却还要补充虚拟内存102G,因为做性能压测发现虚拟内存过小,会导致系统运行崩溃,开发甩锅说是虚拟内存配置不够导致(难道不是内存清理有问题?容量控制不当?)。但网上查,微软给出的建议是虚拟内存配置为物理内存的1.5倍到3倍之间。虚拟内存设置过小会不够用,设置的过大,会产生过多的碎片,影响电脑运行速度。我们的服务器,过一段时间就卡的要死,而且某些服务会响应特别慢,有理由怀疑和虚拟内存的设置有关!!

=========================

写完感觉思路理清了不少,读书是必要的,读完梳理思路,及时记录看来也非常必要。博客要坚持写才行了。

原文地址:https://www.cnblogs.com/jingmu/p/15038735.html