linux 整理碎片,linux主要目录

图解|Linux内存碎片整理

在操作系统中,物理内存是以页为单位进行管理的,每个内存页的默认大小为4K(不包括大页)。当系统申请内存时,通常是按顺序分配,而释放内存的行为是随机的。随着时间的推移,系统可能会出现内存碎片现象。

内存碎片是指系统中虽然有足够的空闲内存页,但由于这些空闲页分布不连续,无法满足用户申请连续内存页的需求。上图展示了这种情况,当用户需要连续的3个内存页时,尽管系统中空闲页数量足够,但由于它们分散在不同位置,导致分配失败。这些不连续的内存页就是内存碎片。

解决内存碎片问题相对简单,只需将这些分散的空闲内存页整理到一起即可。通过这种方式,可以有效利用这部分内存,避免内存浪费。上图展示了内存整理后的情况。

然而,尽管内存整理看起来简单,实现起来却并非易事。整理内存后,需要修正进程的虚拟内存与物理内存之间的映射关系。为了解决这个问题,Linux内核引入了内存页反向映射功能,使得内存整理过程变得相对简便。

接下来,我们深入分析内存碎片整理的原理与实现过程。内存碎片整理的原理相对直接:在整理开始前,在内存区的头部和尾部设置两个指针,一个从头向尾扫描可移动的页,另一个从尾向头扫描空闲的页。当这两个指针相遇时,整理过程结束。

在内存整理过程中,如果需要申请连续的多个内存页,整理过程会将可移动页的内容复制到空闲页中,然后释放可移动页。经过这样的处理,可以有效解决内存碎片问题。

内存碎片整理的实现过程包括时机选择和具体步骤。当系统尝试申请连续的多个内存页失败时,会触发内存碎片整理。具体实现路径涉及多个函数调用,包括alloc_pages_node、__alloc_pages_direct_compact等。

内存碎片整理时机选择的关键在于,当系统尝试分配多个连续内存页失败时,会调用try_to_compact_pages函数开始内存整理。此函数最终调用compact_zone_order函数,实现内存碎片整理。

在整理过程中,compact_zone_order和compact_zone是核心函数,分别用于收集可移动内存页列表和迁移这些内存页。isolate_migratepages和migrate_pages函数分别用于收集可移动内存页列表和迁移内存页。

unmap_and_move函数负责具体迁移内存页,实现了内存页从原位置到新位置的移动过程。在整理内存碎片后,系统还需重新构建虚拟内存映射,这涉及到内存页反向映射的知识点,后续文章将详细讨论。

总结而言,内存碎片整理旨在解决因内存碎片导致的连续内存页申请失败问题。在实际应用中,我们可以通过指定__GFP_WAIT标志位来避免内存碎片整理过程,以提高系统的响应速度。通过深入理解内存碎片整理的原理与实现,我们可以更有效地利用系统内存资源,提高程序性能。

Windows需要碎片整理,为什么Linux不需要

如果你是一个Linux用户,你可能会听说Linux的文件系统不需要碎片整理。你也可能会注意到Linux的发行版本也都没有磁盘碎片整理的功能。这是为什么呢?要理解为什么Linux的文件系统不会想Windows的文件系统一样产生碎片,你首先要明白碎片到底是如何产生的,还有这两大操作系统的文件系统的工作方式到底有什么不同。

什么是磁盘碎片?

很多Windows的用户,甚至包括一些没有经验的用户,都相信定时整理文件系统中的碎片会让他们的电脑运行得更快。但他们都不知道这是为什么。

简单来说,一个硬盘驱动器里面包含了很多扇区,每一个扇区都可以存储一小块数据。对于文件,尤其是比较大的文件来说,他们必须要存储在很多不同的扇区内。假设你的文件系统中有很多不同的文件,每一个文件都被存储在连续的扇区群中。然后,你对增加了其中某一个文件的大小。文件系统首先会尝试对该文件新增加的部分存储在紧挨着原来的扇区群的某个扇区中。但是如果当中没有足够的连续扇区,这个文件就必须要被分解成多个小块,这些操作对于你来说都是可见的。当你的硬盘读取这些文件的时候,他的磁头必须在不同的物理位置间跳转以读取连续的扇区群,这会降低它的速度。

碎片整理就是一个通过逐位(位是文件在磁盘中存储的最小单位)移动文件来减少碎片的精密的过程,以此来确保每一个文件在硬盘中都是连续存储的。

当然,对于固态硬盘来说这又有点不一样,固态硬盘不需要移动文件也不需要碎片整理。因为对一个SSD(固态硬盘)做碎片整理会减少它的寿命。而且,在最新版本的Windows系统中,你也不再需要为碎片整理担心,因为Windows会自动帮你完成。

Windows的文件系统如何工作

从前微软使用的FAT文件系统——最后一次作为默认系统被看到是在Windows 98和ME,尽管这个系统还在USB驱动器中使用——并不能够很好地排列文件。当你在FAT文件系统中保存文件时,它会尽可能地将文件排列在磁盘的首部。当你存放下一个文件时,它会将这个文件直接存放在第一个文件的后面,以此类推。所以当文件变大,永远都会有碎片产生,因为文件的旁边已经没有空间来存放增加的部分。

微软在Windows XP和2000中使用的较新的NTFS文件系统就尝试变得更聪明一点。这个文件系统会在文件周围放置更多名为”缓冲区“的自由空间,但是,任何一个Windows用户都会告诉你,NTFS文件系统总有一天也会产生碎片的。

