刚看到csapp中关于虚拟存储器,有些地方不是很清楚还希望大家解惑一下,谢谢。
虚拟存储器是磁盘上N个连续的字节大小单元组成的数组。主存中每个字节都有一个选自虚拟地址空间的虚拟地址和选自物理空间的的物理地址。
那么这样的话主存中缓存的全是虚拟存储器的页,可是虚拟存储器只是磁盘的一部分,如果我想访问磁盘中其他部分怎么办。
2.每个进程有一个独立的虚拟地址空间。
就是说每个进程有独立的虚拟存储器吧,对应磁盘的不同部分。
主要是第一点不明白。理解为主存里面全部是虚拟存储器的缓存,可是虚拟存储器只是磁盘的一部分,如果想要访问磁盘的其他部分,这部分不也得缓存在主存中。
希望大家能指点一下,谢谢。
谢谢大家的解答,但是虚拟地址空间,和虚拟地址我理解。我也认为虚拟地址是虚拟的根据page table映射到主存。我不理解的是虚拟存储器。书上说虚拟存储器是磁盘中字节大小的数组,每个字节都有一个虚拟地址,作为数组的索引。这个字节的虚拟地址是就是前两行的虚拟地址吧,然后我看书上主存中若没有数据是和虚拟存储器进行交换的。但是虚拟存储器只是磁盘的一部分,不是还有其他部分没有交换到。
总之谢谢大家了。
好吧,理解了。虚拟存储器是逻辑上的抽象。谢谢大家。
澄清一下概念。内存(主存)就是CPU旁边插的内存条,容量小速度快;硬盘(机械或固态)容量大速度低,这两者都是真实的设备。而“虚拟内存”只是一个概念(虚拟),是操作系统提供给应用程序的谎言,让它们以为自己都拥有独立的4G地址空间(32位)。背后支持虚拟内存的还是内存条和硬盘。
因为应用程序在一小段时间里大多只使用有限的一点地址空间工作,所以多个程序可以共享内存条的不同部分同时运行。虚拟内存地址(4G)到内存条地址(物理地址)的映射由操作系统自动完成。当程序访问的地址不在内存条中时,会触发一个操作系统缺页异常(page fault),操作系统把程序挂起,去硬盘中调入需要的页面进内存条,同时可能把内存条中一些不常用的页调出写到硬盘上(换页),然后再让程序从触发缺页异常的地方重新执行。所以虚拟内存并不是直接映射到硬盘的,而是通过换页使用硬盘。当然如果内存条太小频繁换页就不可避免,虚拟内存的谎言就编不下去了(系统僵死)。
交换空间只是硬盘上的一小部分(页文件或swap分区),剩下的部分就是普通的文件系统了。当从文件系统读取数据到内存的时候(比如编辑word文档),这部分数据也有可能被交换回硬盘的交换空间中(比如把word最小化后又打开了另一个很占内存的3D游戏)。就是说同样的数据可能以文件和交换页两种形态存在于硬盘上。