内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是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 : 哈哈,是啊,要怪就怪硬盘吧,谁让它那么慢!不过他要是和你一样快,你小子就要下岗了,你想想,在一个访问速度超快,容量超大,还不怕断电威胁的存储器面前,你是不是就变成渣渣了?

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

文件读取 linux_救命,Linux正在吃掉我的内存相关推荐

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

    内存发现自己的空闲空间越来越少,经过一番调查,发现罪魁祸首居然是Linux老大! 内存:Linux老大,这也没几个程序在运行,可是你为什么老是占用我的内存啊,内存都快被你吃光了! Linux :你的容 ...

  2. Linux中文件写保护,Linux_在Linux下创建写保护的文件的教程,假如你想对Linux中的一些重要 - phpStudy...

    在Linux下创建写保护的文件的教程 假如你想对Linux中的一些重要文件做写保护,这样它们就不能被删除或者被篡改成之前的版本或者其他东西,或者在其他情况下,你可能想避免某些配置文件被软件自动修改.使 ...

  3. 超大Excel文件读取(支持50w+)(三)

    超大Excel文件读取(支持50w+) 1 线上内存溢出问题演示 环境准备 准备一个大的excel文件(xlsx大小10M及以上) 将jvm的heap缩小到500m(JVM 参数 -Xmx500m)用 ...

  4. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  5. MOCTF PUBG 反序列化+文件备份+linux文件读取

    MOCTF-PUBG 简介: 考点: 题目总览: 简介: 这道题考核了很多ctf的有关知识点,我也纠结了好久才可以彻底明白,今天发出来自己的解题思路和大家分享一下... 考点: php反序列化漏洞,文 ...

  6. linux读取手机文件,linux at命令和batch从输入或指定文件读取命令

    linux at命令和batch从输入或指定文件读取命令 2009-12-31 11:43:57   出处:https://www.yqdown.com linux at命令和 batch 从准则 输 ...

  7. Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令

    文章目录 一.命令介绍 二.命令格式 三.命令示例 一.命令介绍 source 命令会在当前 Shell 环境中从指定文件读取和执行命令.source 命令通常用于重新执行刚修改的初始化文件,使之立即 ...

  8. linux文件的权限模式,Linux文件权限和访问模式

    为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限: 所有者权限:文件所有者能够进行的操作 组权限:文件所属用户组能够进行的操作 外部权限(其他权限):其他用户 ...

  9. 安全研究 | Jenkins 任意文件读取漏洞分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室 发表于云+社区专栏 一.漏洞背景 漏洞编号:CVE-2018-1999002 漏洞等级:高危 Jenkins 7 月 18 ...

最新文章

  1. CVPR 2019超全论文合集新鲜出炉!| 资源帖
  2. poj1236(强连通分量)
  3. SAP SD基础知识之订单中装运相关的功能 II
  4. java 调用存储过程structdescriptor,Java调用oracle存储过程,集合入参的正确姿势
  5. 驱动硬件Framebuffer驱动程序框架 skeletonfb.c 分析
  6. 7-137 凯撒密码 (20 分)
  7. python运维开发笔记5
  8. opengl学习笔记(四)
  9. python netsnmp_在Ubuntu18.04中关于Python使用netsnmp进行snmp编程
  10. MaxCompute实战之数据存储
  11. Nginx 的 server_names_hash_bucket_size 问题
  12. 主机托管与DRaaS的真正区别原来是这样 你猜对了吗?
  13. SQL语句:查询语句及多表查询典型例子
  14. origin柱状图坐标标签_origin菜鸟求助。如何做横坐标连续(如下图)的柱状图?...
  15. Intellij IDEA 使用教程(十三)IDEA内存优化
  16. 李白藏头诗鸿蒙,【表白的诗句藏头诗】表白的诗句60句
  17. Dell Precision M4800 VoodooPS2Controller 键盘/触控驱动修复过程
  18. 【Python】pyecharts 数据可视化模块
  19. 算法:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.
  20. 《隐私政策》及《用户服务协议》

热门文章

  1. 小程序中封装的ajax 方法
  2. 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)
  3. 微信支付官方SDK V3 .NET版的坑
  4. Fragment生命周期及其使用
  5. gulp-notify处理报错----gulp系列(二)
  6. 如何手动修改XP系统属性中的技术支持信息
  7. python类似微信未读信息图片脚本
  8. 查了一晚上的资料,累啊。
  9. JS核心基础数组的操作概述
  10. 精通Android自定义View(九)绘制篇Canvas分析之绘制图片