虚拟内存效应及分页与分段的关系
virtual memory effects and relations between paging and segmentation
这是我的第一个 post。我想问一下虚拟内存和分页、分段有什么关系。我在互联网上搜索了几天,但仍然无法将这些信息整理成正确的顺序。这是我目前所知道的:
我们可以讨论内存中的地址(我们可以说它们是内存抽象级别):
物理层(CPU与内存控制器通信,"hey give me contents of address 0xFFEABCD",这些地址是RAM中单元的地址,所以单元0xABCD的物理地址是0xABCD。内存控制器只能使用物理地址,所以如果不是物理地址就必须改成物理地址。
逻辑层。这是对物理地址的抽象。如果请求内存(假设分配成功),这里的进程将获得与 RAM 中的单元没有直接关系的地址。我们可以说这些地址来自不同的池(世界?)而不是物理地址。之前说过,内存控制器只理解物理地址,所以要使用逻辑地址,我们需要将它们转换为物理地址。 OS有两种方法可以创建逻辑地址:
- paging - 其中物理内存(RAM)被划分为连续的内存块(称为帧),逻辑内存(另一个世界)也被划分为相同的长度块(称为页面)。现在 OS 保留在名为页面 table 的 RAM 数据结构中。它是一个关联数组(映射),其存在的主要目标是将逻辑层地址转换为物理层地址。分页有以下作用:进程在 RAM 中分配的内存(因此在属于程序的物理内存中的帧中)可能不是连续的(因此内部可能存在漏洞)。
分段 - 程序被分成称为段的部分。段大小不固定,因此不同的段可能有不同的大小。程序分为几个段,每个段在 RAM(物理)内存中都有自己的位置。因此,一个段(称为 sementA)和另一个段(称为 segmentB)可能彼此不靠近。换句话说,segmentA 不必将 segmentB 作为邻居。
内部碎片 - 当属于进程的内存未被 100% 使用时。因此,如果进程想要使用 2 个字节,OS 需要分配 page/pages 总大小需要大于或等于程序请求的内存量。页面的典型大小为 4KB。 OS 分配内存进行处理的单位是页面。所以它不能给小于 4KB。所以如果我们使用2个字节,4KB - 2B = 4094个字节被浪费了(内存与我们的进程关联,所以其他进程不能使用它。只有我们可以使用它,但我们只需要2B)。
外部碎片 - 当分配的内存块彼此靠近,但它们之间有一个小孔时。它是免费的,因此其他程序也可以使用它,但不太可能,因为它非常小。高概率的孔将被浪费。更多漏洞 - 更多内存浪费。
分页可能会导致内部碎片的影响。分段可能会导致外部碎片的影响。
虚拟级别 - 虚拟内存中使用的地址。这是逻辑内存级别的扩展。现在程序甚至不需要在 RAM 中分配所有页面即可开始执行。它可以通过以下技术实现:
- 分页分割 - 将段分成页的方法。
- 分段分页 - 较少使用的方法,但也是可能的。
将它们结合起来可以从两个解决方案中获得积极的方面。
我读到的有关虚拟内存优缺点的内容:
PROS:
- 进程有自己的地址 space 这意味着如果我们有两个进程 A 和 B,并且它们都有一个指向地址的指针,例如。 17 processA 指针将显示为与 processB 中的指针不同的帧。这会导致更大的进程隔离。进程相互保护(因此,如果进程不是共享内存,则一个进程无法对另一个进程内存执行操作,因为在其映射中不存在此类映射条目),并且 OS 更受进程保护.
- 拥有比物理一阶内存(RAM,由于交换到二级内存)更多的内存。
- 更好地使用内存,原因如下:
- 将程序中未使用的部分交换到辅助内存。
- 使共享页面成为可能,也使 "copy on write".
成为可能
- 改进的多程序能力(当不需要的部分程序被换出到辅助内存时,它们在 ram 中释放 space 可用于新进程。)
- 提高了 CPU 利用率(如果你可以将更多进程加载到内存中,那么你有比现在需要做 CPU 东西而不是 IO 东西的程序更大的可能性。在这种情况下你可以更好地利用 CPU)。
缺点:
- 虚拟内存有它的开销,因为我们需要两次访问内存(但这里可以使用 TLB 缓冲区实现很多改进)
- 它使 OS 管理内存的部分变得更加复杂。
所以我们来到了我不太理解的部分:
为什么在一些资料中逻辑地址和虚拟地址被描述为同义词?我是不是弄错了什么?
虚拟内存真的对进程起到保护作用吗?我的意思是,例如在分段中还检查进程是否不访问其他内存(如果访问会导致段错误),分页在页面 table 中也有一个保护位,所以保护不是来自简单地扩展逻辑级地址的抽象?如果 VM(虚拟内存)带来扩展保护功能,它们是什么以及它们如何工作?换句话说:是否为每个进程创建单独的地址space,带来扩展内存保护。如果是这样,没有VM就不能实现分页了?
分页分段与分段分页的真正区别。我知道这两者之间的区别在于地址的构造方式(页码、段号等),但我认为开发两种策略还不够。这个理由就像没有。我读到分段分页的弹性较低,这就是它很少被使用的原因。但为什么它的弹性较差?原因是,在程序中你只能有几个片段而不是很多页面。如果是这样的话,分页确实允许更好的 "granularity".
如果 VM 为每个进程创建单独的地址 space,这是否意味着,没有 VM 的分页使用来自 "one pool" 的逻辑地址(那么每个逻辑地址是否全局唯一案件?)。
如能提供有关该主题的任何帮助,我们将不胜感激。
编辑:#1
行。终于明白了,不按需分页也是一种虚拟内存。我只是发现一些说明有助于理解该主题。下面是 link 我制作的图像,用于可视化差异。感谢您的帮助。
differences between paging, demand paging and swapping
Why in some sources logical address and virtual addresses are described as synonymes? Do I get something wrong?
许多来源将逻辑和虚拟内存转换混为一谈。在过去,没有虚拟地址转换就不会发生逻辑地址转换,因此处理器文档将它们称为相同的。
现在我们有大内存系统,使用逻辑内存转换而不使用虚拟内存。
Is really virtual memory making protection to processes?
它是实现页面保护的逻辑内存翻译。
How really differ paged segmentation from segmented paging.
你真的可以忽略段。 1970 年后设计的合理设计的处理器架构都没有使用段,它们最终会消失。
If VM make separate address space for each process, does it mean, paging without VM use logic addresses from "one pool"
逻辑内存为每个进程创建单独的地址space。分页是虚拟内存。缺一不可。
这是我的第一个 post。我想问一下虚拟内存和分页、分段有什么关系。我在互联网上搜索了几天,但仍然无法将这些信息整理成正确的顺序。这是我目前所知道的:
我们可以讨论内存中的地址(我们可以说它们是内存抽象级别):
物理层(CPU与内存控制器通信,"hey give me contents of address 0xFFEABCD",这些地址是RAM中单元的地址,所以单元0xABCD的物理地址是0xABCD。内存控制器只能使用物理地址,所以如果不是物理地址就必须改成物理地址。
逻辑层。这是对物理地址的抽象。如果请求内存(假设分配成功),这里的进程将获得与 RAM 中的单元没有直接关系的地址。我们可以说这些地址来自不同的池(世界?)而不是物理地址。之前说过,内存控制器只理解物理地址,所以要使用逻辑地址,我们需要将它们转换为物理地址。 OS有两种方法可以创建逻辑地址:
- paging - 其中物理内存(RAM)被划分为连续的内存块(称为帧),逻辑内存(另一个世界)也被划分为相同的长度块(称为页面)。现在 OS 保留在名为页面 table 的 RAM 数据结构中。它是一个关联数组(映射),其存在的主要目标是将逻辑层地址转换为物理层地址。分页有以下作用:进程在 RAM 中分配的内存(因此在属于程序的物理内存中的帧中)可能不是连续的(因此内部可能存在漏洞)。
分段 - 程序被分成称为段的部分。段大小不固定,因此不同的段可能有不同的大小。程序分为几个段,每个段在 RAM(物理)内存中都有自己的位置。因此,一个段(称为 sementA)和另一个段(称为 segmentB)可能彼此不靠近。换句话说,segmentA 不必将 segmentB 作为邻居。
内部碎片 - 当属于进程的内存未被 100% 使用时。因此,如果进程想要使用 2 个字节,OS 需要分配 page/pages 总大小需要大于或等于程序请求的内存量。页面的典型大小为 4KB。 OS 分配内存进行处理的单位是页面。所以它不能给小于 4KB。所以如果我们使用2个字节,4KB - 2B = 4094个字节被浪费了(内存与我们的进程关联,所以其他进程不能使用它。只有我们可以使用它,但我们只需要2B)。
外部碎片 - 当分配的内存块彼此靠近,但它们之间有一个小孔时。它是免费的,因此其他程序也可以使用它,但不太可能,因为它非常小。高概率的孔将被浪费。更多漏洞 - 更多内存浪费。
分页可能会导致内部碎片的影响。分段可能会导致外部碎片的影响。
虚拟级别 - 虚拟内存中使用的地址。这是逻辑内存级别的扩展。现在程序甚至不需要在 RAM 中分配所有页面即可开始执行。它可以通过以下技术实现:
- 分页分割 - 将段分成页的方法。
- 分段分页 - 较少使用的方法,但也是可能的。
将它们结合起来可以从两个解决方案中获得积极的方面。
我读到的有关虚拟内存优缺点的内容:
PROS:- 进程有自己的地址 space 这意味着如果我们有两个进程 A 和 B,并且它们都有一个指向地址的指针,例如。 17 processA 指针将显示为与 processB 中的指针不同的帧。这会导致更大的进程隔离。进程相互保护(因此,如果进程不是共享内存,则一个进程无法对另一个进程内存执行操作,因为在其映射中不存在此类映射条目),并且 OS 更受进程保护.
- 拥有比物理一阶内存(RAM,由于交换到二级内存)更多的内存。
- 更好地使用内存,原因如下:
- 将程序中未使用的部分交换到辅助内存。
- 使共享页面成为可能,也使 "copy on write". 成为可能
- 改进的多程序能力(当不需要的部分程序被换出到辅助内存时,它们在 ram 中释放 space 可用于新进程。)
- 提高了 CPU 利用率(如果你可以将更多进程加载到内存中,那么你有比现在需要做 CPU 东西而不是 IO 东西的程序更大的可能性。在这种情况下你可以更好地利用 CPU)。
缺点:
- 虚拟内存有它的开销,因为我们需要两次访问内存(但这里可以使用 TLB 缓冲区实现很多改进)
- 它使 OS 管理内存的部分变得更加复杂。
所以我们来到了我不太理解的部分:
为什么在一些资料中逻辑地址和虚拟地址被描述为同义词?我是不是弄错了什么?
虚拟内存真的对进程起到保护作用吗?我的意思是,例如在分段中还检查进程是否不访问其他内存(如果访问会导致段错误),分页在页面 table 中也有一个保护位,所以保护不是来自简单地扩展逻辑级地址的抽象?如果 VM(虚拟内存)带来扩展保护功能,它们是什么以及它们如何工作?换句话说:是否为每个进程创建单独的地址space,带来扩展内存保护。如果是这样,没有VM就不能实现分页了?
分页分段与分段分页的真正区别。我知道这两者之间的区别在于地址的构造方式(页码、段号等),但我认为开发两种策略还不够。这个理由就像没有。我读到分段分页的弹性较低,这就是它很少被使用的原因。但为什么它的弹性较差?原因是,在程序中你只能有几个片段而不是很多页面。如果是这样的话,分页确实允许更好的 "granularity".
如果 VM 为每个进程创建单独的地址 space,这是否意味着,没有 VM 的分页使用来自 "one pool" 的逻辑地址(那么每个逻辑地址是否全局唯一案件?)。
如能提供有关该主题的任何帮助,我们将不胜感激。
编辑:#1
行。终于明白了,不按需分页也是一种虚拟内存。我只是发现一些说明有助于理解该主题。下面是 link 我制作的图像,用于可视化差异。感谢您的帮助。
differences between paging, demand paging and swapping
Why in some sources logical address and virtual addresses are described as synonymes? Do I get something wrong?
许多来源将逻辑和虚拟内存转换混为一谈。在过去,没有虚拟地址转换就不会发生逻辑地址转换,因此处理器文档将它们称为相同的。
现在我们有大内存系统,使用逻辑内存转换而不使用虚拟内存。
Is really virtual memory making protection to processes?
它是实现页面保护的逻辑内存翻译。
How really differ paged segmentation from segmented paging.
你真的可以忽略段。 1970 年后设计的合理设计的处理器架构都没有使用段,它们最终会消失。
If VM make separate address space for each process, does it mean, paging without VM use logic addresses from "one pool"
逻辑内存为每个进程创建单独的地址space。分页是虚拟内存。缺一不可。