Linux 内存管理四

  1. Page cache 理解,Page cache 实际是一块内存,linux 读取一个文件,会先看看page cache 是否命中,如果没有命中,先把文件读到page cache ,再从page cache 读文件。如果是写的,也是先写入page cache区域,linux应用程序的write 已经返回,什么时候真正写入磁盘,这是linux内存磁盘替换算法的事情。
  2. Linux 读写文件有两种方式,read/write  mmap 。read write好处是可以流控,每次写入接着上次的,mmap是减少了page cache和内存的拷贝过程,每次都是直接操作用户空间指向page cache的内存,性能更高。所以如果page cache 命中,会很大程度提高性能。比如我们运行一个a.out ,第一次时间要比第二次时间长很多。这就是cache 影响的性能。 我们可以用 echo 3 > /proc/sys/vm/drop_caches 来丢掉cache。

     

    Page cache 在linux有两种形式,cached 与buffers。

    Cached 是以文件为背景的page cache,比如分区A 中的三个文件 a b c ,那么读a b c产生的page cache 是在cached 这里。

    Buffers 是以裸分区为北京的page cache ,比如你读取sda ,那么产生的page cache 是在buffers这里。

还有一个特例,对于文件系统,比如ext4也会直接访问裸分区,比如文件系统的meta data还是裸分区访问。

不论cached 还是buffers 都是文件的缓存。所以新版本的free命令把他们合在一列了。

有文件背景的页面,内存是文件的副本,在出现内存不够的时候。Linux系统会回收这些内存,也有一些一般不能被直接回收的,比如堆,栈,数据段等一般不会被回收,这些是没有文件背景的,也叫匿名页,这些通常常驻内存。Linux 为了回收匿名页,伪造了一个文件背景,也就是linux 里面的swap分区。匿名页就可以被交换到这里面,在window 里面就叫做虚拟内存(pagefile.sys).swap的算是LRU:最近最少使用的页面swap出去

回收的两种方式:

桌面系统一般会使能swap分区,增大内存,嵌入式系统通常是关闭swap分区的,因为一旦使能后,匿名页就是经常写flash ,一是速度慢,而是flash 寿命有限。

嵌入式系统可以使用Zram ,利用cpu的算力自动压缩,达到增大内存的效果,这是一个非常巧妙的设计:

我们公司android 项目中ZRAM默认也是打开的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章