因为文件系统这样的表现,他们需要碎片整理来保持性能。微软只能在最新版的Windows系统中通过在后台自动运行碎片整理程序来减轻这个问题。

Linux的文件系统如何工作

Linux的ext2,ext3,ext4文件系统——ext4是Ubuntu和目前大多发行版所采用的文件系统——会以一种更加智能的方式来放置文件。Linux的文件系统会将文件分散在整个磁盘,在文件之间留有大量的自由空间,而不是像Windows那样将文件一个接一个的放置。当一个文件被编辑了并且变大了,一般都会有足够的自由空间来保存文件。如果碎片真的产生了,文件系统就会尝试在日常使用中将文件移动来减少碎片,所以不需要专门的碎片整理程序。

因为这样的工作方式,你可能会在你的文件系统塞满之后看到碎片。如果文件系统95%(甚至80%)的空间被占用了,你就会开始看到一些碎片。然而,这样的文件系统本来就是设计来在普通使用中减少碎片的。

如果你真的在Linux上出现了碎片的烦恼,你可能就需要一个更大的硬盘了。如果你真的需要对一个文件系统做碎片整理,最简单的可能也是最可靠的方法就是将所有文件拷贝出来,然后清空原来的分区,再将文件拷贝回去。文件系统就会在你拷贝回去的过程中智能地将文件放置好。

你可以使用fsck命令来检测一下一个Linux文件系统的碎片化程度,只需要在输出中查看非连续节点个数(non-contiguous inodes)就可以了。

为什么 Linux 不需要碎片整理

有一个关于Linux的问题经常被问及:呢?在这里,我试图就“为什么有的文件系统比另一些文件系统更加需要磁盘碎片整理”给出一个简单的,非技术性的答案。

我将试图用一个ASCII矩阵来解释所有的原理,而不是用那些枯燥而晦涩的术语来打击大家的积极性。下面就是我将用来解释原理的矩阵:

以上这个矩阵就可以简单的用来表示一个很小的硬盘,初始状态是空的,全部都被0填充。在矩阵顶部和左侧的a-z都是用来定位每一个数据的。最左上角的那个0就是aa,最右上角的那个0就是za,最左下角的就是az。

我将以一个大家都非常非常熟悉的文件系统开始,一个经常需要磁盘碎片整理的系统—FAT。其实无论Windows用户还是Linux用户都会用到FAT文件系统。因为USB闪盘一般都使用这个文件系统。FAT是一个非常非常重要的文件系统,虽然它经常需要磁盘碎片整理。

我现在在磁盘上加入一个文件,于是磁盘看起来会变成这个样子:

正如你所看到的,前4行是TOC(Table Of Contents),即所谓的内容表。TOC会存储磁盘上所有文件的位置。在我上面的例子中,TOC包含了一个名字叫做“hello.txt”的文件,并且这个文件的内容是从ae到le的。往下看ae到le之间的内容,我们能看到这个文件的内容是“Hello,_world”

到目前为止,一切都正常对吗?好,那我们再来添加一个文件:

正如你所见,第二个文件被紧接着放置在第一个文件之后。这样的好处是你所有的文件都会紧密地放置在一起,这样读取它们将会非常的迅速和方便。要知道磁盘上最慢的就是读写头的移动了,它移动的越少,则读取的速度越快。

但是,当我们需要修改第一个文件的时候,问题就出来了。现在假设我们需要在“hello.txt”文件的尾部加入两个感叹号,我们就会遇到问题:没有空间!文件“bye.txt”挡住了“hello.txt”的去路。这时候我们有两个解决方法,但是没有一个是完美的。

1我们把文件“hello.txt”删掉,然后再“bye.txt”后面加入修改过后的“hello.txt”。

2我们把文件“hello.txt”拆成两部分存储,这样在“bye.txt”之前就不会有空的磁盘空间了。

第一种种方式表现出来就是这样:

第二种种方式表现出来就是这样:

而Linux却用一种不同的方式来处理这种问题。对于单用户来说Windows的文件系统已经够好的了,但是Linux生来就是为多用户设计的系统,它总是假设在同一时间有多个用户试图去操作不同的文件。所以Linux相对FAT文件系统,使用了另一种方法来设计自己的文件系统。Linux文件系统看起来是这样的:

当我们添加了文件以后就变成这样了:

这种文件系统的好处是磁盘的磁头可以一直位于中间位置,而所有的文件平均下来都会非常近。

当我们仍然给“hello.txt”加入两个感叹号时,我们来看看这会引起多大的麻烦:

对了!一点麻烦都没有!

Windows总是试图把文件存储在尽量靠近磁盘开始位置的地方,这导致当磁盘利用率变高的时候它经常会产生磁盘碎片。

Linux却在整个磁盘上存储文件,所以当文件的大小需要改变的时候,总是有足够的空间。

当然当磁盘利用率接近饱和的时候Linux也会需要文件整理。但是只要磁盘还有20%以上的可用空间,那么这种整理是基本不会发生的。

还有一点必须了解的是,即使当一个操作系统说某个磁盘已经完全碎片整理完毕了,但是根据一个磁盘的物理结构,碎片仍然会存在。因为磁盘总是由很多盘片和磁道组成的。

让我们来看看一个磁盘有两个盘片,aa到zm是第一个,an到zz是第二个。

一下的文件系统是有碎片的,因为文件横跨了行m和n。而这两行不是在一个盘片上的。要读取这个文件,磁盘的磁头必须从盘片1的最末尾跨越到盘片2的最开始。

阅读剩余
THE END