Linux - Linux内存管理
创始人
2024-05-31 18:32:38
0

文章目录

  • 概念
  • 物理内存和虚拟内存
  • 内存的监控
    • 从内核的角度来查看内存的状态
    • 从应用层的角度来看系统内存的使用状态
    • 缓冲区(buffer)与缓存(cache)的异同
  • 交换空间的使用
    • 创建交换空间
    • 激活和使用交换空间
    • 移除交换空间

在这里插入图片描述


概念

内存管理是Linux系统重要的组成部分。为了解决内存紧缺的问题,Linux引入了虚拟内存的概念。为了解决快速存取,引入了缓存机制、交换机制等。


物理内存和虚拟内存

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

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

作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的虚拟内存。更详细地说,就是内核会将暂时不用的内存块信息写到交换空间,这样,物理内存得到了释放,这块内存就可以用于其他目的。当需要用到原始内容时,这些信息会被重新从交换空间读入物理内存。

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

在这里插入图片描述

要深入了解Linux内存运行机制,需要知道下面提到的几个方面。

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

  • 其次,Linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存中,Linux内核根据“最近最经常使用”算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。

    有时我们会看到这么一个现象:Linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪。

    例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,因此就会有一些不常用页面文件被交换到虚拟内存中。但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心,只要知道是什么原因就可以了。

  • 最后,交换空间的页面在使用时会首先被交换到物理内存中。 如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致Linux出现假死机、服务异常等问题。Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。


内存的监控

监控内存最常使用的命令有free、top等

[root@localhost ~]# freetotal    used     free   shared  buffers  cached
Mem:     16402432  16360492    41940    0   465404  12714880
-/+ buffers/cache:    3180208  13222224
Swap:    8193108    264    8192844

首先是第一行中的选项。

  • total:物理内存的总大小。
  • used:已经使用的物理内存大小。
  • free:可用的物理内存值。
  • shared:多个进程共享的内存值。
  • buffers/cache:磁盘缓存的大小。

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

第三行的(−/+ buffers/cache)代表磁盘缓存使用状态。

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

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

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

关于free命令输出的内存状态,从内核的角度来看,就是内核目前可以直接分配到的内存,不需要额外的操作,即为上面free命令输出中第二行Mem选项的值。
在这里插入图片描述

可以看出,此系统物理内存有16GB,可用的内存只有41940KB,也就是40MB多一点。

我们来做一个这样的计算:

16402432−16360492=41 940

在这里插入图片描述

其实就是总的物理内存减去已经使用的物理内存得到的就是可用的物理内存大小。注意,这里的可用内存值41 940并不包含处于缓冲区和缓存状态的内存大小。

如果你认为这个系统可用内存太小,那你就错了。实际上,内核完全控制着内存的使用情况,Linux会在需要内存的时候,或在系统运行逐步推进时,将缓冲区和缓存状态的内存变为可用状态的内存,以供系统使用。


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

从应用层的角度来看,系统内存也就是Linux上运行的应用程序可以使用的内存大小,即free命令第三行“(-/+ buffers/cached)”的输出。

在这里插入图片描述

可以看到,此系统已经使用的内存才3 180 208KB,而可用内存达到13 222 224KB。继续做这样一个计算:

41 940+(465 404+12 714 880)=13 222 224

通过这个等式可知,应用程序可用的物理内存值是Mem项的free值加上buffers和cache值之和。也就是说,这个free值是包括buffers和cache项大小的

对于应用程序来说,buffers/cache占有的内存是可用的,因为buffers/cache是为了提高文件读取的性能。当应用程序需要用到内存的时候,buffers/cache会很快地被回收,以供应用程序使用。

在这里插入图片描述


缓冲区(buffer)与缓存(cache)的异同

在Linux操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入这些内存中,然后再将数据分发给应用程序;当需要往文件中写入数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。

然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘,系统的读写性能就变得非常低下。

因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程。在这种情况下,Linux引入了缓冲区和缓存机制。

