Java并发编程:虚拟内存之页面置换

121 阅读2分钟

src=http___i0.hdslb.com_bfs_article_807aa46619617caf3a3ea976300b575abae0676c.png&refer=http___i0.hdslb.webp 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、前言

       在上文《Java并发编程:虚拟内存之内存分配原理》,我们了解了虚拟内存的内存分配原理,在这其中,进行缺页中断的时候,会涉及到页面置换,本文将接下来为大家讲解下这块内容。

二、页面置换过程

       操作系统触发缺页中断时,会进行页面置换
       页面置换时,操作系统会先找到要置换到物理内存的磁盘页的位置。
       然后操作系统要在物理内存中选择要置换进来的页。如果当前物理内存剩余空间充足时,操作系统会选择一个空闲页等待置换;但是,如果当前物理内存剩余空间不足时,操作系统就会根据内存淘汰策略,选择一个要被置换的内存页,先将其数据持久化到磁盘,并更新该页面对应的页表数据,然后等待置换。
       接下来,操作系统会将磁盘页数据写入到等待置换的物理内存页中,并更新该页面对应的页表数据。

三、常用内存淘汰策略

最优算法(OPT)

       使用此算法,操作系统要先计算出将来哪个页面会永不使用,或者在最长时间内不会被访问,然后将这个页面进行淘汰。
       此算法是最佳算法,使用此算法可以最大程度的降低页面淘汰的次数,提高操作系统性能。但是操作系统却无法实现此算法,因为操作系统无法知道将来哪个页面会永不使用,或者在最长时间内不会被访问。

先进先出算法(FIFO)

       使用此算法,操作系统会根据内存页的写入顺序,维护一个链表。当要进行页面淘汰时,会将链表头部的页面淘汰掉。
       此算法的优点是实现简单,只需要维护一个链表即可。但是它的缺点也很明显,它无法适配热点数据,有可能先进来的内存页是热点数据,被淘汰掉以后,又要马上使用,然后就又要进行页面置换,很浪费操作系统性能。

最近最少使用算法(LRU)

       这是一个经常被使用的算法,熟悉Memcached或者Redis的同学,应该都有听说过它。
       此算法的核心思想是:在最近一段时间内,没有被访问过的内存页,将来被使用的概率也会比较低。因此,应该优先将其淘汰。

Linux使用的就是此算法。

四、后言

       既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~