整理一下内存的一些术语。
内存:
内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它的存取速度慢于CPU缓存,但快于硬盘。算是存储结构中的第二层。
我们的程序要运行,都需要先读取到内存中。我们所说的内存,通常指的就是物理内存,也就是内存条。
虚拟存储器:
Linux使用虚拟存储器来管理内存。通过将对内存进行抽象,将其作为存储在硬盘上数据的高速缓存,只将当前进程部分代码缓存到主存中(当前进程的程序较少时,可以全部缓存在主存中),从而提高了主存的利用率,使其同时可以容纳更多的进程同时运行。
虚拟存储器是对主存的的一种抽象,基本思想:利用硬盘来充当内存,用内存作硬盘的缓存。即虚拟地址空间维护的是硬盘中的数据,通过将要使用的数据缓存在内存中,使应用程序误以为数据一直在内存中。
如图所示,页表中有的地址指向的是物理存储器,有的指向虚拟存储器(磁盘)。如果访问的内存没有载入物理内存,则会引发缺页。操作系统就会把磁盘中对应的页调入内存。
文件映射页(有名页):
文件映射页指的是内存中能对应到文件的页(也叫有名页),比如我们读取一个txt文件,这个文件在内存中的映像就是一个文件映射页。载入内存的程序代码也都是文件映射页。
文件映射页如果被改写,就被称为脏页。在内存不足或者程序调用刷盘指令时,脏页会被刷回磁盘。因此,通常情况下,内存不足时最先释放文件映射页。
匿名页:
并不是所有的内存都能对应到文件,比如程序中的一些中间数据,malloc申请的内存空间。它们没有对应的文件,所以被称之为匿名页。
交换分区(SWAP):
操作系统划了一个专门的空间来给匿名页做交换。称之为交换分区(SWAP),Windows中称之为虚拟内存。当物理内存紧张时,脏页被刷回磁盘文件,而匿名页则被交换到SWAP中。
但,因为使用SWAP会消耗大量IO,而且也会大量浪费内存(记录地址等),加上目前内存容量越来越大。所以大多情况下,SWAP都不启用。
Page Cache
页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访问。显然,这是文件映射页。
Page cache是vfs文件系统层的cache,例如 对于一个ext3文件系统而言,每个文件都会有一棵radix树管理文件的缓存页,这些被管理的缓存页被称之为page cache。所以,page cache是针对文件系统而言的。
Buffer Cache
其中文名称为缓冲器高速缓冲存储器,buffer cache是对设备数据的缓存。
在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘block进行读写,那么数据会缓存到buffer cache。
这里给人一种重复缓存的感觉,Buffer Cache缓存了一次,Page Cache又缓存了一次,这显然是没必要的。所以,在Linux 2.6的内核中Page cache和Buffer cache进一步结合,Buffer pages其实也是Page cache里面的页。所以,如果数据既在Buffer Cache缓存又在Page Cache缓存,那就直接用Page Cache存储,不会存两份。当然,一些磁盘的信息,依然是Buffer Cache存储的。
转载请注明:旅途@KryptosX » Linux内存术语小记