1. 导论
linux 内存管理还是比较复杂的,其中牵扯到很多方面的知识,这篇小博文算是自己对于内存管理的一点点的总结。
2. 虚拟内存
linux操作系统采用虚拟内存,每一个进程启动都有有自己的内存空间,这个空间跟操作系统的位数有关,如32位系统的虚拟内存空间为4G,而64位系统的虚拟内存空间为特别大。
采用虚拟内存的方式的好处多多,每个进程都在自己的内存空间中折腾,进程之间可以避免产生冲突;每个进程可以使用的内存空间突破了物理内存的限制;只要进程真正需要物理内存的时候,系统才会分配内存,这样可以最大程度的节省物理内存,系统还需要负责虚拟地址到实际物理地址的映射。通过虚拟内存这个中间层,使得进程和物理内存之间的组织变得更加自由。
3. swap区
虚拟地址空间可以扩展进程可操控的内存范围,但实际的物理内存还是有限的,还可能会出现物理内存不足的情况。操作系统可以将物理内存中一部分不常访问的数据迁移到硬盘交互区中,这个硬盘交换区就成为swap区。通过冷数据迁出内存的方式,可以更有效的利用物理内存,等到程序真正需要这些数据时,再从swap区中将数据恢复到内存中。
数据频繁的在内存和swap区之间进行交互会导致程序性能骤降,所以在高性能服务中要避免swap情况的发生。
4. free
在linux中的shell中执行free命令,free命令的作用是显示系统中已使用和空闲的内存情况,以下是在我的开发机上free命令的执行情况:
以下会针对着free展示的几个指标展开一下:
1) used指标表明当前已被使用的内存
2) free指标表示未被分配的内存
3) shared指标表示当前系统的共享内存占用情况
4) buffer指标表示系统分配但可被使用的buffer数量
5) cached指标表明系统分配但可被使用的cached数量
先解释一下buffer和cache的区别,两者都会缓存系统的某些数据,其中buffer缓存的是块设备的数据,如文件系统的metadata一级tracking in-flight pages。举个简单的例子,在shell下调用ls /home,然后再调用free就会发现buffer指标的数字增加了。cached则会缓冲我们打开的普通的文件信息,再举个简单的例子,在shell下调用vi XX,然后再free也会发现cached指标的数字也增加了。
linux系统会将暂时不使用的内存作为文件和数据的缓冲,以提高系统的性能,当系统需要这些内存时,系统会自动释放以供使用,系统真正占用的内存可以是:used-buffe rs -cached。
再补充一点,Linux为了提高磁盘与内存的存取效率,采用了两种主要的Cache方式:buffer cache和page cache。前者针对着磁盘块的读写,后者针对着文件inide的读写,这些cache有效的缩短了I/O系统调用的时间。
5. top
在linux的shell中调用top命令,就可看各个进程更加详细的内存使用。
其中,virt表示虚拟内存占用,res表示常驻内存,也就是实际的物理内存占用,shr表示共享内存占用。其中res指标会有一点小出入:一是可能有些东西被交换到swap上,另一个就是有些内存可能是共享的。
6. mmap/malloc
这里的mmap只谈文件映射,mmap可以将磁盘上的某个文件映射到进程的虚拟地址空间上,映射完毕后,进程可以直接操作地址指针的方式,而无需再使用rear/wri te 的方式。当进程访问mmap后的地址时,磁盘中的内容并没有存在于内存中,这时候会触发一次中断将磁盘内存读取内存中。
malloc则表示当前进程想要在堆上申请一块内存,系统会在进程的虚拟地址空间中的堆区分配一块区域,然后该调用就会返回该区域的地址。malloc调用并不会触发实际的物理内存分配,因为linux系统采用的是延迟分配的方式分配内存,只有操作malloc分配的内存区域时才会触发系统中断,然后才会真正分配内存。
mmap的中断是一种大中断,因为涉及磁盘与内存之间的交互,势必会影响程序的性能;malloc的中断是一种小中断,由于在内存中操作,速度非常快,几乎不会影响系统的性能。
在程序开发时,要注意mmap后系统性能暂时下降的问题,可以采用预读或是数据预热的方式。
7. 小结
以上几点是对linux内存的浅浅的见识,总结一下,后面还得加油啊!