[学习摘录]读和写,关于cache和buffer

监控linux时候总会遇到buffer和cache,但是总记得不大熟悉,以致于常搞颠倒。现在记录一下,多看看,希望不要忘记。

参考:http://www.examw.com/java/jichu/148131/ 

buffer和cache区别,我们一开始,先从Free命令说起。

  Free

  free 命令相对于top 提供了更简洁的查看系统内存使用情况:

  $ free

  total used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/+ buffers/cache: 26408 228860Swap: 265000 0 265000

  Mem:表示物理内存统计

  -/+ buffers/cached:表示物理内存的缓存统计

  Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。

  系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。

  我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。

  total1:表示物理内存总量。

  used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。

  free1:未被分配的内存。

  shared1:共享内存,一般系统不会用到,这里也不讨论。

  buffers1:系统分配但未被使用的buffers 数量。

  cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。

  used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。

  free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

  可以整理出如下等式:

  total1 = used1 + free1total1 = used2 + free2used1 = buffers1 + cached1 + used2free2 = buffers1 + cached1 + free1

  buffer 与cache 的区别

  A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use.

  更详细的解释参考:Difference Between Buffer and Cache

  对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣, 请参考:What is Shared Memory?

  cache 和 buffer的区别:

  Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据 要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了 CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache.

  Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

  Free中的buffer和cache:(它们都是占用内存):

  buffer :作为buffer cache的内存,是块设备的读写缓冲区

  cache:作为page cache的内存, 文件系统的cache

  如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。

转载请注明出处:http://www.cnblogs.com/haochuang/ 8年IT工作经验,5年测试技术与管理,2年产品与项目管理,曾参与过云计算\云存储\车联网产品研发工作; 业余自媒体人,有技术类垂直微信公众号;如有招聘或求职方面需求,请Mail to uetest@qq.com ;或通过 QQ:363573922 微博:@念槐聚 联系;

时间: 2024-12-22 14:35:42

[学习摘录]读和写,关于cache和buffer的相关文章

Python open()函数文件打开、读、写基础操作

说明:         python的文件读写和打开操作都有自己特定的函数和方法,操作起来很简单.下面就来简单的了解下python文件的文件基本操作方法有哪些. 一.Python open()函数文件打开操作     打开文件会用到open函数,标准的python打开文件语法如下: 1 open(name[,mode[,buffering]])     open函数的文件名是必须的,而模式和缓冲参数都是可选的.比如说有个a.txt的文本文件,存放在c:\text下,那么你要打开它可以这样操作:

Java的文件 读和写

1.流:它是通过缓冲机制将数据从生产者(如键盘.磁盘文件.内存或其他设备)传送到接受该数据的消费者(如屏幕.文件或者内存等)的这一过程的抽象.2.有关的Java包:Java.io包中包括许多类提供许多有关文件的各个方面操作.3.有关文件名及目录名的类:File 类独立于系统平台,利用构造函数File( String path).File(String path, String FileName).File(File dir, String name) 等创建出File 对象:再利用canRead

问题-刚开始学习java ,自己写了一个聊天小程序,没报错但是有毛病,希望能帮忙问一下

问题描述 刚开始学习java ,自己写了一个聊天小程序,没报错但是有毛病,希望能帮忙问一下 刚开始学习java ,自己写了一个聊天小程序,没有报任何错误.测试时打开3个聊天小窗口 A,B,C,在A中输入文字,只在B中显示出来了,而且显示出了三句相同语句.查了好几个小时都没有查出来,希望高手能帮帮忙,看看是怎么回事,并且告诉我是通过什么方法找出来的. 以下是客户端和服务器端代码 客户端: import java.awt.*; import java.awt.event.*; import java

c++-学习C++,要写一个邮件系统,需要如何入手?

问题描述 学习C++,要写一个邮件系统,需要如何入手? OOP课程的任务,小组要完成一个电子邮件系统,现在学习了C++,但是没有学过网络协议和数据库,请问我们该如何入手,有什么好的材料推荐? 谢谢各位! 解决方案 网上随便都能找到现成的能够完成邮件收发的服务端和客户端程序的.下载来看看吧,不用自己去写.逐步能看懂就行了. 解决方案二: 客户端用MAPI,Outlook,配合几行代码就能搭建一个,服务器端不用写,现成的.再不会,Google下也有很多.说实话,大学里面老师也是胡诌一个"课题&quo

VS能够通过网络读、写安卓系统里的文件吗?

问题描述 有一个安卓系统的设备,比如手机.电视,通过无线网络连接到网络,现在想通过VS开发的WinForm程序,直接去读.写网络上安卓系统设备里的文件,可以办到吗? 解决方案 解决方案二:只有电脑上共享目录可以供某些APP进行操作,还没有看到过反过来的共享.解决方案三:不可能--但你可以再写一个android程序,允许你客户端告诉你的android程序去怎么修改最常见的应用就是各种手机助手解决方案四:需要做个客户端到安卓系统里才行.由客户端处理你放送的操作再把结果返还给你.解决方案五:直接写安卓

ssh hibernate sql-SSH,mysql数据库,只能读不能写

问题描述 SSH,mysql数据库,只能读不能写 对数据库的内容进行操作,只能读取数据,不能写入不能修改,不能删除,但是Hibernate操作后打印是已经实现的,而且hibernate的SQL语句也出来了,但数据库就是岿然不动.....据说是Spring事务配置问题,但是我我不是很会...哪位大神能给我说说 解决方案 http://www.docin.com/p-609429137.html 解决方案二: service上要加上事物注解

用js读、写、删除Cookie代码续篇_javascript技巧

上次的一篇文章:用js读.写.删除Cookie代码分享及详细注释说明,在实践中发现了一些问题: 1.cookie在本地文件上只能在火狐上调试,IE和chrome无效 2.cookie没有设置为永不过期,只考虑了设置一个时间段就过期,显然不太合理. 这次给出的是比较合理的cookie操作代码: 复制代码 代码如下: var Cookie = {     get: function (k) {         return ((new RegExp(["(?:; )?", k, "

连接或读、写数据库时,如何获得的ORACLE错误编号,并根据错误编号,弹出自定义的错误信息

问题描述 想要实现下面的功能,不知道该怎样写.TRY{对数据库的读.写.或连接操作:}CATCH(){获得错误编号:IF错误编号=-MESSAGEBOX("1111"):ELSEMESSAGEBOX("222"):}由于ORACLE的错误信息对于用户来说可读性不是很强,所以想要转化成用户可以理解的信息.因此需要首先CATCH到错误编号,找到该编号对应的错误类型,再将错误信息转化成通俗易懂的方式反馈给用户.请高手多多指教,谢谢 解决方案 解决方案二:你可以建一个错误信

在一读一写限制下,无锁环形队列的实现

环形一读一写队列中,不需要担心unsigned long溢出问题,因为溢出后自动回归,相减值还会保留. 示例一(注:Max_Count 必须为 2 的指数,即:2, 4, 8, 16...): // 队列尺寸#define Max_Count    4096#define Max_Mask     4095     // = Max_Count - 1// 变量void*          List[Max_Count];unsigned long  Push_Count;unsigned lo