文档库 最新最全的文档下载
当前位置:文档库 › Linux 内存维护

Linux 内存维护

Linux 内存维护
Linux 内存维护

Linux 内存维护

1Linux free命令详解

1.1Mem行:

total(1002M) = used(769M) + free(232M)

1.2-/+ buffers/cache行

1.2.1-buffers/cache

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

1.2.2+buffers/cache

未被使用的buffers 、cache 与未被分配的内存之和,即当前系统实际可用内存

1.2.3解释.

对操作系统:.buffers/cached 都是属于被使用,free只有232M,其中包括:

对应用程序:.buffers/cached 是等同可用的,因为buffer/cached是为了提高程序执行的性能,当应用程序需要用到内存时,buffer/cached会被很快地

回收。所以从应用程序的角度看

1.3Swap行

交换分区。内存是拿来用的,不是拿来看的。不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么常常提示虚拟空间不足的原因,硬盘怎么会快过内存。所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少。如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准。

2Linux /proc/meminfo详解

3Cached Memory释放

当你读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。两种主要Cache方式:

即使程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux 系统中程序频繁读写文件后,可用物理内存会很少。

Cache Memory在你需要使用内存的时候会自动释放,所以不必担心没有内存可用。如果你希望手动释放Cache Memory,用下面的命令可以释放:

4参考内核代码:

arch/i386/mm/init.c

fs/proc/proc_misc.c

include/linux/swap.h

mm/filemap.c

fs/buffer.c

linux内核之内存管理

Linux内核之内存管理 作者:harvey wang 邮箱:harvey.perfect@https://www.wendangku.net/doc/2a15872991.html, 新浪博客地址:https://www.wendangku.net/doc/2a15872991.html,/harveyperfect,有关于减肥和学习英语相关的博文,欢迎交流 把linux内存管理分为下面四个层面 (一)硬件辅助的虚实地址转换 (二)内核管理的内存相关 (三)单个进程的内存管理 (四)malloc软件 (一)处理器硬件辅助的虚实地址转换(以x86为例) 在x86中虚实地址转换分为段式转换和页转换。段转换过程是由逻辑地址(或称为虚拟地址)转换为线性地址;页转换过程则是将线性地址转换为物理地址。段转换示意图如下 X86支持两种段,gdt和ldt(全局描述段表和局部描述符段表),在linux中只使用了4个全局描述符表,内核空间和用户空间分别两个gdt,分别对应各自的代码段和数据段。也可以认为在linux中变相地disable了x86的段式转换功能。 页转换示意图如下

在linux中x86 的cr3寄存器(页表基地址寄存器)保存在进程的上下文中,在进程切换时会保存或回复该寄存器的内容,这样每个进程都有自己的转换页表,从而保证了每个进程有自己的虚拟空间。 (二)内核管理的内存相关 从几个概念展开内存管理:node、zone、buddy、slab 1、Node SGI Altix3000系统的两个结点 如上图,NUMA系统的结点通常是由一组CPU(如,SGI Altix 3000是2个Itanium2 CPU)和本地内存组成。由于每个结点都有自己的本地内存,因此全系统的内存在物理上是分布的,每个结点访问本地内存和访问其它结点的远地内存的延迟是不同的,为了优化对NUMA 系统的支持,引进了Node 来将NUMA 物理内存进行划分为不同的Node。而操作系统也必须能感知硬件的拓扑结构,优化系统的访存。

linux查看内存和CPU详解

Linux的缓存机制:Linux会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。 操作步骤: 1、查询当前内存使用情况和释放缓存的参数 #free -m #cat /proc/sys/vm/drop_caches 2、使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件。 #sync 3、配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,含义:默认0—不释放,1—释放pagecache,2—释放dentries和inodes,3—释放所有缓存 #echo 3 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches total——总物理内存 used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存 free——完全未被使用的内存 shared——应用程序共享内存 buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)cached——缓存,用于已打开的文件 note: Tasks: 150 total 进程总数 2 running 正在运行的进程数 148 sleeping 睡眠的进程数 0 stopped 停止的进程数 0 zombie 僵尸进程数 Cpu0: 67.4% us 用户空间占用CPU百分比 2.0% sy 内核空间占用CPU百分比 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 30.2% id 空闲CPU百分比 0.0% wa 等待输入输出的CPU时间百分比 0.0% hi 0.0% si 0.0% st cpu 统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。 序号列名含义 a PID 进程id

