本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
通过《Java并发编程:虚拟内存之LRU算法实现》,我们已经了解了Linux中的LRU算法(即最近最少使用算法)
的实现逻辑。本文将为大家继续讲解虚拟内存的页面抖动
和页面持久化
逻辑。
二、页面抖动
从前文中我们了解到,当物理内存
资源不足时,就会通过某种内存淘汰策略
选出要淘汰的内存页
,然后以页面置换
的方式,将被淘汰的页面置换掉。
但是在一些特殊情况下,操作系统会出现频繁置换内存页的情况,这种情况就被称之为页面抖动
。
页面抖动
的情况常见于某个应用程序频繁访问的内存页
数目大于物理内存
所能分配的页面数目,当应用程序运行时,由于物理内存
所能支持的页面数目不够,于是就出现了频繁置换内存页的情况。
页面抖动
会大量消耗操作系统内核的时间,降低系统性能。
三、页面持久化
Linux为了提高系统性能,当应用程序修改数据时,一般情况下,都是修改内存页
中的数据,并不会直接将数据写入到磁盘
,以此来降低系统IO请求。
那么,Linux是怎么将内存页
中的数据持久化到磁盘的?
内存页持久化流程
当应用程序修改了内存页
中的数据以后,Linux会给这个内存页
添加一个脏页标识
,表示这个页面被修改过了,然后Linux内核会通过线程来将这些脏页写入到磁盘,最后再去掉这些内存页
的脏页标识
。
内存页持久化时机
Linux会在以下三种情况对脏页进行持久化:
1. 当物理内存资源不足时,Linux要进行内存页置换
。在置换之前,如果这个页面是脏页,Linux会先将其数据持久化到磁盘;
2. 当内存中的空闲页面低于阈值时,Linux也会进行刷脏;
3. 当脏页在内存中存活的时候超过指定期限以后,Linux也会进行刷脏。
四、后言
既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~