linux内存管理机制详细解析
物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(SwapSpace)。
作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。
linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。
因此,合理规划和设计linux内存的使用,是非常重要的.
[haixigov@WEBServer~]$free
total used free shared buffers cached
Mem: 16402432 16360492 41940 0 465404 12714880
-/+buffers/cache: 3180208 13222224
Swap: 8193108 264 8192844
total:物理内存的总大小。
used:已经使用的物理内存多小。
free:空闲的物理内存值。
shared:多个进程共享的内存值。
buffers/cached:磁盘缓存的大小。
第三行(-/+buffers/cached):代表磁盘缓存使用状态。
第四行:Swap表示交换空间内存使用状态。
free命令输出的内存状态,可以通过两个角度来查看:一个是从内核的角度来看,一个是从应用层的角度来看的。
16402432-16360492=41940
其实就是总的物理内存减去已经使用的物理内存得到的就是空闲的物理内存大小,注意这里的可用内存值41940并不包含处于buffers和cached状态的内存大小。
如果你认为这个系统空闲内存太小,那你就错了,实际上,内核完全控制着内存的使用情况,linux会在需要内存的时候,或在系统运行逐步推进时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。
41940+(465404+12714880)=13222224
通过这个等式可知,应用程序可用的物理内存值是Mem项的free值加上buffers和cached值之和,也就是说,这个free值是包括buffers和cached项大小的,对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。
buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及trackingin-flightpages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。
为了验证我们的结论是否正确,可以通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?
find/*-name *.conf
看看buffers的值是否变化,然后重复执行find命令,看看两次显示速度有何不同。
Linux操作系统的内存运行原理,很大程度上是根据服务器的需求来设计的,例如系统的缓冲机制会把经常使用到的文件和数据缓存在cached中,linux总是在力求缓存更多的数据和信息,这样再次需要这些数据时可以直接从内存中取,而不需要有一个漫长的磁盘操作,这种设计思路提高了系统的整体性能。
[root@localhost~]#ddif=/dev/zeroof=/data/swapfilebs=1024count=65536
65536+0recordsin
65536+0recordsout
这样就创建一个有连续空间的交换文件,大小为60M左右,关于dd命令做简单的讲述:
if=输入文件,或者设备名称。
of=输出文件或者设备名称。
ibs=bytes表示一次读入bytes个字节(即一个块大小为bytes个字节)。
obs=bytes表示一次写bytes个字节(即一个块大小为bytes个字节)。
bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可代替ibs和obs。
count=blocks仅拷贝blocks个块。
skip=blocks表示从输入文件开头跳过blocks个块后再开始复制。
seek=blocks表示从输出文件开头跳过blocks个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)
这里的输入设备/dev/zero代表一个输出永远为0的设备文件,使用它作输入可以得到全为空的文件。
[root@localhost~]#mkswap /data/swapfile
Settingupswapspaceversion1,size=67104kB
[root@localhostbackup]#free
total used free shared buffers cached
Mem: 2066632 1998188 68444 0 26160 1588044
-/+buffers/cache: 383984 1682648
Swap: 4088500 101036 3987464
从上面输出可知,我们指定了一个67104kB的交换空间,而此时新建的交换空间还未被使用,下面简单介绍下mkswap命令,mkswap的一般使用格式为:
mkswap[参数][设备名称或文件][交换区大小]
-v0:建立旧式交换区,此为预设值。
-v1:建立新式交换区。
交换区大小:指定交换区的大小,单位为1024字节。
设置交换分区后,接着通过swapon命令激活swap:
[root@localhost~]#/usr/sbin/swapon/data/swapfile
[root@localhostbackup]#free
total used free shared buffers cached
Mem: 2066632 1997668 68964 0 27404 1588880
-/+buffers/cache: 381384 1685248
Swap: 4154028 100976 4053052
通过free命令可以看出,swap大小已经由4088500k变为4154028k,相差的值是60M左右,刚好等于我们增加的一个交换文件大小,这说明新增的交换分区已经可以使用了,但是如果linux重启,那么新增的swap空间将变得不可用,因此需要在/etc/fstab中添加自动加载设置:
/data/swapfile none swap sw00
如此以来,linux在重启后就可以实现自动加载swap分区了。其实linux在启动过程中会执行“swapon-a”命令,此命令会加载列在/etc/fstab中的所有交换空间。
[root@localhost~]#/usr/sbin/swapoff/data/swapfile
其实也可以通过“swapoff-a”移除在/etc/fstab中定义的所有交换空间,这里的“swapoff-a”与上面提到的“swapon-a”对应。执行“swapoff-a”后,free命令输出如下:
[root@localhostbackup]#free
total used free shared buffers cached
Mem: 2066632 2048724 17908 0 30352 1642748
-/+buffers/cache: 375624 1691008
Swap: 0 0 0
相关文章
- Linux常用命令实例解析(linux常用命令实例详解)
- Linux驱动程序:深入解析让你轻松掌握(linux驱动程序详解)
- Linux系统内存分配算法的研究(linux内存分配算法)
- 和交换空间Linux内存管理:剩余内存与交换空间(linux剩余内存)
- 操作Linux安装源操作指南(linux安装源)
- Linux进程内存管理之分配学习(linux进程内存分配)
- 软件Linux如何快速彻底删除软件(linux全部删除)
- 初探Linux世界:学习.sh文件(linux了.sh)
- Linux入门:从零开始的学习之旅(linux入门学习教程)
- Linux下防止内存泄露的方法(内存泄露linux)
- Linux环境安装:快速开始体验(linux环境安装包下载)
- 如何自学Linux系统及其应用(怎么自学linux)
- 解析Linux系统登录日志文件(linux登录日志文件)
- Linux系统视频采集技术研究(linux视频采集)
- 探索Linux系统中的help命令(linux中help)
- 深入探索:Linux嵌入式系统驱动解析与应用(linux嵌入式系统驱动)
- 高效解决!Linux如何应对内存占用过高问题(linux内存占用过高)
- 如何将Linux下的数据转换为16进制格式?(linux转16进制)
- 让STM32板载Linux系统驱动舞台灯光(stm32跑linux)
- Linux中查看内存频率的方法(linux 查内存频率)
- 玩转Linux,体验质量之旅(linux qc)
- Linux系统轻松实现自动启动(linux 自动启动)