`

Linux内存管理 ???继续看

 
阅读更多

这个专题详见这里:http://linux.ccidnet.com/art/741/20060718/642617_1.html

???继续看Bookmark bar上到两个专题"Linux内存管理" & “Linux虚拟内存实现原理”

 

1. free命令  

解释一下Linux上free命令的输出。

    下面是free的运行结果,一共有4行。为了方便说明,我们加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:


    FO[2][1] = 999212
    FO[3][2] = 305404
    1 2 3 4 5 6


    1 total used free shared buffers cached
    2 Mem: 999212 967476 31736 0 50668 223000
    3 -/+ buffers/cache: 693808 305404
    4 Swap: 2048276 154524 1893752

    free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。
    free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(free),第二列是使用量(free),第三列是可用量(free)。第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:
    999212KB(缺省时free的单位为KB)物理内存,即FO[2][1];在这些物理内存中有967476KB(即FO[2][2])被使用了;还用31736KB(即FO[2][3])是可用的;
    这里得到第一个等式:
    FO[2][1] = FO[2][2] + FO[2][3],即mem_total=mem_used+mem_free

    FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。
    FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候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.

    也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。
    Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:

    释放掉被系统cache占用的数据;echo 3>/proc/sys/vm/drop_caches

    读一个大文件,并记录时间;关闭该文件;重读这个大文件,并记录时间;
    第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。
    free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

    对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;
    因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。
    这里还用两个等式:
    FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]   ,即-/+buffers/cache_used = mem_used - mem_buffers - mem_cached

    FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6] ,即-/+buffers/cache_free = mem_free + mem_buffers + mem_cached

    free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有输出值都是从/proc/meminfo中读出的。

    在系统上可能有meminfo (2)这个函数,它就是为了解析/proc/meminfo 的。procps这个包自己实现了meminfo()这个函数。可以下载一个procps的tar包看看具体实现,现在最新版式3.2.8。

分享到:
评论

相关推荐

    深入理解Linux虚拟内存管理 英文版 PDF

    深入理解Linux虚拟内存管理,ISBN:9787810777308,作者:(爱尔兰)戈尔曼著;白洛等 作者简介 · · · · · · Mel Gorman曾获得爱尔兰利马瑞克大学的计算机学士和硕士学位。他的研究领域广泛:从网页开发到摄影...

    Linux操作系统内存管理

    而在未来两三年内,随着internet的继续发展以及电子商务的增长,这类基于LINUX的应用还会迅速增长。 以往,集群系统主要都是基于商业操作系统的。例如COMPAQ基于TRUE64 UNIX的集群产品TruCluster Server ; NOVELL的...

    Linux从入门到精通

    E.9.4 为什么Linux只能看到我的内存的一部分? E.9.5 我的奔腾或更高档的机器有超过64M的内存, 但是它似乎很迟钝. 如果我用mem=64M让Linux只用64M内存, 速度似乎加快了. 这是怎么回事? 我该做什么? E.9.6 我有Red ...

    《Linux从入门到精通》

    E.9.4 为什么Linux只能看到我的内存的一部分? E.9.5 我的奔腾或更高档的机器有超过64M的内存, 但是它似乎很迟钝. 如果我用mem=64M让Linux只用64M内存, 速度似乎加快了. 这是怎么回事? 我该做什么? E.9.6 我有Red ...

    linux从入门到精通.chm

    E.9.4 为什么Linux只能看到我的内存的一部分? E.9.5 我的奔腾或更高档的机器有超过64M的内存, 但是它似乎很迟钝. 如果我用mem=64M让Linux只用64M内存, 速度似乎加快了. 这是怎么回事? 我该做什么? E.9.6 我有Red ...

    2005详细介绍Linux从入门到精通

    E.9.4 为什么Linux只能看到我的内存的一部分? E.9.5 我的奔腾或更高档的机器有超过64M的内存, 但是它似乎很迟钝. 如果我用mem=64M让Linux只用64M内存, 速度似乎加快了. 这是怎么回事? 我该做什么? E.9.6 我有Red ...

    Linux的驱动机制及实现

    驱动程序为了与外设硬件进行交互,必须调用Linux内核提供的内存管理、文件系统等 多种功能函数。而用户态的程序只能通过系统调用来使用有限的内核功能,因此驱动程序在 linux系统中被安排在内核态运行,也即可以访问...

    xen管理手册

    的内存与 CPU 分配以及硬件驱动管理。 在虚拟化里管理 PCI 设备 Xen 环境下的内存与 CPU 分配:性能优化 Xen:完全虚拟化与准虚拟化的硬件驱动管理 创建快照 开源 Xen 不提供对快照的支持,而 Linux 能支持。由于开源 ...

    linux集群软件mosix

    适应性的资源管理算法具体上又包括适应性的负载平衡算法、内存引导算法和文件I/O的优化算法。这些算法都对集群中的资源使用情况的变化做出响应。如:节点上的不平衡的负载分布或由于内存不足而导致的过多的磁盘换入...

    Linux操作系统基础教程

    基本的系统管理命令.......................................................................................................14 五.关於 Process 处理的指令....................................................

    linux内核 0.11版本源码 带中文注释

    // 内存管理初始化(mm/memory.c, 399 行) extern long rd_init (long mem_start, int length); //虚拟盘初始化(kernel/blk_drv/ramdisk.c,52) extern long kernel_mktime (struct tm *tm); // 建立内核时间(秒...

    FRP-Linux服务端安装-一键安装脚本

    *因为frp是go语言写的,所以在路由器上使用的时候,请使用虚拟内存,请使用虚拟内存,请使用虚拟内存。 脚本是业余爱好,英文属于文盲,写的不好,欢迎您批评指正。 安装平台:CentOS、Debian、Ubuntu。 已测试过的...

    课程设计---操作系统课程设计之Linux磁盘空间管理.doc

    当中文组空闲块分配完后,则将下一组内容读入 内存专用块中,以便继续分配时查找。 实验结构图 各模块的伪码算法 1) 对位示图法 定义分配函数: void assign() { unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid; for(i=0...

    Node.js的内存管理.

    Node使用chrome的V8作为JS脚本引擎,因此Node的内存管理与V8关系很密切。因为V8是为浏览器环境设计的,所以内存限制很小,在64位系统下约为1.4GB,32位系统下约为0.7GB。在V8中,所有的JavaScript对象都是通过堆来...

    2010-2011华南理工大学操作系统课程设计(完整源代码和详细文档)

    编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: 盘块大小1k 空闲盘块的管理:Linux位图法 结构:超级块, i结点区, 根目录区 该simdisk管理程序的功能要求如下: info: 显示整个系统信息(参考...

    安装 SUSE Linux Enterprise Server --服务器版

    SUSE Linux Enterprise Server 安装与管理的详细信息。 有关 SUSE® Linux Enterprise Desktop 产品文档概述,请参阅 http://www .novell.com/documentation/sled10/index.html。 3 文档约定 以下是本手册中使用的...

    DarkShell_Linux-Win集群版V2014年

    集群管理在线主机,给在线主机指派指定任务,可针对目标IP进行集群攻击,单独目标攻击,循环遍历目标攻击,自动循环遍历查找有效攻击数据包,专门针对高防特防机房进行压力测试,威力强大,用前请谨慎。 DNS压力...

    vmm:在 Linux 上使用 KVM 的最小虚拟机管理器

    在 Linux 中使用 KVM 硬件支持的最低限度的虚拟机监视器。 使用make构建,它将编译 VMM 并组装“BIOS”。 这将创建一个具有 16MB 内存的 VM,并将实模式 BIOS 加载到来宾内存中的 0xf0000,该内存也映射到 0xffff...

    linux process explorer-开源

    该项目在github上继续进行,请参阅https://github.com/wolfc01/procexp/blob/master/README.md用于Linux的图形化过程浏览器。 显示过程信息:过程树,TCP IP连接和过程的图形性能数字。 旨在模仿sysinternals的...

    操作系统课程实验.rar

    (3) 通过 Linux 管道通信机制、消息队列通信机制、共享内存通信机制的使用,加深 对不同类型的进程通信方式的理解。 (4) 通过对 linux 的 Posix 信号量的应用,加深对信号量同步机制的理解。 (5)请根据自身情况,...

Global site tag (gtag.js) - Google Analytics