直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就有了物理内存与虚拟内存

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存,虚拟内存就是为了满足物理内存的不足而提出的,它是利用磁盘空间虚拟出的一块逻辑内存用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。 作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,内核会将暂时不用的物理内存块信息写到交换空间,这样,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。 linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。 

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

其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用。 最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。(交换内存->物理内存->交换内存->物理内存)导致linux出现假死机。  

交换分区swap

Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空闲的硬盘分区,硬盘的空间都已经分配完毕。

内存管理_物理内存

方法一——创建交换文件

1.创建交换文件

创建交换文件通过dd命令来完成。 dd命令的参数如下:

if =输入文件,或者设备名称。

of=输出文件或者设备名称。

ibs=bytes 表示一次读入bytes 个字节

obs=bytes 表示一次写bytes 个字节

 bs=bytes,同时设置读写块的大小,以bytes为单位,一般是1024,此参数可代替 ibs 和 obs,省略ibs 和 obs。

count=blocks 仅拷贝blocks个块。

skip=blocks 表示从输入文件开头跳过 blocks 个块后开始复制 seek=blocks表示从输出文件开头跳过 blocks 个块后开始复制  

2、指定交换文件

交换文件在使用前需要激活,激活前需要通过mkswap命令指定作为交换分区的设备或者文件。

mkswap命令的格式为: mkswap [参数] [设备名称或文件][交换区大小]

-c:建立交换区前,先检查是否有损坏的区块。  

-v0:建立旧式交换区,此为预设值。

-v1:建立新式交换区。  

3.创建交换文件,增加swap分区文件大小

第一步:创建一个大小为6.7M的文件

第二步:把这个文件变成swap文件(指定交换文件)

第三步:启用这个swap文件(激活)

第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:

/swapfile  none  swap  sw 0 0  

创建交换文件的另一种方法
1. 创建文件

sudo fallocate -l 2M /swapfile

说明:2M 表示swap文件大小,/swapfile为swap文件路径和名称,可以任意指定。

2.修改文件权限

sudo chmod 600 /swapfile

3.将 swapfile 初始化为交换文件

sudo mkswap /swapfile

4.启用交换文件

sudo swapon /swapfile

如果重启系统后(开机可用),也使新增的swap分区可用,需要编辑/etc/fstab文件,在/etc/fstab文件中添加如下代码,系统重启后可以自动加载swap 分区。 /swapfile  none  swap  sw 0 0 /swapfile  none  swap  defaults 0 0

4、删除swap文件

删除swap文件时使用swapoff命令 例:sudo swapoff /swapfile   删除/swapfile,删除交换文件后,交换分区减少。  

方法二——添加交换分区

1.指定交换分区

mkswap命令指定交换分区,指定/dev/sdb5 为交换分区

2.激活分区

swapon激活/dev/sdb5交换分区

3.显示交换分区

swap分区由三个分区构成。刚建立的/dev/sdb5、系统的/dev/sda6、用交换文件/swapfile建立的

4.自动加载分区

如果让机器启动就启用交换分区,方法一样,编辑/etc/fstab, 使用vi 命令编辑,把下面/swapfile 改为/dev/sdb5。  

修改 /etc/fstab文件,启动后,增加交换分区,以下三条命令均可。

/swapfile  none  swap  sw 0 0

/swapfile  none  swap  defaults 0 0  

/swapfile  swap   swap  defaults 0 0  

实验:

1. 在根目录下建立一个6.5M的交换文件,文件名为/swapfile,并显示交换分区增加。


内存管理_虚拟内存_02


2. 指定你机器的第二个硬盘(sdb)的第一个逻辑分区(sdb5)为交换分区,并显示交换分区增加。

内存管理_物理内存_03

3. 显示机器的所有交换分区(文件)。

内存管理_物理内存_04

4. 把第一题的交换文件添加到/etc/fstab中,使机器重启后也可以使用增加的交换分区(文件)的大小;显示是否添加成功?(在添加交换文件之前,把/etc/fstab做备份为/etc/fstab1)

内存管理_物理内存_05