课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
对于程序员来说,除了需要了解软件编程代码以外,对于计算机的内存机制等硬件上的知识也是需要熟练掌握的,下面我们就通过案例分析来了解一下,目前互联网背景下的计算机内存机制发展变化。
1、早期的内存机制
在计算机发展早期,操作系统对于内存处理机制都是有多少内存用多少内存,系统本身的内存地址和操作系统中应用的内存地址在物理内存上都是一一对应的。当你写了一个软件并运行,其中一个变量的地址打印出来是0x000FF1,那么这个变量的实际储存地址就是物理内存上的0x000FF1这个位置。这种原始的内存处理方式,配合C语言中自由度极高的指针,带来了很多可能。程序员想要把其他应用在内存中的片段给引用到自己的软件中运行,直接将对应内容地址加载即可。实际上当年很多应用都是这么做的,通过这种手段避免了重复加载运行库的内容。
当然,这么做除了容易导致崩溃之外,还存在另一个比较严重的问题:在计算机蛮荒的时代,内存作为计算机中重要的高I/O性能硬件,价格是非常高的。如果操作系统和应用需要将所有运行内容都加载进内存,那么一个128MB的软件就会需要128MB的物理内存,考虑到操作系统自身的内存占用还会需要更多内存。
为了解决这么一个昂贵的硬件问题,操作系统的内存Paging机制被建立了起来。
2、虚拟内存
操作系统开发者发现,当一个应用加载进内存之后,并不是所有的内存内容都会随时被应用使用到。包括操作系统本身在内的应用,被完全加载进内存之后,也不是所有内容都会在同一时间被完全用上。那么是不是可以将部分暂时不用的内存内容,从内存移到硬盘上,等到需要的时候再从硬盘中读取呢?事实证明这个想发是可行的。
如果今天你手动安装过Linux系统,在安装时需要给系统设定一部分的Swap硬盘区域。在Windows系统中如果打开系统设置,也能找到虚拟内存的对应调整选项。这里的Swap和虚拟内存,就是Paging机制下系统在硬盘上建立的暂存内存数据的位置。
自此,应用程序真正能访问到的内存地址,和物理内存中的地址,被完全的分离开了。一个128MB的内存在合理的运用下可以配合1GB以上的硬盘(虚拟内存)完成binary大小高达1GB程序的运行。
3、Page-In,Page-Out
当一个应用开始运行时,操作系统会加载应用到内存中,这个过程我们称之为Page-In。当操作系统加载一段内容之后,突然发现物理内存不够继续加载更多内容了,这时候就需要释放一部分内存,也就是把之前的一部分内存里内容移动到虚拟内存上,这个过程我们称之为Page-Out。
由于Page-Out是一个将内存内容写到硬盘上的高I/O消耗操作,所以操作系统会尽量防止这种操作,也就是在Binary加载时尽量将足够多的内容加载到内存中。当然系统是不知道Binary里面哪些是需要使用,哪些是不需要使用的,所以系统实际上是尽量保证Binary头部的内容被加载到内存中,而剩下没有办法加载进去的部分,则放在硬盘的虚拟内存中。
4、PageFault
现在我们应用的Binary被加载完了,其中一部分在内存里,一部分在虚拟内存里,当然我们应用自己是不知道那些在内存里那些在虚拟内存里的,对于我们来说这都是一样的。然后我们应用开始运行,这时我们向操作系统请求内存里的内容,如果这个内容刚好在内存里,一切顺利;如果这个内容实际山并不是在内存里,而是在虚拟内存里,操作系统就需要把请求的内容从硬盘加载到内存中。就算是在现在,内存的I/O速度和硬盘I/O速度依旧存在数量级的差距,所以把内存中的内容移动到虚拟内存再移动回去,必然会产生不小的I/O开销。针对这种应用访问了在虚拟内存内容的情况,我们称之为PageFault。
进入现代之后,随着人们对电脑的使用量增加,大众对于操作系统稳定性、安全性的要求越来越高,所以在Paging机制的基础上,内存鉴权机制、ASLR(进程地址空间布局随机化)、签名验证机制都被加了进来。在iOS上,发生PageFault的时候,由于系统从虚拟内存中拿出内容放到内存中时,会再次进行签名验证防止出现非法代码注入,所以PageFault的开销就比想象中更大了。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。