Linux内存管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存管理相关的知识,希望对你有一定的参考价值。

在Linux中常常发现空暇内存非常少,似乎全部的内存都被系统占用了。表面感觉是内存不够用了,事实上不然。这是Linux内存管理的一个优秀特性,在这方面,差别于Windows的内存管理。主要特点是,不管物理内存有多大。Linux 都将其充份利用。将一些程序调用过的硬盘数据读入内存,利用内存读写的快速特性来提高Linux系统的数据訪问性能。而Windows是仅仅在须要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说。每添加一些物理内存,Linux都将能充分利用起来。发挥了硬件投资带来的优点,而Windows仅仅将其做为摆设,即使添加8GB甚至更大。

Linux的这一特性。主要是利用空暇的物理内存。划分出一部份空间,做为cache、buffers ,以此提高数据訪问性能。

页快速缓存(cache)是Linux内核实现的一种主要磁盘缓存。它主要用来降低对磁盘的I/O操作。详细地讲,是通过把磁盘中的数据缓存到物理内存中。把对磁盘的訪问变为对物理 内存的訪问。

磁盘快速缓存的价值在于两个方面:第一,訪问磁盘的速度要远远低于訪问内存的速度,因此。从内存訪问数据比从磁盘訪问速度更快。第二,数据一旦被訪问,就非常有可能在短期内再次被訪问到。

以下来了解下Linux内存管理机制:

一、物理内存和虚拟内存

我们知道。直接从物理内存读写数据要比从硬盘读写数据要快的多。因此,我们希望全部数据的读取和写入都在内存完毕,而内存是有限的。这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小。是真正的内存,相对于物理内存。在Linux下另一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存。用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

作为物理内存的扩展。Linux会在物理内存不足时,使用交换分区的虚拟内存。更具体的说。就是内核会将临时不用的内存块信息写到交换空间。这样以来,物理内存得到了释放,这块内存就能够用于其他目的。当须要用到原始的内容时,这些信息会被又一次从交换空间读入物理内存。

Linux的内存管理採取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不常常使用的数据块自己主动交换到虚拟内存中。而将常常使用的信息保留到物理内存。

要深入了解Linux内存执行机制。须要知道以下提到的几个方面:

  1. Linux系统会不时的进行页面交换操作。以保持尽可能多的空暇物理内存,即使并没有什么事情须要内存,Linux也会交换出临时不用的内存页面。这能够避免等待交换所需的时间。

  2. Linux进行页面交换是有条件的,不是全部页面在不用时都交换到虚拟内存,Linux内核依据”近期最常常使用“算法。只将一些不常常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:Linux物理内存还有非常多,可是交换空间也使用了非常多。事实上。这并不奇怪,比如,一个占用非常大内存的进程执行时,须要耗费非常多内存资源,此时就会有一些不常常使用页面文件被交换到虚拟内存中,但后来这个占用非常多内存资源的进程结束并释放了非常多内存时。刚才被交换出去的页面文件并不会自己主动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空暇非常多,同一时候交换空间也在被使用。就出现了刚才所说的现象了。关于这点,不用操心什么,只要知道是怎么一回事就能够了。
  3. 交换空间的页面在使用时会首先被交换到物理内存,假设此时没有足够的物理内存来容纳这些页面。它们又会被立即交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,终于会导致Linux出现假死机、服务异常等问题,Linux尽管能够在一段时间内自行恢复,可是恢复后的系统已经基本不可用了。

因此。合理规划和设计Linux内存的使用,是很重要的.

二、内存的监控

作为一名Linux系统管理员。监控内存的使用状态是很重要的。通过监控有助于了解内存的使用状态。比方内存占用是否正常。内存是否紧缺等等。监控内存最常使用的命令有free、top等。以下是某个系统free的输出:

  1. [[email protected] ~]# free 
  2.              total       used       free     shared    buffers     cached 
  3. Mem:       3894036    3473544     420492          0      72972    1332348 
  4. -/+ buffers/cache:    2068224    1825812 
  5. Swap:      4095992     906036    3189956 

每一个选项的含义:

第一行:

total:物理内存的总大小

used:已经使用的物理内存大小

free:空暇的物理内存大小

shared:多个进程共享的内存大小

buffers/cached:磁盘缓存的大小

第二行Mem:代表物理内存使用情况

第三行(-/+ buffers/cached):代表磁盘缓存使用状态

第四行:Swap表示交换空间内存使用状态

free命令输出的内存状态,能够通过两个角度来查看:一个是从内核的角度来看。一个是从应用层的角度来看的。

从内核的角度来查看内存的状态

就是内核眼下能够直接分配到,不须要额外的操作,即为上面free命令输出中第二行Mem项的值,能够看出。此系统物理内存有3894036K,空暇的内存仅仅有420492K,也就是40M多一点,我们来做一个这种计算:

3894036 – 3473544 = 420492

事实上就是总的物理内存减去已经使用的物理内存得到的就是空暇的物理内存大小,注意这里的可用内存值420492并不包括处于buffers和cached状态的内存大小。

假设你觉得这个系统空暇内存太小。那你就错了。实际上。内核全然控制着内存的使用情况。Linux会在须要内存的时候,或在系统执行逐步推进时,将buffers和cached状态的内存变为free状态的内存,以供系统使用。

从应用层的角度来看系统内存的使用状态

也就是Linux上执行的应用程序能够使用的内存大小,即free命令第三行 -/+ buffers/cached 的输出,能够看到,此系统已经使用的内存才2068224K,而空暇的内存达到1825812K,继续做这样一个计算:

420492+(72972+1332348)=1825812

通过这个等式可知,应用程序可用的物理内存值是Mem项的free值加上buffers和cached值之和。也就是说,这个free值是包含buffers和cached项大小的。对于应用程序来说,buffers/cached占有的内存是可用的,由于buffers/cached是为了提高文件读取的性能,当应用程序须要用到内存的时候,buffers/cached会非常快地被回收。以供应用程序使用。

buffers与cached的异同

在Linux 操作系统中。当应用程序须要读取文件里的数据时,操作系统先分配一些内存。将数据从磁盘读入到这些内存中。然后再将数据分发给应用程序;当须要往文件里写数据时。操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,假设有大量数据须要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性能就变得非常低下。由于不管是从磁盘读数据,还是写数据到磁盘,都是一个非常消耗时间和资源的过程,在这样的情况下,Linux引入了buffers和cached机制。

buffers与cached都是内存操作,用来保存系统以前打开过的文件以及文件属性信息,这样当操作系统须要读取某些文件时。会首先在buffers与cached内存区查找,假设找到,直接读出传送给应用程序,假设没有找到须要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存。大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。

buffers是用来缓冲块设备做的。它仅仅记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放文件夹里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

为了验证我们的结论是否正确,能够通过vi打开一个很大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同,是不是第二次打开的速度明显快于第一次呢?

接着运行以下的命令:

  1. find /* -name  *.conf 

看看buffers的值是否变化。然后反复运行find命令,看看两次显示速度有何不同。

Linux操作系统的内存执行原理,非常大程度上是依据server的需求来设计的。比如系统的缓冲机制会把常常使用到的文件和数据缓存在cached中,linux总是在力求缓存很多其它的数据和信息,这样再次须要这些数据时能够直接从内存中取,而不须要有一个漫长的磁盘操作。这样的设计思路提高了系统的总体性能。

以上是关于Linux内存管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )

Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )

一文掌握 Linux 内存管理

linux 内存管理

linux内存管理

Linux内存管理1