linux内存管理子系统 笔记

4-4 linux内存管理子系统 4-4-1 linux内存管理(参考课件) 物理地址:cpu地址总线上寻址物理内存的地址信号,是地址变换的最终结果 逻辑地址:程序代码经过编译后,出现在汇编程序中的地址(程序设计时使用的地址) 线性地址:又名虚拟地址,32位cpu架构下4G地址空间 CPU要将一个逻辑地址转换为物理地址,需要两步: 1、首先CPU利用段式内存管理单元,将逻辑地址转换成线性地址; 2、再利用页式内存管理单元,把线性地址最终转换为物理地址 相关公式: 逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器)(通用的) 16位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值×16+逻辑地址的偏移部分 物理地址=线性地址(没有页式管理) 32位CPU:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 线性地址=段寄存器的值+逻辑地址的偏移部分 物理地址<——>线性地址(mapping转换) ARM32位:逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 逻辑地址=段内偏移量(段基地址为0) 线性地址=逻辑地址=段内偏移量(32位不用乘以32) 物理地址<——>线性地址(mapping转换) ************************!!以下都是x86模式下!!********************************* 一、段式管理 1.1、16位CPU:(没有页式管理) 1.1.1、段式管理的由来: 16位CPU内部有20位地址总线,可寻址2的20次方即1M的内存空间,但16位CPU 只有16位的寄存器,因此只能访问2的16次方即64K。因此就采用了内存分段的管理模式,在CPU内部加入了段寄存器,这样1M被分成若干个逻辑段,每个逻辑段的要求如下: 1、逻辑段的起始地址(段地址)必须是16的整数倍,即最后4个二进制位须全是0 (因此不必保存)。 2、逻辑段的最大容量为64K。 1.1.2、物理地址的形成方式: 段地址:将段寄存器中的数值左移4位补4个0(乘以16),得到实际的段地址。 段偏移:在段偏移寄存器中。 1)逻辑地址=段基地址+段内偏移量(段基地址寄存器+段偏移寄存器) 2)由逻辑地址得到物理地址的公式为:(因为没有页式管理,所以这一步就得到了物理地址)物理地址PA=段寄存器的值×16+逻辑地址的偏移部分(注意!!)(段与段可能会重叠)

linux如何查看CPU,内存,机器型号,网卡信息

