linux中Swap分区是做什么的?

文章目录

    • 内存分段
      • 物理内存
      • 虚拟内存
    • 内存碎片的出现
    • Swap交换区
    • 内存分页
    • 有了内存之后的Swap
    • Swap区的弊端
    • 总结

​ 我们在操作服务器的时候,一般会用top命令查看整体系统资源,top命令除了CPU,内存以及任务运行情况等,在内存的显示信息下边还有一行信息,就是Swap,它跟内存的表示方法一样,以总量,空闲,使用大小来表示当前的占用情况,那它到底是什么呢,跟内存有什么区别么?

​ swap用英文表示是交换的意思,简单说Swap区就是服务器上的交换区,这块区域其实是硬盘,并不是内存,首先它的用法肯定是用来做交换的,系统是用内存和Swap区做交换,有两个目的,第一个就是减少系统内存碎片问题。第二个是增加内存的使用率,总的来说,它就是为了保证内存的最大化利用,接下来就简单了解一下为什么需要这块区域来完成这件事情。

内存分段

内存分段的意思是,我们内存空间被占用的时候,是需要以段的形式被占用,程序内部占用的虚拟内存的空间,对应的是物理内存上的一段实际空间。

物理内存

我们电脑插入的内存条,都是物理内存,对于一个可执行程序来说,它在编译成机器码之后,装载器会将所有执行的指令组合成一段按照顺序执行的指令空间,因为指令需要按照顺序执行,所以这块空间需要是连续的,可以想象成我们的数组一样。程序越复杂,可能占用的空间就会越大。如果仅仅使用物理内存,多个可执行程序同时运行的时候,没办法准确的让某个程序去占用某一段物理内存,如果存在竞争问题,那就会出现内存数据覆盖等一些问题。为了解决这个问题,设计出了虚拟内存这个东西。

虚拟内存

虚拟内存其实就是通过映射关系,将可执行程序的内存空间,合理化的分配到了物理内存上,对于程序来说,它占用的就是一块独立的内存空间,但是它占用的位置都是虚拟内存映射出来的,通过映射可以让程序去占用某一块非固定的物理内存。但是对于程序来说,占用的内存空间是独立的,不需要再考虑竞争的问题。

内存碎片的出现

从上边内存分段我们知道,每个程序都是占用了一段空间,但是会因为程序的复杂程度,空间的大小都不一定,这种就会有一种情况,可能空余出来的某一小段内存,永远无法被新的程序占用。假设有一个内存为100M的电脑,上边装了四个程序。

  • a(20M)

  • b(60M)

  • c(10M)

  • d(30M)

按顺序启动a,b,c三个程序。然后再想启动d程序,肯定是启动不起来的,因为内存不够了。那关掉第a程序,空间虽然够了,单依然无法起来,因为b程序正好占了内存的中间一段,哪怕现在有30M的空闲,但是他们不连续,无法分配给新程序,无法分配的空间就是内存碎片,整个内存无法被合理的进行使用。

Swap交换区

根据我们上边说的,虽然有空余空间,但是不连续,无法合理使用,想要解决的话,肯定是想办法让这些内存碎片连在一起。根据上边的四个程序,我们需要将b程序占用的内存挪到最前边0的位置,将C程序挪到1的位置,这样前边占用的空间就连在了一起,已使用的空间放在了一起,后边就都是未使用的空间。但是内存没办法支持那么大一块空间在内存里直接移动,所以就出现了Swap交换区,这块单独的空间,就是用来做存储交换的。可以将b程序先放在这块交换空间上,然后再把交换空间上的东西挪到内存0的位置。这样就完成了内存的整理。解决我们上边提到的内存碎片的问题。但是这种方式有个问题就是硬盘的操作比内存中慢很多,程序越大,那么完成这个交换的时间就越长,效率低下,影响程序使用。

内存分页

既然交换的内容过大,会变慢,那想办法让每次交换的内容变小,是不是就可以优化这个问题?设计者使用了分页的概念,虚拟内存与物理内存把整段的空间映射成一个一个小空间,将程序的占用分成了linux默认4KB大小的小空间。将内存占用分成这一个一个小块,先不说交换的会不会变快,我第一个问题就是内存是不是都不用交换了 ,随机找几十块4K的空间出来那不是很容易,为什么依然还需要交换区?其实这回交换区的作用就不再是为了单纯的减少内存碎片了。

有了内存之后的Swap

上边说的,有了内存分页之后,交换区可以不再去考虑那些4KB空间的小事,但是它能做的事情就更大了,它不再只是为了减少内存碎片,内存在不够分配的时候,系统会将不活跃的程序挪到Swap交换空间中,内存只保留活跃使用的程序,当需要使用的时候,再把这些程序挪回内存,这样变相的提升内存空间的使用率,甚至说扩大了内存空间,虽然慢了些,但是不会出现一些异常问题,给我们足够的时间去关闭程序或者做一些其他操作。

Swap区的弊端

当然交换区虽然有很多好处,但是也存在一定的弊端,因为本来硬盘的读写速度和内存比起来相差甚远

  1. 如果真的服务器上物理内存不够用了,依然还是一直在跟硬盘做资源交换,系统可能会有延迟,阻塞的问题
  2. 从swap区拿回内存的程序,在拿的过程中,肯定会有卡顿的问题。

总结

本片文章简单介绍了Swap分区的作用,交换区虽然可以在一定程度上提升内存的使用率,但是在真正的服务器运行环境中,我们要根据自己的需求去分配Swap空间,或者是否考虑使用它。要看我们真的需要服务器一直苟延残喘,还是直接让它抛出错误,我们及时扩容内存或者调整程序。

本文为个人极客时间,深入浅出计算机组成原理笔记,如有理解问题麻烦指出,感谢

你可能感兴趣的:(基础,计算机原理,linux,服务器,windows)