写过代码的人对程序运行的大致流程应该都不陌生:数据先由硬盘读取进内存,之后CPU再与内存展开一系列的数据交互和运算,最终完成既定操作(当中的具体实现远比这复杂得多),程序功能由此得以呈现。
不过,内存空间终归有限,加上内存本身价格不菲(当下主流使用的是双倍速率SDRAM),普通用户想要扩容内存,通常都得花上一笔不小的钱。
接下来,余初云打算带大家聊聊一个话题——当电脑内存捉襟见肘时,虚拟内存技术能起到怎样的作用。正是虚拟内存的出现,才让内存紧张的问题得到了一定程度的纾解,顺带提一句,部分文献里也把虚拟内存叫做交换内存,大家留意一下即可。
1. 正式聊虚拟内存之前,先铺垫几个概念
计算机的内存其实分为两类:物理内存和虚拟内存(这里要特别区分虚拟内存与虚拟地址空间这两个不同的概念)。所谓物理内存,指的就是由RAM芯片构成的、计算机真实拥有的内存容量;而虚拟内存则并非真实存在的硬件资源,它是借用磁盘空间”伪装”成内存来使用的一种技术手段。
2. 虚拟内存究竟是怎么运作的
前面已经提到过,一旦系统的物理内存吃紧,系统就会想办法腾出物理内存里的一部分空间,好让当前正在跑的程序能够继续使用。
而这些被腾出来的空间,多半来自那些长期处于闲置、没什么活动的程序——它们占用的内存会被暂时挪到交换空间里存放,等到这些程序日后需要重新启动运行时,系统再把之前保存的数据从交换空间中读取回内存。
3. Linux下虚拟内存的两种落地方式
在Linux系统里,实现虚拟内存主要有两条路径:交换分区(也就是swap分区)和交换文件。
交换分区
所谓交换分区,说白了就是划出一个新的磁盘分区,然后把它挂载起来充当交换空间使用,整个操作流程和平时新建分区没什么两样,唯一的区别在于,格式化和挂载这两步分别要用到mkswap和swapon这两条命令。
交换文件
如果硬盘上实在腾不出空间来专门划一个交换分区,那也可以退而求其次,手动建一个交换文件,把RAM里那些不活跃的内容临时交换存放进去。
4. 交换权重该怎么设置比较合适
Linux系统支持用户自行调节交换权重,通俗点说,就是可以自己决定系统触发交换动作的积极程度。这个数值的可设置区间是0到100,数值越低,内核就越倾向于少用交换机制;数值越高,内核就会越频繁地调用交换空间。
交换权重这项参数的默认值以及官方建议值都是60,如果有朋友对此感兴趣,不妨专门去研究一下swappiness这个Linux内核参数,具体细节这里就不多展开了。
5. 用虚拟内存到底能带来哪些好处
- 能把那些长期占着位置却几乎用不上的RAM区块轻松腾挪出来,然后把这部分空出来的RAM让给优先级更高的程序去使用。
- 有效避免RAM彻底耗尽、导致其他程序根本无法启动运行的尴尬局面。
- 相当于给RAM配了一个后备资源池,变相扩大了RAM可用的实际容量。
- 系统进入休眠状态时,RAM里的所有数据都要写入交换空间保存,因此想让休眠顺利完成,虚拟内存是绕不开的必要条件。
- 只要内核参数swappiness设置得当,虚拟内存还能对系统整体性能起到提升作用。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/3257.html
