当我们使用程序时,系统性能理所当然是我们试图优化的最重要的事情之一。虽然有很多方法可以修改我们的代码以优化性能,但我们也可以采用其他的方法。例如,一种这样的技术是分页,它是一种内存管理的一种类型。我们将解释编程中的分页是什么以及它是如何工作的,附带示例。
编程中的分页是什么?
管理内存使用和访问对于帮助我们的程序尽可能高效地运行非常重要。因此,我们经常使用分页。这允许操作系统以页面的形式从辅助存储器加载进程。在编程中,页面是一块连续的虚拟内存块,大小固定。通过这样做,我们可以动态分配内存,并且只加载我们需要的进程。
分页的工作原理
对于分页,不出所料,我们需要将每个进程划分为页面形式。除此之外,分页将内存划分为帧,帧是与页面大小相同的一块物理内存块。我们将一个页面存储在主内存的一个帧中,优先考虑内存中的连续间隙。辅助存储器在不使用时保留页面。因此,我们避免了分配连续物理内存的需要。本质上,我们实际上得到了一个比我们实际可用的连续内存空间更大的空间。
例如,我们可以考虑一个大小为9 kb的主内存。这可以分成9个1 kb的帧。我们还有3个进程,p1到p3,每个进程可以分成3个1kb的页面。如果所有的帧都是空的,我们可以将页面连续映射,例如:
主内存 |
---|
p1 |
p1 |
p1 |
p2 |
p2 |
p2 |
p3 |
p3 |
p3 |
然而,我们可能没有所有的帧都为空,并且想要首先访问不同的进程。我们可以使用分页在主内存中非连续存储进程。这意味着我们以后可以将它们作为一个进程进行访问。例如,我们存储了p1,但然后我们想要在p1之前访问p4。p4有6个页面,可以非连续存储但仍然可以一起访问。为了演示,下面有一个图形。
主内存 |
---|
p4 |
p4 |
p4 |
p1 |
p1 |
p1 |
p4 |
p4 |
p4 |
逐步过程
我们已经讨论了分页的主要原理。现在,我们将描述所涉及的步骤。
首先,系统创建一个分页表。这个表跟踪逻辑内存中的页面与物理内存中的帧的映射关系。因为最开始没有加载的页面,我们用默认值初始化表。
其次,cpu访问内存并为所讨论的页面生成逻辑地址。然后,cpu检查所谓的转换后备缓冲区(ltb)或缓存存储器,该存储器存储最近访问的页表项。目的是检索与请求的页面相对应的所需条目。但是,如果找不到该条目,则操作系统处理此“页错误”,通常通过识别丢失的页面并在需要时从辅助存储器加载来完成。
操作系统还可以替换页面,通常是在物理内存已满的情况下进行。我们可以使用算法来确定要删除的页面,以腾出空间。这些算法通常基于先进先出(fifo)或最近最少使用(lru)原则。
最后,我们更新tlb以反映这些最近的更改,然后可以访问所需的页面。
计算机内存分页
©by evan mason – own work, cc by-sa 4.0 – license
分页的优缺点
分页可以非常有用,但是没有任何过程是没有潜在缺陷的。因此,我们将在下面总结分页的优点和缺点,并在这个方便的表格中进行概述。
优点 | 缺点 |
---|---|
通过减少内部碎片化,使内存更高效。内存以固定大小的块使用,通常比进程所需的大小更小。这样可以防止内存浪费,因为未使用的块较少。 | 由于分页引入了间接性,访问内存的时间复杂性增加。 |
同样可以减少外部碎片化,因为页面不需要连续存储。 | 可能遇到页面错误,其中页面无法正确访问,这可能会影响性能。 |
由于未使用的页面可以临时移动到辅助存储器中,因此内存更灵活,即使物理内存已满。 | 页面表管理可能使系统变得更加复杂。 |
使用虚拟内存支持大型逻辑地址空间,以便我们可以使用需要大量内存的程序,而不受内存物理大小的限制。 | 由于分页引入了间接性,访问内存的时间复杂性增加。 |
通过将进程分配给其自己的页表,内存得到更好的保护,因为进程无法访问其分配块之外的内存。 | 如果分页过多,可能导致抖动。这是由于页面检索过于频繁,内存需求超过物理容量而导致系统性能下降。 |
一旦页面已移动到物理内存中,访问页面可以更快地实现,加快内存使用速度。 | tlb未命中也会影响性能,因为必须搜索整个页表。 |
总结
总体来说,分页是编程中一种优化性能的有用技术,如果管理得当。而且,通过将逻辑内存分成固定大小的块,我们可以根据要执行的进程动态分配和释放内存。确保正确配置页面大小和算法,并持续监视系统以检测出现的抖动。只要及时而合理地处理错误和故障,分页仍然是管理系统内存的有效方式。