linux如何查看CPU,内存,机器型号,网卡信息 查看CPU信息(型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz (看到有8个逻辑CPU, 也知道了CPU型号) # cat /proc/cpuinfo | grep physical | uniq -c 4 physical id : 0 4 physical id : 1 (说明实际上是两颗4核的CPU) PS:Jay added on 10th, May, 2011 # 其实是可能有超线程HT技术,不一定是有4核,也可能是2核4线程;当时还理解不清楚 # getconf LONG_BIT 32 (说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit) # cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l 8 (结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit) 再完整看cpu详细信息, 不过大部分我们都不关心而已. # dmidecode | grep -A81 'Processor Information' 查看主板型号: # dmidecode |grep -A16 "System Information$" 内存槽及内存条: # dmidecode |grep -A16 "Memory Device$" 查看内存信息 # cat /proc/meminfo # uname -a Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux (查看当前操作系统内核信息) # cat /etc/issue | grep Linux Red Hat Enterprise Linux AS release 4 (Nahant Update 5) (查看当前操作系统发行版信息)

Linux查看CPU和内存使用情况

Linux 查看CPU 和内存使用情况 在系统维护的过程中,随时可能有需要查看CPU 使用率,并根据相应信息分析系统状况的需要。在CentOS 中 可以通过top 命令来查看CPU 使用状况。运行top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式-- 用基于top 的命令,可以控制显示方式等等。退出 top 的命令为q (在top 运行中敲q 键一次)。 top 命令是Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows 的任务管理器 可以直接使用top 命令后,查看%MEM 的内容。可以选 择按进程查看或者按用户查看,如想查看oracle 用户的进程内存使用情况的话可以使用如下的命令: $ top -u oracle 内容解释: PID :进程的ID USER :进程所有者 PR:进程的优先级别,越小越优先被执行 NInice :值 VIRT :进程占用的虚拟内存 RES:进程占用的物理内存

SHR :进程使用的共享内存 僵死状态, N 表示该进程优先值为负数 %CPU :进程占用CPU 的使用率 %MEM :进程使用的物理内存和总内存的百分比 TIME+ :该进程启动后占用的总的 CPU 时间,即占用 CPU 使用时间的累加值。 COMMAND :进程启动命令名称 操作实例 : 即可启动 top top 的全屏对话模式可分为 3 部分:系统信息栏、命令 输入栏、进程列表栏。 第一部分 -- 最上部的 系统信息栏 第一行( top ): 00:11:04”为系统当前时刻; 3:35”为系统启动后到现在的运作时间; “2 users ”为当前登录到系统的用户,更确切的说 是登录到用户的终端数 -- 同一个用户同一时间对系统多个 终端的连接将被视为多个用户连接到系统,这里的用户数也 将表现为终端的数目; S :进程的状态。 S 表示休眠, R 表示正在运行, Z 表示 在命令行中输入 “- ” top ”

《深入理解LINUX内存管理》学习笔记.

引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读。阅读英文原版,可以很好的理解作者的思路。作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习,系统化的学习一下LINUX kernel。 3,自己一直在做一个too small,too simple的单进程,特权模式,64bit保护模式的称不上OS的OS,已经做完了bootloader, 构思kernel的实现的时候,困惑在内存管理的实现上,阅读这本书,希望能有利于自己的OS的编写。 4,克服惰性,多读书,希望一天能阅读5页,争取半年内阅读完这本原版700多页的巨著。 不足: 我不可能完全理解LINUX 内存管理的精髓,肯定有很多地方理解错误。希望大家能够指正,以便提高,谢谢。 学习方法: 可能您第一次阅读的时候很多地方都不理解,不用担心。那您可能需要阅读一些文件系统的知识。 或者阅读全部笔记后,再回头阅读,有些地方您就理解了。 言归正传: 一、概要 可用工具 CodeViz: 生成代码调用关系图的工具,这个工具我现在还没有去使用,有兴趣的可以自己试试去建立调用关系图。 http://www.csn.ul.ie/~mel/projects/codeviz/ Linux cross reference (LXR): 以web的方式阅读和查找LINUX内核源代码的工具。这个工具安装相当麻烦,我建议直接到它的官方网站直接读代码。 http://lxr.linux.no/linux+v2.6.24/ 模块 LINUX内存管理代码模块主要分为4个部分: 1.Out of memory 代码在mm/oom_kill.c 貌似用于杀进程的时候对内存的操作 2.虚拟内存的分配代码在mm/vmalloc.c

Linux查看CPU和内存使用情况

Linux查看CPU和内存使用情况 在系统维护的过程中,随时可能有需要查看CPU 使用率,并根据相应信息分析系统状况的需要。在Ce ntOS 中,可以通过top 命令来查看CPU 使用状况。运行top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式-- 用基于top 的命令,可以控制显示方式等等。退出top 的命令为q (在top 运行中敲q 键一次)。 操作实例: 在命令行中输入“top” 即可启动top top 的全屏对话模式可分为3部分:系统信息栏、命令输入栏、进程列表栏。 第一部分-- 最上部的系统信息栏: 第一行(top): “00:11:04”为系统当前时刻; “3:35”为系统启动后到现在的运作时间; “2 users”为当前登录到系统的用户,更确切的说是登录到用户的终端数-- 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目; “load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程; 第二行(Tasks): “59 total”为当前系统进程总数; “1 running”为当前运行中的进程数; “58 sleeping”为当前处于等待状态中的进程数; “0 stoped”为被停止的系统进程数; “0 zombie”为被复原的进程数; 第三行(Cpus): 分别表示了CPU 当前的使用率; 第四行(Mem): 分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量; 第五行(Swap): 表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(S wap)被频繁使用的情况,将被视作物理内存不足而造成的。 第二部分-- 中间部分的内部命令提示栏: top 运行中可以通过top 的内部命令对进程的显示方式进行控制。内部命令如下表: s - 改变画面更新频率 l - 关闭或开启第一部分第一行top 信息的表示

Linux内存管理实验

1 《unix 操作系统教程》课程实验报告 实验名称 Linux 内存管理实验 实验序号 5 姓 名 系院专业 班 级 学 号 实验日期 2012.11.28 指导教师 成 绩 一、实验目的 1. 通过在Linux 环境下对内存管理的基本操作,感性认识Linux 如何对内存进行管理。 2. 利用readelf 和objdump 观测 linux 下的内存地址映射过程以及进程的虚拟地址空间。 二、实验内容与要求 (1)按照实验内容完成实验操作步骤,学习内存管理中的一些常用命令 (2)理解linux 中逻辑地址、线性地址的概念。 (3)提交实验报告。 三、实验设备 地点: 实验实训中心A4-2 设备:计算机一台 linux 操作系统

2 四、实验步骤与测试 实验一 free 命令显示显示内存的使用情况(使用的和空闲的),包括物理内存、交换区内存、内核缓冲区内存。不包括共享内存。free 命令默认选项为-k 语法: free [-bkmotV] [-s <间隔秒数>]选项介绍: -b: 以Byte 为单位显示内存使用情况; -k: 以KB 为单位显示内存使用情况; -m: 以MB 为单位显示内存使用情况; -o: 不显示缓冲区调节列; -s<间隔秒数>: 每间隔指定时间执行一次free 命令; -t: 显示内存总和列; -V: 显示版本信息; (1)free -k: 以KB 为单位显示内存使用情况; 解释:total: 内存总量: 3355508(k) used: 已经使用的内存量: 490664(k) free: 空闲的内存量: 2864844(k) shared: 当前已经废弃不用,总量是0(k) buffers: 25164(k) Buffer Cache 内存量: 263480(k) cached: Page Cache 内存量: 21436(k) (2)free –m -s 5:以M 为单位,5秒显示以下内存信息 解释:以上为每隔5秒显示内存信息,由以上图可知:两次内存使用情况没有变化。 (3)free -o: 不显示缓冲区调节列; 解释:由以上可知Buffer Cache 这一列没有显示出来。 (4)free -t: 显示内存总和列;

Linux操作系统内存管理

Linux操作系统内存管理 摘要: Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫对换空间。 Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。 Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。 Linux是一个遵循POSIX(Portable Operating System Interface)标准的操作系统,它继承了UNIX系统优秀的设计思想,拥有简练、容错强、高效而且稳定的内核。此外Linux还具备其他操作系统所不能比拟的优点。①:完全免费; ②:内核源代码完全公开。 Linux内核拥有一个功能完备的内存管理子系统,它增加了对NUMA(非均匀存储结构)体系结构的支持并且使用了基于区(ZONE)的物理内存管理方法,从而保持了物理上连续分布、而逻辑上统一的内存模式和传统的共享内存编程模型,使得系统的性能得以极大的扩展。这样Linux不仅能够满足传统的桌面应用,而且还能满足高端服务器市场的需要。目前,Linux不仅在Internet服务器上表现出色,而且还可以胜任大型数据库系统的服务器。 关键字:虚拟内存,物理内存管理,虚拟内存管理 一、Linux存储管理的基本框架 Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射。其中PGD为页面目录,PMD为中间目录,PT为页面表。具体的映射过程为: ⑴从CR3寄存器中找到PGD基地址; ⑵以线性地址的最高位段为下标,在PGD中找到指向PMD的指针;

linux系统下查看系统信息命令

Linux的文件系统中,有一个特殊目录“/proc”,该目录下列出的文件并非保存在磁盘上,而是内存中的一个映像。在该目录下可以找到许多有意思的东西,例如: /proc/cpuinfo 本机CPU的相关信息; /proc/meminfo 本机内存及交换分区的使用信息; /proc/modules 本机已安装的硬件模块信息; /proc/mounts 本机已挂载mount 上的设备信息; 此外,该目录下有一些以数字为名称的子目录,每个子目录用于维护一个正在运行的进程,而目录名即为相应的进程ID。例如进入名称为“1” 的子目录:cd /proc/1 该目录下文件“cmdline” 中的内容为该进程运行时执行的命令行;“environ”文件中的内容为该进程运行时的环境变量信息;“stat” 文件中存放的时该进程运行的状态信息等。 通过查看“ /proc” 目录下的文件,可以获取几乎所有的系统信息及系统的运行状态信息。事实上,Linux下的诸多查询系统状态信息的命令,也是通过读取该目录下的文件而获取的。 以下是一些用于查看系统状态信息的命令: df 命令 用于查看Linux 文件系统的状态信息,显示各个分区的容量、已使用量、未使用量及挂载点等信息。如: df -k 以千字节(KB)为单位显示各分区的信息; df -a 显示所有分区,包括大小为0 的分区; df -T 显示分区类型(EXT2 或EXT3等)。 du 命令 用于查看文件或文件夹的大小。如: du -b /home 以字节为单位显示“ /home ”文件夹下各个子文件夹的大小; du -ks home 以千字节(KB)为单位显示“/home” 文件夹的总大小; top 命令(第三页有详细的图形介绍top命令) 用于实时查看系统状态信息。运行该命令后,屏幕上会显示如下信息: CPU状态(CPU states):包括用户进程占用比率、系统进程占用比率、用户的nice 优先级进程占用比率及空闲CPU资源比率等;

Linux下访问内存物理地址

Linux下访问内存物理地址 by tmsonhsut 2008.4.28 Linux内核里提供的/dev/mem驱动,为我们读写内存物理地址,提供了一个渠道。下面讲述2种利用mem设备文件进行物理地址读写的方法,一种是设备驱动的方法,另一种是系统调用的方法。 首先我们看下mem这个设备文件,/dev/mem是linux下的一个字符设备,源文件是~/drivers/char/mem.c,这个设备文件是专门用来读写物理地址用的。里面的内容是所有物理内存的地址以及内容信息。通常只有root用户对其有读写权限。 1.设备驱动的方法 下面是mem.c文件里定义的file_operations结构,提供了llseek,read,write,mmap以及open等方法。 static structfile_operationsmem_fops = { .llseek = memory_lseek, .read = read_mem, .write = write_mem, .mmap = mmap_mem, .open = open_mem, }; 因此我们可以通过一般驱动的使用方法,将内存完全当作一个设备来对对待。应用程序如下: #include #include int main(void) { intfd; char *rdbuf; char *wrbuf = "butterfly"; int i; fd = open("/dev/mem",O_RDWR); if(fd< 0) { printf("open /dev/mem failed."); } read(fd,rdbuf,10); for(i = 0;i < 10;i++) { printf("old mem[%d]:%c\n",i,*(rdbuf + i)); }

linux如何查看内存大小

linux如何查看内存大小 Linux在使用过程中,经常触及到内存大小的问题,下面,让小编带你们一起学习linux如何查看内存大小。 linux如何查看内存大小: 用free -m查看的结果: # free -m total used free shared buffers cached Mem: 504 471 32 0 19 269 -/+ buffers/cache: 183 321 Swap: 996 0 996 查看/proc/kcore文件的大小:

# ll -h /proc/kcore -r-------- 1 root root 512M 10月26 20:40 /proc/kcore 在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free total used free shared buffers cached Mem: 3266180 3250004 16176 0 110652 2668236 -/+ buffers/cache: 471116 2795064 Swap: 2048276 80160 1968116 下面是对这些数值的解释: total:总计物理内存的大小。 used:已使用多大。

free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free:可用有多少。 第四行就不多解释了。 区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. 第三行所指的是从应用程序角度来看,对于应用程序来说,

LINUX系统基本的内存管理知识讲解

内存是Linux内核所管理的最重要的资源之一。内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。 一、内存使用情况监测 (1)实时监控内存使用情况 在命令行使用Free命令可以监控内存使用情况 代码如下: #free total used free shared buffers cached Mem: 256024 192284 63740 0 10676 101004 -/+ buffers/cache: 80604 175420 Swap: 522072 0 522072 上面给出了一个256兆的RAM和512兆交换空间的系统情况。第三行输出(Mem:)显示物理内存。total列不显示核心使用的物理内存(通常大约1MB)。used列显示被使用的内存总额(第二行不计缓冲)。 free列显示全部没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对对换空间,显示的信息类似上面。如果这行为全0,那么没使用对换空间。在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以使用—m参数以兆字节为单位显示内存使用情况。还可以通过—s 参数使用命令来不间断地监视内存使用情况: #free –b –s2 这个命令将会在终端窗口中连续不断地报告内存的使用情况,每2秒钟更新一次。 (2)组合watch與 free命令用来实时监控内存使用情况: 代码如下: #watch -n 2 -d free

查看linux系统内存使用情况

下面和大家分享在Linux下查看内存使用情况的free命令: 下面是对这些数值的解释: total:总计物理内存的大小。 used:已使用多大。 free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free:可用有多少。 第四行就不多解释了。 区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. 第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为 buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 如上例: 2795064=16176+110652+2668236 接下来解释什么时候内存会被交换,以及按什么方交换。 当可用内存少于额定值的时候,就会开会进行交换。 如何看额定值:

用free -m查看的结果: 查看/proc/kcore文件的大小(内存镜像):

linux系统如何查看内存使用情况

在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux下查看内存使用情况的free命令: [root@scs-2 tmp]# free total used free shared buffers cached Mem: 3266180 3250004 16176 0 110652 2668236 -/+ buffers/cache: 471116 2795064 Swap: 2048276 80160 1968116 下面是对这些数值的解释: total:总计物理内存的大小。 used:已使用多大。 free:可用有多少。 Shared:多个进程共享的内存总额。 Buffers/cached:磁盘缓存的大小。 第三行(-/+ buffers/cached): used:已使用多大。 free:可用有多少。 第四行就不多解释了。 区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free 的区别。这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached. 第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。

linux内存管理实验报告

操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人

实验题目:内存管理实验 一、实验目的 1、通过本次试验体会操作系统中内存的分配模式; 2、掌握内存分配的方法(FF,BF,WF); 3、学会进程的建立,当一个进程被终止时内存是如何处理被 释放块,并当内存不满足进程申请时是如何使用内存紧 凑; 4、掌握内存回收过程及实现方法; 5、学会进行内存的申请释放和管理; 二、实验内容 附源代码: /*宏定义*/ #include #include #include #define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/ #define MIN_SLICE 10 /*最小碎片的大小*/ #define DEFAULT_MEM_SIZE 1024 /*默认内存的大小*/ #define DEFAULT_MEM_START 0 /*默认内存的起始位置*/ /* 内存分配算法 */ #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/ int ma_algorithm = MA_FF; /*当前分配算法*/ int flag = 0; /*设置内存大小标志*/ static int pid = 0; /*初始pid*/ int algorithm;

/*描述每一个空闲块的数据结构*/ struct free_block_type{ int size; int start_addr; struct free_block_type *next; }; /*指向内存中空闲块链表的首指针*/ struct free_block_type *free_block; /*每个进程分配到的内存块的描述*/ struct allocated_block{ int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct allocated_block *next; }; /*进程分配内存块链表的首指针*/ struct allocated_block *allocated_block_head = NULL; struct allocated_block *find_process(int id) { struct allocated_block *p; p=allocated_block_head; while(p!=NULL) { if (p->pid==id) return p; } return NULL; } void swap(int *p,int *q) { int temp; temp = *p; *p = *q; *q = temp; return;

linux 查看内存使用率

root@emos ~]# top [root@emos ~]# free -m total 内存总数 used 已经使用的内存数 free 空闲的内存数 shared 不同进程间用来进行数据交换,一般都是0(多个进程共享的内存总额) buffers 是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。: 153M cached 经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。:2718M 绿色部分: (-buffers/cache) used内存数:417M (指的第一部分Mem行中的used – buffers – cached) ( buffers/cache) free内存数: 3623M (指的第一部分Mem行中的free buffers cached) 黄色部分: 交换分区,就不说了,自己也会明白。 我们可能会纳闷儿,蓝色部分(Mem)与绿色部分(-/+ buffers/cache)的结果中,有关used和free为什么这么奇怪?我们可以从二个方面来解释: 对操作系统来讲是Mem的参数buffers和cached 都是属于被使用,它认为free只有752M。 对应用程序来讲是(-/+ buffers/cach),buffers和cached 是等同可用的,buffer和cached是为了提高程序执行的性能,当程序使用内存时,buffer和cached会很快地被使用。 以应用来看看,以(-/+ buffers/cache)的free和used为主.我们看这个就好了.Linux 为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了I/O系统调用(比如read,write,getdents)的时间. 内存是拿来用的,不是拿来看的。不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么有时会提示虚拟空间不足的原因。在内

linux系统-top 命令查看系统资源(CPU内存等)使用率

在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要。在Linux 中,可以通过top命令来查看 CPU 使用状况。运行top命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式 -- 用基于top的命令,可以控制显示方式等等。退出top的命令为 q (在top运行中敲 q 键一次)。 运行top 在命令行中输入“top” 即可启动top,运行后如上图所示: 如上图所示,top的全屏对话模式可分为3部分:系统信息栏、命令输入栏、进程列表栏。 第一部分 -- 最上部的系统信息栏: 第一行(top): “00:11:04”为系统当前时刻; “3:35”为系统启动后到现在的运作时间; “2 users”为当前登录到系统的用户,更确切的说是登录到用户的终端数 -- 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目; “load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程;

第二行(Tasks): “59 total”为当前系统进程总数; “1 running”为当前运行中的进程数; “58 sleeping”为当前处于等待状态中的进程数; “0 s top ed”为被停止的系统进程数; “0 zombie”为被复原的进程数; 第三行(Cpus): 分别表示了 CPU 当前的使用率; 第四行(Mem): 分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量; 第五行(Swap): 表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。 第二部分 -- 中间部分的内部命令提示栏: top运行中可以通过top的内部命令对进程的显示方式进行控制。内部命令如下表: s - 改变画面更新频率 l - 关闭或开启第一部分第一行top信息的表示 t - 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示 m - 关闭或开启第一部分第四行 Mem 和第五行 Swap 信息的表示 N - 以 PID 的大小的顺序排列表示进程列表(第三部分后述) P - 以 CPU 占用率大小的顺序排列进程列表(第三部分后述) M - 以内存占用率大小的顺序排列进程列表(第三部分后述) h - 显示帮助 n - 设置在进程列表所显示进程的数量 q - 退出top s - 改变画面更新周期 第三部分 -- 最下部分的进程列表栏: 以 PID 区分的进程列表将根据所设定的画面更新时间定期的更新。通过top内部命令可以控制此处的显示方式。

Linux 内存管理导读

Linux 内存管理导读 1. 存储层次结构和x86存储管理硬件(MMU) 1.1存储层次 高速缓存(cache) à主存(main memory) à磁盘(disk) 理解存储层次结构的根源:CPU速度和存储器速度的差距。 层次结构可行的原因:局部性原理。 LINUX的任务: l减小footprint,提高cache命中率,充分利用局部性。 l实现虚拟存储以满足进程的需求,有效地管理内存分配,力求最合理地利用有限的资源。 1.2 MMU的作用 辅助操作系统进行内存管理,提供虚实地址转换等硬件支持。 1.3 x86的地址 逻辑地址:出现在机器指令中,用来制定操作数的地址。段:偏移 线性地址:逻辑地址经过分段单元处理后(如将段地址左移四位与偏移量)得到线性地址,这是一个32位的无符号整数,可用于定位4G个存储单元。 物理地址:线性地址经过页表查找后得出物理地址,这个地址将被送到地址总线上指示所要访问的物理内存单元。 LINUX: 尽量避免使用段功能以提高可移植性。如通过使用基址为0的段, 使逻辑地址==线性地址。 1.4 x86的段与Linux下的段比较 x86保护模式下的段:表索引+描述符项。不仅仅是一个基地址的原因是为了提供更多的信息:保护、长度限制、类型等。描述符项存放在一张表中(GDT或LDT),表索引就是表的索引。段寄存器中存放的是表索引,在段寄存器装入的同时,描述符中的数据被装入一个不可见的寄存器以便cpu快速访问。 专用寄存器:GDTR(包含全局描述附表的首地址), LDTR(当前进程的段描述附表首地址), TSR(指向当前进程的任务状态段) LINUX使用的四种段: __KERNEL_CS:内核代码段。范围0-4G。可读、执行。DPL=0。 __KERNEL_DS:内核代码段。范围0-4G。可读、写。DPL=0。 __USER_CS:内核代码段。范围0-4G。可读、执行。DPL=3。 __USER_DS:内核代码段。范围0-4G。可读、写。DPL=3。 TSS(任务状态段):存储进程的硬件上下文,进程切换时使用。(因为x86硬件对TSS有一定支持,所有有这个特殊的段和相应的专用寄存器。) __USER_CS和__USER_DS段都是被所有在用户态下的进程共享的。但这种段的共享和进程空间的共享是有区别的:虽然各个进程使用同一个(种)段,但通过使

Linux内存管理初始化

Linux内存管理初始化 内存管理子系统是linux内核最核心最重要的一部分,内核的其他部分都需要在内存管理子系统的基础上运行。而对其初始化是了解整个内存管理子系统的基础。对相关数据结构的初始化是从全局启动例程start_kernel开始的。本文详细描述了从bootloader跳转到linux 内核内存管理子系统初始化期间所做的操作,从而来加深对内存管理子系统知识的理解和掌握。 内核的入口是stext,这是在arch/arm/kernel/vmlinux.lds.S中指定的。而符号stext是在arch/arm/kernel/head.S中定义的。整个初始化分为两个阶段,首先是在head.S中用汇编代码执行一些平台相关的初始化,完成后跳转到start_kernel函数用C语言代码执行剩余的通用初始化部分。整个初始化流程图如下图所示: 一、启动条件 通常从系统上电到运行到linux kenel这部分的任务是由bootloader来完成。Boot loader在跳转到kernel之前要完成一些限制条件: 1、CPU必须处于SVC(supervisor)模式,并且IRQ和FIQ中断必须是禁止的;

2、MMU(内存管理单元)必须是关闭的, 此时虚拟地址对应物理地址; 3、数据cache(Data cache)必须是关闭的; 4、指令cache(Instructioncache)没有强制要求; 5、CPU通用寄存器0(r0)必须是0; 6、CPU通用寄存器1(r1)必须是ARM Linuxmachine type; 7、CPU通用寄存器2(r2)必须是kernelparameter list的物理地址; 二、汇编代码初始化部分 汇编代码部分主要完成的工作如下所示,下文只是概述head.S中各个函数完成的主要 功能,具体的技术细节,本文不再赘述。 ? 确定processortype ? 确定machinetype ? 创建页表 ? 调用平台特定的__cpu_flush函数 ? 开启mmu ? 切换数据 ? 最终跳转到start_kernel 三、C语言代码初始化部分 C语言代码初始化部分主要负责建立结点和内存域的数据结构、初始化页表、初始化用 于内存管理的伙伴系统。在启动过程中,尽管内存管理模块尚未初始化完成,但内核仍然需要分配内存以创建各种数据结构。bootmem分配器用于在启动阶段分配内存。所有涉及的实现都是在start_kernel函数中实现的,其中涉及到内存初始化的函数如下: 1、build_all_zonelist用于结点和内存域的初始化。

相关文档