“Memory management”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“'''内存管理''' 是任何操作系统 kernel的关键部分。 为程序提供一种定期分配和释放内存的快速方法是内核的主要职责。 分配|物理内存有许多实现,包括位图、伙伴分配和使用树结构或队列/堆栈。 ''有关内存分配模型和分配内存方法的概述,请参阅程序内存分配类型。 如果您正在寻找堆类型的内存管理,即不在大边界上分配…”)
 
第1行: 第1行:
'''内存管理''' 是任何操作系统[[Kernels | kernel]]的关键部分。 为程序提供一种定期分配和释放内存的快速方法是内核的主要职责。 [[页面_帧|分配|物理内存]]有许多实现,包括位图、伙伴分配和使用树结构或队列/堆栈。
'''内存管理''' 是任何操作系统[[Kernels|内核(kernel)]]的关键部分。 为程序提供一种定期分配和释放内存的快速方法是内核的主要职责。 [[Page_Frame_Allocation|分配物理内存]]有许多实现,包括bitmaps、buddy allocation和使用树结构或队列/堆栈。


''有关内存分配模型和分配内存方法的概述,请参阅[[程序内存分配类型]]。 如果您正在寻找堆类型的内存管理,即不在大边界上分配较小的内存块,请参阅[[heap | heap]]页面。 堆通常(以流行的思维方式)不仅在内核中实现,而且在应用程序中以标准库的形式实现。 有关自动内存管理方法的讨论,请参阅[[垃圾收集]]。''
''有关内存分配模型和分配内存方法的概述,请参阅[[Program Memory Allocation Types|程序内存分配类型]]。 如果你正在寻找堆类型的内存管理,即不在大边界上分配较小的内存块,请参阅[[heap|堆(heap)]]页面。 堆通常(以流行的思维方式)不仅在内核中实现,而且在应用程序中以标准库的形式实现。 有关自动内存管理方法的讨论,请参阅[[Garbage Collection|垃圾收集]]。''


==地址空间==
==地址空间==
包括x86在内的许多平台都使用内存管理单元([[MMU]])来处理虚拟地址空间和物理地址空间之间的转换。 一些体系结构具有内置MMU,而其他体系结构具有单独的芯片。 拥有多个地址空间允许每个任务有自己的内存空间来工作。 在现代系统中,这是内存保护的主要部分。 保持进程的内存空间分开可以使它们在运行时不会在另一个进程的内存空间中造成问题。
包括x86在内的许多平台都使用内存管理单元([[MMU|MMU- memory management unit]])来处理虚拟地址空间和物理地址空间之间的转换。 一些架构具有内置MMU,而其他架构使用单独的芯片。 拥有多个地址空间允许每个任务有自己的内存空间来工作。 在现代系统中,这是内存保护的主要部分。 保持进程的内存空间分开可以使它们在运行时不会在另一个进程的内存空间中造成问题。


===物理地址空间===
===物理地址空间(Physical Address Space)===
物理地址空间是用于访问RAM中真实位置的直接内存地址。 该空间中使用的地址是用于标识地址总线上内存位置的位模式。
物理地址空间是用于访问RAM中真实位置的直接内存地址。 该空间中使用的地址是用于标识地址总线上内存位置的位模式。


在这个内存模型中,每个可执行文件或库都必须使用PIC(位置独立代码),或者随附重新定位表,以便加载器可以调整跳转和分支目标。
在这个内存模型中,每个可执行文件或库都必须使用PIC(位置独立代码-position-independent code),或者随附重新定位表,以便加载器可以调整跳转和分支目标。


在早期的680x0 CPU中没有[[MMU]]的情况下,阿米加奥人使用这种内存模型。 它是最有效的,但它不允许进程之间相互保护,因此在今天的桌面操作系统中被认为是过时的。 它也容易出现内存碎片;然而,某些嵌入式系统仍然使用它。
在早期的680x0 CPU中没有[[MMU]]的情况下,AmigaOS使用这种内存模型。 它是最有效的,但它不允许进程之间相互保护,因此在今天的桌面操作系统中被认为是过时的。 它也容易出现内存碎片;然而,某些嵌入式系统仍然使用它。


