csapp关于虚拟存储器的问题。

刚看到csapp中关于虚拟存储器,有些地方不是很清楚还希望大家解惑一下,谢谢。

  1. 虚拟存储器是磁盘上N个连续的字节大小单元组成的数组。主存中每个字节都有一个选自虚拟地址空间的虚拟地址和选自物理空间的的物理地址。

那么这样的话主存中缓存的全是虚拟存储器的页,可是虚拟存储器只是磁盘的一部分,如果我想访问磁盘中其他部分怎么办。

2.每个进程有一个独立的虚拟地址空间。
就是说每个进程有独立的虚拟存储器吧,对应磁盘的不同部分。

主要是第一点不明白。理解为主存里面全部是虚拟存储器的缓存,可是虚拟存储器只是磁盘的一部分,如果想要访问磁盘的其他部分,这部分不也得缓存在主存中。

希望大家能指点一下,谢谢。

谢谢大家的解答,但是虚拟地址空间,和虚拟地址我理解。我也认为虚拟地址是虚拟的根据page table映射到主存。我不理解的是虚拟存储器。书上说虚拟存储器是磁盘中字节大小的数组,每个字节都有一个虚拟地址,作为数组的索引。这个字节的虚拟地址是就是前两行的虚拟地址吧,然后我看书上主存中若没有数据是和虚拟存储器进行交换的。但是虚拟存储器只是磁盘的一部分,不是还有其他部分没有交换到。

总之谢谢大家了。

好吧,理解了。虚拟存储器是逻辑上的抽象。谢谢大家。

阅读 2.8k
2 个回答

澄清一下概念。内存(主存)就是CPU旁边插的内存条,容量小速度快;硬盘(机械或固态)容量大速度低,这两者都是真实的设备。而“虚拟内存”只是一个概念(虚拟),是操作系统提供给应用程序的谎言,让它们以为自己都拥有独立的4G地址空间(32位)。背后支持虚拟内存的还是内存条和硬盘。

因为应用程序在一小段时间里大多只使用有限的一点地址空间工作,所以多个程序可以共享内存条的不同部分同时运行。虚拟内存地址(4G)到内存条地址(物理地址)的映射由操作系统自动完成。当程序访问的地址不在内存条中时,会触发一个操作系统缺页异常(page fault),操作系统把程序挂起,去硬盘中调入需要的页面进内存条,同时可能把内存条中一些不常用的页调出写到硬盘上(换页),然后再让程序从触发缺页异常的地方重新执行。所以虚拟内存并不是直接映射到硬盘的,而是通过换页使用硬盘。当然如果内存条太小频繁换页就不可避免,虚拟内存的谎言就编不下去了(系统僵死)。

交换空间只是硬盘上的一小部分(页文件或swap分区),剩下的部分就是普通的文件系统了。当从文件系统读取数据到内存的时候(比如编辑word文档),这部分数据也有可能被交换回硬盘的交换空间中(比如把word最小化后又打开了另一个很占内存的3D游戏)。就是说同样的数据可能以文件和交换页两种形态存在于硬盘上

不知道你学过计算机体系(computer architecture)没?我学过,但忘得差不多了,我大概说下我的理解吧。

计算机存储是分层的,大致分为Cache,内存和硬盘,这里我们就不考虑cache了(csapp中应该讲了cache)。CPU给的地址都是虚拟地址,虚拟地址通过page table来将虚拟地址映射成物理地址,然后用这个地址去访问内存。同时,有些虚拟地址通过另外的table将其映射到硬盘。每个process都有独立的虚拟地址空间,单个process大致和这一样:

250px-Virtual_memory.svg.png

现在来回答下你的问题:

  1. 那么这样的话主存中缓存的全是虚拟存储器的页,可是虚拟存储器只是磁盘的一部分,如果我想访问磁盘中其他部分怎么办。

虚拟地址可以映射到硬盘,不是只可以映射到内存。并且虚拟地址空间(比如64bit = 2^64 Bytes)一般是大于实际的内存的物理地址空间(8GB/16GB)的,所以有很多虚拟地址可以映射到除内存外的硬盘空间。一般而言,内存包含了process需要常使用的数据,对于不常用的一些数据,则是放在硬盘中。如果用虚拟地址映射后的物理地址在内存中找不到所需的数据,就会用另外的table将它映射到硬盘,然后就可以访问硬盘了。

  1. 每个进程有一个独立的虚拟地址空间。 就是说每个进程有独立的虚拟存储器吧,对应磁盘的不同部分。

每个进程有一个独立的page table,进程通过它自己的page table来将虚拟地址映射为物理地址,这个物理地址对应不同的物理空间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进