缓冲区与缓存都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息。当操作系统需要读取某些文件时,会首先在缓冲区与缓存内查找,如果找到,直接读出并传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制。通过缓存,大大提高了操作系统的性能。

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

交换空间的使用

虽然现在的内存已经变得非常廉价,但是交换空间仍然有很大的使用价值,合理地规划和使用交换分区,对系统稳定运行至关重要。Linux下可以使用文件系统中的一个常规文件或者一个独立分区作为交换空间。同时Linux允许使用多个交换分区或者交换文件。

创建交换空间

创建交换空间所需的交换文件是一个普通的文件,但是,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须位于本地硬盘上,不能在网络文件系统(NFS)上创建交换文件。例如:

[root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536
65536+0 records in
65536+0 records out

这样就创建一个有连续空间的交换文件,大小为60MB左右。

下面对dd命令做简单的讲述。其中各个选项的含义如下。

  • if=输入文件或者设备名称。
  • of=输出文件或者设备名称。
  • ibs=m表示一次读入m个字节(即一个块大小为m个字节)。
  • obs=m表示一次写m个字节(即一个块大小为m个字节)。
  • bs=m,同时设置读写块的大小,以字节为单位,此参数可代替 ibs 和 obs。
  • count=n仅复制n个块。
  • skip=n表示从输入文件开头跳过n个块后再开始复制。
  • seek=n表示从输出文件开头跳过n个块后再开始复制(通常只有当输出文件是磁盘或磁带时才有效)。

这里的输入设备/dev/zero代表一个输出永远为0的设备文件,使用它作为输入可以得到全为空的文件。


激活和使用交换空间

首先通过mkswap命令指定作为交换空间的设备或者文件。

[root@localhost ~]#mkswap /data/swapfile
Setting up swapspace version 1, size = 67104 KB
[root@localhost backup]# freetotal    used    free   shared  buffers   cached
Mem:    2066632     1998188   68444    0    26160    1588044
-/+ buffers/cache:    383984  1682648
Swap:   4088500     101036  3987464

从上面的输出可知,我们指定了一个67104 KB的交换空间,而此时新建的交换空间还未使用。下面简单介绍mkswap命令,mkswap的一般使用格式如下。

mkswap [参数] [设备名称或文件][交换区大小]

参数说明如下。

-c:建立交换区前,先检查是否有损坏的区块。
-v0:建立旧式交换区,此为预设值。
-v1:建立新式交换区。
交换区大小:指定交换区的大小,单位为1024字节。

设置交换分区后,接着通过swapon命令激活交换空间。

[root@localhost ~]#/usr/sbin/swapon /data/swapfile
[root@localhost backup]# freetotal    used    free   shared   buffers   cached
Mem:    2066632  1997668   68964      0     27404  1588880
-/+ buffers/cache:   381384  1685248
Swap:   4154028   100976  4053052

通过free命令可以看出,交换空间大小已经由4088500KB变为4154028KB,相差的值是60MB左右,刚好等于我们增加的一个交换文件大小,这说明新增的交换分区已经可以使用了。然而,如果Linux重启,那么新增的交换空间将变得不可用,因此需要在/etc/fstab中添加自动加载设置。

/data/swapfile   none   swap   sw  0  0

这样,Linux在重启后就可以实现自动加载交换分区了。其实Linux在启动过程中会执行“swapon -a”命令,此命令会加载列在/etc/fstab中的所有交换空间。

移除交换空间

通过swapoff即可移除交换空间。

[root@localhost ~]#/usr/sbin/swapoff /data/swapfile

其实也可以通过“swapoff -a”移除在/etc/fstab中定义的所有交换空间,这里的“swapoff -a”与上面提到的“swapon -a”对应。执行“swapoff -a”后,free命令输出如下。

[root@localhost backup]# freetotal    used    free   shared  buffers   cached
Mem:    2066632  2048724    17908      0    30352  1642748
-/+ buffers/cache:   375624   1691008
Swap:      0     0     0

在这里插入图片描述

相关内容

热门资讯

苹果表有安卓系统时间,时间同步... 你有没有发现,最近苹果表也开始支持安卓系统了?没错,就是那个一直以封闭著称的苹果,竟然也开始拥抱安卓...
原生安卓系统裁剪图片,原生安卓... 你有没有发现,用原生安卓系统拍照,有时候拍出来的照片分辨率超高,但就是有点大,想裁剪却不知道怎么操作...
安卓系统蓝牙开关APP,安卓系... 你有没有遇到过这种情况:手机里的安卓系统蓝牙开关总是让人摸不着头脑?有时候想开蓝牙,却找不到开关在哪...
安卓系统能登录ios系统王者吗... 你有没有想过,安卓系的手机能不能登录iOS系统的王者荣耀呢?这可是个让人好奇不已的问题哦!毕竟,两个...
苹果和安卓系统文件怎么,系统架... 你有没有想过,为什么你的手机里那么多乱糟糟的文件,有时候找起来还真是头疼?今天,就让我来给你好好捋一...
安卓系统9.0稳定版,深度解析... 你知道吗?最近安卓系统9.0稳定版可是火得一塌糊涂呢!这款系统不仅带来了全新的功能和优化,还让无数安...
安卓系统目录结构网盘,安卓系统... 你有没有想过,你的安卓手机里那些看似杂乱无章的文件,其实背后隐藏着一个有序的目录结构呢?今天,就让我...
安卓系统在哪里买专辑,专辑购买... 你有没有想过,手机里那熟悉的安卓系统,竟然也能帮你买到心仪的专辑呢?没错,就是那个让你随时随地畅享音...
鸿蒙系统离开了安卓吗,迈向独立... 你有没有听说最近鸿蒙系统的大动作?没错,就是那个让安卓和iOS都紧张起来的操作系统。今天,咱们就来聊...
安卓系统耗电本地视频,本地视频... 手机电量总是不够用,是不是你也和我一样,对安卓系统的耗电问题头疼不已?尤其是当你想看个本地视频放松一...
手机安卓最好的系统是,揭秘最佳... 你有没有想过,为什么你的手机用起来有时候那么顺畅,有时候又那么卡顿呢?这背后其实和手机系统有着千丝万...
怎么拍镜像照片安卓系统,如何拍... 摄影爱好者们,你是否曾对那些在水中倒影中捕捉到的美丽瞬间感到着迷?想要在安卓手机上也能轻松拍出这样的...
安卓7运行xp系统,兼容性与性... 你有没有想过,把一个古老的操作系统装在现代的安卓设备上?想象安卓7系统下运行Windows XP,这...
戴尔安卓系统升级,解锁无限可能 你有没有发现,你的戴尔安卓设备最近是不是变得有点儿不一样了?没错,就是那个戴尔安卓系统升级,它就像一...
安卓系统怎么变苹果主题,打造苹... 你有没有想过,把你的安卓手机变成苹果风格的呢?想象那光滑的界面、简洁的图标,是不是瞬间觉得高大上了?...
系统进程有病毒吗安卓,安卓安全... 你有没有想过,你的安卓手机里那些忙碌的系统进程,它们会不会突然生病了呢?没错,我说的就是病毒!今天,...
编程安卓系统和鸿蒙主题,跨平台... 你有没有想过,手机的世界里,除了苹果的iOS和安卓的操作系统,还有个神秘的鸿蒙系统?今天,咱们就来聊...
哪个安卓机系统好用,探索安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的系统就像不同的烹饪手法,有的让你吃得津津有味,有的...
安卓如何控制苹果系统,从安卓到... 你知道吗?在这个科技飞速发展的时代,安卓和苹果两大操作系统之间的较量从未停歇。虽然它们各自有着忠实的...
安卓原生系统文件夹,安卓原生系... 你有没有发现,每次打开安卓手机,里面那些文件夹就像是一个个神秘的宝箱,里面藏着各种各样的宝贝?今天,...