Linux 虚拟内存 交换空间

从查看内存开始

通过proc查看

#cat /proc/meminfo 
MemTotal:         220976 kB
MemFree:          206188 kB
MemAvailable:     205556 kB
Buffers:             204 kB
Cached:             1412 kB
SwapCached:            0 kB
Active:             2232 kB
Inactive:            148 kB
Active(anon):        760 kB
Inactive(anon):        4 kB
Active(file):       1472 kB
Inactive(file):      144 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         220976 kB
...

通过 free 查看

#free -m
             total         used         free       shared      buffers
Mem:           215           14          201            0            0
-/+ buffers:                 14          201
Swap:            0            0            0

重点关注的项目:
free:空余的物理内存的空间
available:用户应用程序可以使用的物理空间
(通常为 buff/cache + free,不过这个是由偏差的)
page cache:文件系统的缓冲
buffer chche:磁盘等块设备的缓冲

问题

为什么需要虚拟内存

如果不使用虚拟内存,当物理内存不够时,程序就无法跑起来

虚拟内存,给用户提供了那些基本机制

给每个进程提供了4Gb的内存空间

既然每个进程都有4G的内存空间,为什么会出现物理内存不足,需要拓展内存

当malloc需要的内存超过,物理空闲内存和交换空间的大小时,是无法分配内存的。4G只是最大大小,很多嵌入式系统,是根本无法分配如此大的空间的。并且,当所有的物理内存都被虚拟内存映射使用时,继续使用就需要将物理内存的数据写回到文件系统中,或者放到交换分区,这样会十分的浪费时间,系统使用将会非常卡顿。

既然由虚拟内存机制,为什么还需要交换分区,什么时候将会使用交换分区

并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写,当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。
交换分区是为了缓解内存不足,没有交换分区,系统也是可以正常运行的。

虚拟内存和缓存

缓存和虚拟内存,没啥关系,无论有没有虚拟内存,都需要缓存

  1. 因为代码段,数据段都需要拷贝到,内存中,cpu才可以执行。
  2. 因为cpu 和 磁盘之间的处理速度相差太大,使用缓冲可以缓解压力,提高系统效率。
    没有虚拟内存,就缓存在物理内存上,有虚拟内存,就从物理内存再次映射到虚拟内存上。如果系统访问的虚拟内存内容,还没有加载到物理内存中,就会触发缺页异常。需要注意的使bufferd 和 cached。他们的使用如图片所示:
    在这里插入图片描述

什么的缺页异常

指定访问的虚拟page,不在物理内存中,就会触发缺页异常:
page fault的种类:
segment fault : 进程访问的地址不在虚拟空间里属于越界访问。
hard page fault: 访问的内存不在物理内存中,需要从存储设备加载进内存中。
minor page fault: 访问的内存不在虚拟内存中,需要重新建立映射关系。

如何手动消除缓冲

缓冲占用的内存过大时,可以通过
sync
echo 1 > /proc/sys/vm/drop_caches

虚拟内存有什么好处

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
2.共享内存,使用虚拟内存机制,共享内存将会极为方便,两个进程的虚拟地址空间,都只向通过一块物理内存就可以实现,内存共享。
3.内存保护,通过虚拟内存机制可以,使每个进程都有独立的内存空间,不受干扰。

vmalloc kmalloc malloc

这几个的区别,可以参考下面的文章。
关键点,vmalloc kmalloc是内核空间的,malloc是用户空间的。
https://www.cnblogs.com/arnoldlu/p/8251333.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值