救命,Linux正在吃掉我的内存

 

内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大!

 

内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了!

 

Linux :你的容量那么大,空间闲着也是闲着,我啊,把那些空闲的空间都当成文件缓存了!

 

 

 

内存:  你看看你, 把这文件“拆成”了4K的碎片,这儿放一片,那儿放一片,把我的内存空间搞得乱糟糟的。

 

Linux :这叫做Page Cache , 其实一点也不乱,文件在哪一“片”内存中放着,我记得清清楚楚。我这么做也是不得已而为之啊,硬盘太慢,比你慢几万倍。CPU的一秒,你这里就是6分钟,硬盘那里就是好几个月!每次从他那里读点儿数据,几个月才给我回话, 我只好把读出来的数据先缓存到你这里了。 

 

 

内存看到这张表格,不由得咂舌:没想到这外面的世界如此之慢啊!

 

正在此时, 一个叫helloworld的程序要读取文件。 

 

helloworld :老大,我给你发了一个read系统调用,要读取config.txt的前1024个字节,把结果放到我的buffer中。 

 

Linux :好,让我看看config.txt是不是已经在Page Cache中了,真不巧,还没缓存过。内存老弟,我又要吃你的空闲空间了。 

 

Linux在内存中分配了一个4k 大小的page frame, 向硬盘发出DMA指令,读取cong.txt的4k的数据。

 

 

内存感觉奇怪:人家helloworld只要1024个字节,你干嘛让硬盘发过来4K数据? 

 

Linux :我这里Page cache 都是以4K为单位的, 读一次得等几个月,还不多读一点?再说helloworld这小子很可能继续读文件的后续部分,下次就不用访问硬盘了。

 

过了“几个月” , 硬盘的数据复制到了内存的Page cache 中

 

 

内存说:这就完事了吧? 

 

Linux :怎么可能!我得从Page cache 中取出前1024个字节,复制到helloworld指定的buffer 中。

 

这个buffer其实是helloworld虚拟地址空间heap上的地址,物理地址也是在你的内存中。

 

 

 

内存:我的天!难道数据要在我内存中出现两份?

 

Linux :没错!你不知道,复制数据还得用CPU呢!很费劲的。

 

helloworld:老大,能不能让我直接访问你Page cache 中的数据?

 

Linux :那怎么行,你在用户空间,我在内核空间,你要是能访问,在我这里捣乱怎么办?必须禁止!

 

内存:嗯,有道理,不过,要是还有个程序,也要读取config.txt的前1024个字节,怎么办?

 

Linux:  那就简单了啊, 我一查就知道数据已经在Page cache中了,不用等几个月从硬盘读了,直接复制到那个程序的缓冲区就行了。 

 

内存:啊?这数据重复太多了吧!

 

 

 

Linux :嗯,确实是个问题,现在这些程序,动辄访问几十个文件,每个程序都复制一份,确实是巨大的浪费。

 

内存:我给你支个招,既然那些程序运行访问的都是虚拟地址,你让这些虚拟地址映射到Page cache上,大家不就可以共享了。 

 

Linux :好主意,我来提供一个叫做mmap的系统调用,完成你说的功能。 

 

 

helloworld运行结束,退出了。 

 

内存:  helloworld退出了,你一会儿会清理掉对应的page cache吧?

 

Linux:暂时不会!

 

内存:啊?怪不得内存快被你吃光了!

 

Linux : 唉呀,你的内存闲着也是闲着,文件缓存着,下次再访问的时候,性能会有巨大提升!你放心,我会在合适的时机清理掉page cache的。 

 

内存:那如果helloword修改文件内容呢?会立即写入硬盘吗?

 

Linux :也不会,我只是标记这个Page cache “dirty”了, 然后我定期写入硬盘。

 

内存:你怎么能这样!这不是欺骗那些程序吗!那要是断电怎么办?

 

Linux:对于需要及时写入硬盘的,有两种办法,一是调用我提供的fsync方法强制写入硬盘,二是在访问文件的时候,可以指定不用Page cache。 

 

内存:相当于什么都没说,不用Page cache 多慢啊。 

 

Linux :你现在也知道page cache的重要性了吧。page cache 是一种比较通用的文件缓存机制,是我来管理的。有些应用,比如数据库,他需要更加灵活、更加复杂的文件缓存,那他就不用page cache ,自己另起炉灶了。 

 

内存:啊?数据库也在把我当作缓存?

 

Linux : 哈哈,是啊,要怪就怪硬盘吧,谁让它那么慢!不过他要是和你一样快,你小子就要下岗了,你想想,在一个访问速度超快,容量超大,还不怕断电威胁的存储器面前,你是不是就变成渣渣了?

 

内存叹了一口气: 好吧,我也管不了了,你们随意折腾吧。 


为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!
合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
如何一起学习,有没有免费资料?
欢迎学习 Java 的工程师朋友们加入的 Java 架构开发:820251827
本群提供免费的学习指导架构资料以及免费的解答
不懂得问题都可以在本群提出来之后还会有职业生涯规划以及面试指导

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值