===虚拟地址空间===
===虚拟地址空间(Virtual Address Space)===
[[MMU]]s(内存管理单元)的出现允许使用虚拟地址。 虚拟地址可以映射到任何物理地址。 可以为每个可执行文件提供自己的地址空间,以便内存始终从0x0000 0000开始。这减轻了可执行加载程序的一些重新定位工作,并解决了内存碎片问题—您不再需要物理上连续的内存块。 由于内核控制着虚拟到物理的映射,进程不能访问彼此的内存,除非内核允许这样做。
[[MMU]](内存管理单元)的出现允许使用虚拟地址。 虚拟地址可以映射到任何物理地址。 可以为每个可执行文件提供自己的地址空间,以便内存始终从0x0000 0000开始。这减轻了可执行加载程序的一些重新定位工作,并解决了内存碎片问题—你不再需要物理上连续的内存块。 由于内核控制着虚拟到物理的映射,进程不能访问彼此的内存,除非内核允许这样做。


==记忆翻译系统==
==内存转换系统(Memory Translation Systems)==
x86平台在现代计算机系统中是独一无二的,因为它有两种方法来处理虚拟地址和物理地址之间的映射。 分页和分段这两种方法都使用非常不同的系统来管理内存映射。
x86平台在现代计算机系统中是独一无二的,因为它有两种方法来处理虚拟地址和物理地址之间的映射。 分页和分段这两种方法都使用非常不同的系统来管理内存映射。


