本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
在上文《Java并发编程:虚拟内存之内存分配原理》,我们了解了虚拟内存的内存分配原理,在这其中,进行缺页中断
的时候,会涉及到页面置换
,本文将接下来为大家讲解下这块内容。
二、页面置换过程
操作系统触发缺页中断
时,会进行页面置换
。
页面置换
时,操作系统会先找到要置换到物理内存的磁盘页
的位置。
然后操作系统要在物理内存
中选择要置换进来的页。如果当前物理内存
剩余空间充足时,操作系统会选择一个空闲页等待置换;但是,如果当前物理内存
剩余空间不足时,操作系统就会根据内存淘汰策略
,选择一个要被置换的内存页,先将其数据持久化到磁盘,并更新该页面对应的页表
数据,然后等待置换。
接下来,操作系统会将磁盘页
数据写入到等待置换的物理内存页
中,并更新该页面对应的页表
数据。
三、常用内存淘汰策略
最优算法(OPT)
使用此算法,操作系统要先计算出将来哪个页面会永不使用
,或者在最长时间内不会被访问
,然后将这个页面进行淘汰。
此算法是最佳算法
,使用此算法可以最大程度的降低页面淘汰的次数
,提高操作系统性能。但是操作系统却无法实现此算法,因为操作系统无法知道将来哪个页面会永不使用,或者在最长时间内不会被访问。
先进先出算法(FIFO)
使用此算法,操作系统会根据内存页的写入顺序,维护一个链表
。当要进行页面淘汰
时,会将链表头部的页面淘汰掉。
此算法的优点是实现简单,只需要维护一个链表即可。但是它的缺点也很明显,它无法适配热点数据,有可能先进来的内存页是热点数据,被淘汰掉以后,又要马上使用,然后就又要进行页面置换
,很浪费操作系统性能。
最近最少使用算法(LRU)
这是一个经常被使用的算法,熟悉Memcached或者Redis的同学,应该都有听说过它。
此算法的核心思想是:在最近一段时间内,没有被访问过的内存页,将来被使用的概率也会比较低。因此,应该优先将其淘汰。
Linux使用的就是此算法。
四、后言
既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~