Virtual Memory

Virtual Memory

在计算机科学技术中,virtual memory,或 memory storage 是一种内存管理技术,它提供 “所给机器上真实可用的存储资源的一种理想化抽象”,给用户创建了一种有很大内存的假象。

计算机操作系统,结合软件和硬件,映射程序使用的内存地址 (称为 virtual memory) 到计算机内存中的 physical addresses上。Main storage,如进程和任务所见,表现为一个连续的内存空间或连续 segment 的集合。操作系统管理 virtaul address space 并将真实内存赋值给虚拟内存。CPU 中的地址翻译硬件,通常指的的 memory management unit (MMU),自动将虚拟内存翻译为物理内存。操作系统中的软件可能拓展这些功能,利用,例如 disk storage 提供虚拟内存空间来超出真实内存的容量,因此引用较计算机物理提供的更多的内存。

虚拟内存的主要好处包括将应用从管理共享内存空间中解放出来,在进程中共享库使用的内存的能力,隔离内存增加安全性,理论上能使用比物理提供的更多的内存,使用 paging 或 segmentation 的技术。
在这里插入图片描述

Properties

虚拟内存使编写应用程序更简单。它隐藏物理内存的 fragmentation ;将管理内存分层结构的重担交给了内核 (显式地消除了程序处理 overlay 的需求);且,当每个进程在它自己专注的地址空间中运行时,避免了重新定位程序代码或使用相对地址访问地址的需求。

Memory virtualization 可以被认为是虚拟内存的概念的泛化。

Usage

虚拟内存是现代计算机架构的必要部分;实现通常需要硬件支持,典型的形式是内置 CPU 的 memory management unit。虽然没有必要,emulators 和 virtual machines 可以使用硬件支持来增加它们的虚拟内存实现的性能。

Paged virtual memory

几乎所有虚拟内存的当前实现都将虚拟内存分割为页,连续的虚拟内存地址块。当代系统上的页通常至少有 4 千字节;使用更大的虚拟地址范围或更大的真实内存的系统通常使用更大的页大小。

page tables

Page tables 用于将应用所见的虚拟地址翻译为硬件用于处理指令的物理地址;处理这一特殊翻译的硬件通常被称为 memory management unit。页表的每个条目都持有一个 flag 表示对应的页是否在真实的内存中。如果它在真实内存中,页表条目将包含一个真实内存地址,页存储于该地址上。当硬件创建了一个对页的引用,如果该页的页表入口表示该页当前不在真实内存中,硬件抛出一个 page fault excpetion,调用操作系统的分页管理器组件。

整个系统只能有一张页表,或每个应用和 segment 都有单独的页表,或大 segments 的页表树,或这些方式的结合。如果仅有一张页表,同时运行的不同应用虚拟地址范围的不同部分。如果有多个页表或 segment 表,则有多个虚拟地址空间和并行应用,它们使用单独的页表重定向到不同的真实地址。

Page supervisor

操作系统的这一部分创建和管理页表和未使用 page frame 的列表。为了保证有足够的可用 page fames 以快速解决 page faults,系统可能周期性的偷窃已分配的 page frames,使用 page replacement algorithm,比如 Least recently used (LRU) 算法。已被修改的被偷窃的 page frames 在被添加到 free 队列前被写回备用存储空间。

通常,不能被解决的 page fault 会导致不正常的应用终止。然而,一些系统允许应用为这样的错误设置异常处理函数。page supervisor 可能以几种方式处理 page fault 异常,取决于细节:

  • 如果虚拟地址非法,paging supervisor 将其视为错误。
  • 如果 page 合法,page information 没有加载到 MMU 中,page information 将被存储到一个 page register 中。
  • 如果 page 未初始化,新的 page frame 将被指定和清理。
  • 如果偷窃的 page frames 中包含期望的 page,该 page frame 将被重用。
  • 对于对读保护的 page 尝试写的错误,如果它是一个 copy-on-write 的 page,free page frame 将被指定,旧的 page 中的内容将被复制;否则将其视为一个错误。
  • 如果虚拟地址是 memory-mapped 文件或 paging file 中的一个合法 page,指定一个 free page frame 并读入。

在大部分情况下,page table 会更新,随后可能会清理 Translation Lookaside Buffer(TLB),然后系统重新执行导致异常的指令。
如果 free page frame queue 为空,page supervisor 必须使用相同的 page replacement algorithm 来释放 page frame (page stealing)。

Pinned pages

操作的某些内存区域是固定的 (从不会被交换待次级存储中)。其他被使用的术语是 lockedfixed,或 wired pages。例如,中断机制依赖于 handlers 的指针数组,例如 IO 完成和 page fault。如果包含这些指针或调用代码的 page 是可调页的,中断机制将变得更加复杂和耗时,特别是在 page fault 中断的情况下。因此,页表结构的一些部分是不可调页的。

一些页可能会固定很短的时间,另一些可能很长,还有一些可能需要永久固定。

Thrashing

在 paging 和 page stealing 时,可能发生 “thrashing”,计算机耗费不合适的大量时间来传送 pages 到备用存储中,或从备用存储中传送出 pages,因此减慢了有用的工作。一个任务的工作集是应该在内存中的最小的页集合。Thrashing 在可用内存不足以存储所有活动程序的工作集时发生。增加真实内存是最简单的响应,但是提升应用设计,调度,和内存使用同样有用。另一个解决方式是减少系统上的活动任务数量,这减少了对真实内存的需求。

system thrashing 通常导致小部分运行中的程序对 page 的需求激增。Swap-token 是一种轻量和动态的 thrashing 保护机制。基本理念是在系统中设置一个 token,当 thrashing 发生时,它被随机给予一个发生 page fault 的进程。具有 token 的进程被给予一个特权能收集更多的物理内存页以构建它自己的工作集,它被期望快速完成它的执行然后释放内存页。一个时间戳被用于逐个切换 token。

Segmented virtual memory

一些系统使用 segmentation 而非 paging,将虚拟地址空间分割成变长的 segments。这里的虚拟地址由 segment number 和 segment 中的偏移组成。Segmentation 和 paging 可以一起使用,将每个 segment 分割为 pages;使用这一内存结构的系统,通常由 paging 占据主体,segmentation 提供内存保护。

Paging 和 segmentation 系统的不同不仅仅关于内存分割方式;segmentation 对用户进程可见,作为内存模型语义的一部分。因此,内存看上去不像一个单个大空间,而是有多个空间结构化而成。

这一不同点有一个重要的结论;segment 不是变长的 page,或是拓展地址空间的简单方法。Segmentation 能提供一个单级的内存模型,在这其中进程地址和仅由映射到进程潜在地址空间的 segments 的列表 (files) 组成的文件系统之间没有任何区别。

Address space swapping

一些操作系统还提供整个地址空间交换的功能,除了 paging 和 segmentation 功能之外。当地址空间交换发生时,OS 将当前存在于真实内存中的 pages 和 segments 写入交换文件。
在换入时,OS 从交换文件中回读数据,但是不会自动回读在换出操作时已被 paged out 的pages。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值