===分段===
===分段===
{{Main|Segmentation}}
{{Main|Segmentation}}
除x86外,主流系统中通常不提供分段功能。在保护模式下,此方法涉及将进程的每个内存区域划分为多个单元。 这由[[CPU寄存器x86#段寄存器|段寄存器]]处理:''CS、DS、SS、ES、FS、GS''(代码段、数据段、堆栈段,其余为外段)。
除x86外,主流系统中通常不提供分段功能。在保护模式下,此方法涉及将进程的每个内存区域划分为多个单元。 这由[[CPU Registers x86#段寄存器|段寄存器]]处理:''''CS、DS、SS、ES、FS、GS''''(代码段、数据段、堆栈段,其余为额外段)。


===分页===
===分页===
{{Main|Paging}}
{{Main|Paging}}
当然,为每个地址单独设置虚拟到物理的映射是无效的。 虚拟内存的传统方法是将可用的物理内存拆分为块(页),并“逐页”将虚拟地址映射到物理地址。此任务主要由[[MMU]]处理,因此对性能的影响很小,并且通常被认为是支付内存保护的适当价格。
当然,为每个地址单独设置虚拟到物理的映射是无效的。 虚拟内存的传统方法是将可用的物理内存拆分为块(页),并“逐页”将虚拟地址映射到物理地址。此任务主要由[[MMU]]处理,因此对性能的影响很小,并且通常被认为是支付内存保护的适当付出。


[[Image:Virtual memory.png|frame|none|paging illustrated: two process with different views of the same physical memory]]
[[Image:Virtual memory.png|frame|none|分页说明:两个进程对同一物理内存有不同的视图]]


==虚拟内存==
==虚拟内存==
第33行: 第33行:
下一步不是在物理内存用完后报告“内存不足”,而是获取当前未实际访问的页面,并将其写入硬盘(交换文件或分区)——释放物理内存页面。 This is referred to as "paging out" memory.
下一步不是在物理内存用完后报告“内存不足”,而是获取当前未实际访问的页面,并将其写入硬盘(交换文件或分区)——释放物理内存页面。 This is referred to as "paging out" memory.


这需要额外的簿记和调度,当进程访问当前已调出且必须从硬盘重新调出的页面时,会导致严重的性能损失,并且需要一些智能设计才能有效运行。 如果做得不对,操作系统的这一部分会“严重”影响您的性能。
这需要额外的记录和调度,当进程访问当前已调出且必须从硬盘重新调出的页面时,会导致严重的性能损失,并且需要一些智慧设计才能有效运行。 如果做得不对,操作系统的这一部分会“严重”影响你的性能。


另一方面,您的“虚拟地址空间”增长到您的CPU和硬盘驱动器可以处理的任何内容。 从概念上讲,CPU缓存和RAM只是成为硬盘顶部的缓存层,这代表了“真正的”内存限制。
另一方面,你的“虚拟地址空间”增长到你的CPU和硬盘驱动器可以处理的任何内容。 从概念上讲,CPU缓存和RAM只是在硬盘之上的缓存层,硬盘容量代表了“真正的”内存限制。


页面交换系统依赖于这样一种假设,即在给定时间,进程不需要所有内存才能正常工作,但只是其中的一小部分(比如,如果你在复制一本书,你当然不需要整本书和一整套空白页:如果有人能给你带来新的空白页,并将你刚写的空白页归档,或者在你几乎用完cur时给你带来下一章,那么当前章节和一堆空白页就足够了。)租一间)。这被称为“工作集”抽象。 为了正确运行,流程至少需要其物理页面的工作集:如果向流程提供的页面较少,则存在“抖动”的高风险,这意味着该进程将不断地要求交换页面——这将迫使该进程工作集中的其他页面在本应保持存在的情况下被交换出去。
页面交换系统依赖于这样的假设,即在给定时间,进程不需要所有内存就能正常工作,只需要其中的一部分即可 (例如,如果您要抄写一本书,则当然不需要整本书和一整套空白页: 如果有人能给你带来新的空白页,并在你缺少空白页时归档你刚刚写的页面,那么只要当前的章节和一堆空白页就足够了, 或者当你快要看完当前的一章时带给你下一章)。 这被称为 “工作集(working set)” 抽象。 为了正确运行,进程至少需要其正在使用的物理页面工作集: 如果向进程提供的内存页面较少,则存在“抖动”的高风险,这意味着进程将不断要求交换页面——这将迫使此进程工作集中的其他页面在本应保持存在的情况下交换出去。


<blockquote>
<blockquote>
   ''注意:页面交换有一些替代方法,如段交换和进程交换。 在这些情况下,交换是由用户软件控制的,这给应用程序开发人员带来了更大的压力,并导致更长的交换时间,因为要交换的逻辑内容大于4K页面。''
   ''注意:页面交换有一些替代方法,如段交换和进程交换。 在这些情况下,交换是由用户软件控制的,这给应用程序开发人员带来了更大的压力,并导致更长的交换时间,因为要交换的逻辑内容会大于4K页面。''


''其他注意事项:主流桌面操作系统有一种推测性算法,它试图通过加载比需要的更多的页面来减少“页面丢失”的频率,并希望这些额外的页面会有用。 由于程序往往具有“本地化”访问,而且磁盘读取N个扇区的磁道比读取N个独立扇区的磁道快,因此投机交换可能会带来好处。''
''其他注意事项:主流桌面操作系统有一种推测性算法,它试图通过加载比需要的更多的页面来减少“页面丢失(page miss)”的频率,并希望这些额外的页面会有用。 由于程序往往具有“本地化(localized)”访问的倾向,而且磁盘读取N个扇区的磁道比读取N个独立扇区的磁道快,因此投机性的交换可能会带来好处。''
</blockquote>
</blockquote>


第55行: 第55行:
*[[Brendan's Memory Management Guide]]
*[[Brendan's Memory Management Guide]]


===话题===
===论坛主题===
*[[topic:12307|Paging Mechanisms]]
*[[topic:12307|Paging Mechanisms]]
*[[topic:12022|Paging Concepts (by Brendan)]]
*[[topic:12022|Paging Concepts (by Brendan)]]

2022年3月24日 (四) 13:08的版本

内存管理 是任何操作系统内核(kernel)的关键部分。 为程序提供一种定期分配和释放内存的快速方法是内核的主要职责。 分配物理内存有许多实现,包括bitmaps、buddy allocation和使用树结构或队列/堆栈。

有关内存分配模型和分配内存方法的概述,请参阅程序内存分配类型。 如果你正在寻找堆类型的内存管理,即不在大边界上分配较小的内存块,请参阅堆(heap)页面。 堆通常(以流行的思维方式)不仅在内核中实现,而且在应用程序中以标准库的形式实现。 有关自动内存管理方法的讨论,请参阅垃圾收集

地址空间

包括x86在内的许多平台都使用内存管理单元(MMU- memory management unit)来处理虚拟地址空间和物理地址空间之间的转换。 一些架构具有内置MMU,而其他架构使用单独的芯片。 拥有多个地址空间允许每个任务有自己的内存空间来工作。 在现代系统中,这是内存保护的主要部分。 保持进程的内存空间分开可以使它们在运行时不会在另一个进程的内存空间中造成问题。

物理地址空间(Physical Address Space)

物理地址空间是用于访问RAM中真实位置的直接内存地址。 该空间中使用的地址是用于标识地址总线上内存位置的位模式。

在这个内存模型中,每个可执行文件或库都必须使用PIC(位置独立代码-position-independent code),或者随附重新定位表,以便加载器可以调整跳转和分支目标。

在早期的680x0 CPU中没有MMU的情况下,AmigaOS使用这种内存模型。 它是最有效的,但它不允许进程之间相互保护,因此在今天的桌面操作系统中被认为是过时的。 它也容易出现内存碎片;然而,某些嵌入式系统仍然使用它。

虚拟地址空间(Virtual Address Space)

MMU(内存管理单元)的出现允许使用虚拟地址。 虚拟地址可以映射到任何物理地址。 可以为每个可执行文件提供自己的地址空间,以便内存始终从0x0000 0000开始。这减轻了可执行加载程序的一些重新定位工作,并解决了内存碎片问题—你不再需要物理上连续的内存块。 由于内核控制着虚拟到物理的映射,进程不能访问彼此的内存,除非内核允许这样做。

内存转换系统(Memory Translation Systems)

x86平台在现代计算机系统中是独一无二的,因为它有两种方法来处理虚拟地址和物理地址之间的映射。 分页和分段这两种方法都使用非常不同的系统来管理内存映射。

分段

正文: Segmentation

除x86外,主流系统中通常不提供分段功能。在保护模式下,此方法涉及将进程的每个内存区域划分为多个单元。 这由段寄存器处理:'CS、DS、SS、ES、FS、GS'(代码段、数据段、堆栈段,其余为额外段)。

分页

正文: Paging

当然,为每个地址单独设置虚拟到物理的映射是无效的。 虚拟内存的传统方法是将可用的物理内存拆分为块(页),并“逐页”将虚拟地址映射到物理地址。此任务主要由MMU处理,因此对性能的影响很小,并且通常被认为是支付内存保护的适当付出。

分页说明:两个进程对同一物理内存有不同的视图

虚拟内存

下一步不是在物理内存用完后报告“内存不足”,而是获取当前未实际访问的页面,并将其写入硬盘(交换文件或分区)——释放物理内存页面。 This is referred to as "paging out" memory.

这需要额外的记录和调度,当进程访问当前已调出且必须从硬盘重新调出的页面时,会导致严重的性能损失,并且需要一些智慧设计才能有效运行。 如果做得不对,操作系统的这一部分会“严重”影响你的性能。

另一方面,你的“虚拟地址空间”增长到你的CPU和硬盘驱动器可以处理的任何内容。 从概念上讲,CPU缓存和RAM只是在硬盘之上的缓存层,硬盘容量代表了“真正的”内存限制。

页面交换系统依赖于这样的假设,即在给定时间,进程不需要所有内存就能正常工作,只需要其中的一部分即可 (例如,如果您要抄写一本书,则当然不需要整本书和一整套空白页: 如果有人能给你带来新的空白页,并在你缺少空白页时归档你刚刚写的页面,那么只要当前的章节和一堆空白页就足够了, 或者当你快要看完当前的一章时带给你下一章)。 这被称为 “工作集(working set)” 抽象。 为了正确运行,进程至少需要其正在使用的物理页面工作集: 如果向进程提供的内存页面较少,则存在“抖动”的高风险,这意味着进程将不断要求交换页面——这将迫使此进程工作集中的其他页面在本应保持存在的情况下交换出去。

注意:页面交换有一些替代方法,如段交换和进程交换。 在这些情况下,交换是由用户软件控制的,这给应用程序开发人员带来了更大的压力,并导致更长的交换时间,因为要交换的逻辑内容会大于4K页面。

其他注意事项:主流桌面操作系统有一种推测性算法,它试图通过加载比需要的更多的页面来减少“页面丢失(page miss)”的频率,并希望这些额外的页面会有用。 由于程序往往具有“本地化(localized)”访问的倾向,而且磁盘读取N个扇区的磁道比读取N个独立扇区的磁道快,因此投机性的交换可能会带来好处。

另见

文章

论坛主题

外部链接

de:Speicherverwaltung