什么是虚拟内存?

虚拟内存是计算机系统内存管理的一种技术。

它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。


需要注意的是:虚拟内存不只是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的作用也可以通过覆盖或者把处于不活动状态的程序以及它们的数据全部交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们以为自己正在使用一大块的“连续”地址。


一、局部性原理 

要真正理解虚拟内存技术的思想,首先必须了解计算机中著名的局部性原理。著名的 Bill Joy (SUN公司CEO)说过:”在研究所的时候,我经常开玩笑地说高速缓存是计算机科学中唯一重要的思想。事实上,髙速缓存技术确实极大地影响了计算机系统的设计。“快表、 页高速缓存以及虚拟内存技术从广义上讲,都是属于高速缓存技术。这个技术所依赖的原理就是局部性原理。局部性原理既适用于程序结构,也适用于数据结构(更远地讲,Dijkstra 著名的关于“goto语句有害”的论文也是出于对程序局部性原理的深刻认识和理解)。

 

局部性原理表现在以下两个方面: 

1)时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。 

2)空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。 


时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。 


二、虚拟存储器的定义和特征 

基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。 


之所以将其称为虚拟存储器,是因为这种存储器实际上并不存在,只是由于系统提供了部分装入、请求调入和置换功能后(对用户完全透明),给用户的感觉是好像存在一个比实际物理内存大得多的存储器。虚拟存储器的大小由计算机的地址结构决定,并非是内存和外存的简单相加。虚拟存储器有以下三个主要特征: 

1)多次性,是指无需在作业运行时一次性地全部装入内存,而是允许被分成多次调入内存运行。 

2)对换性,是指无需在作业运行时一直常驻内存,而是允许在作业的运行过程中,进行换进和换出。 

3)虚拟性,是指从逻辑上扩充内存的容量,使用户所看到的内存容量,远大于实际的内存容量。 


三、虚拟内存技术的实现 

虚拟内存中,允许将一个作业分多次调入内存。釆用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此,虚拟内存的实需要建立在离散分配的内存管理方式的基础上。虚拟内存的实现有以下三种方式: 

1)请求分页存储管理。 

2)请求分段存储管理。 

3)请求段页式存储管理。 


不管哪种方式,都需要有一定的硬件支持。一般需要的支持有以下几个方面: 

1)一定容量的内存和外存。 

2)页表机制(或段表机制),作为主要的数据结构。 

3)中断机构,当用户程序要访问的部分尚未调入内存,则产生中断。 

4)地址变换机构,逻辑地址到物理地址的变换。


参考资料:

http://windows.microsoft.com/zh-cn/windows/what-is-virtual-memory#1TC=windows-7

https://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98

http://c.biancheng.net/cpp/html/2612.html

<think>嗯,用户问的是虚拟内存是什么,以及为什么需要它。我得先回忆一下虚拟内存的基本概念。虚拟内存应该是操作系统里的一个机制,用来管理物理内存和磁盘空间的结合使用。可能用户之前在学习计算机基础知识或者操作系统相关内容,所以才会问到这个问题。 首先,我需要解释清楚虚拟内存的定义。虚拟内存允许程序认为自己有连续的可用内存空间,而实际上可能被分割成多个物理内存碎片,甚至部分暂时存储在磁盘上。这样的话,每个程序都好像拥有独立的地址空间,不会互相干扰,这应该是一个关键点。 接下来是为什么需要虚拟内存。可能的原因有几个:比如解决物理内存不足的问题,通过将不常用的内存页交换到磁盘上,从而让更多的程序可以运行。另外,虚拟内存还能提供内存保护,防止程序之间的冲突,提高系统的安全性。还有,它简化了程序开发,因为程序员不需要关心物理内存的实际分配情况,每个程序都像是在独立的内存空间中运行。 用户可能没有说出来的需求是,他们可能在学习操作系统时遇到了虚拟内存的概念,不太明白其作用和存在的必要性,或者在实际编程中遇到了内存相关的问题,想深入了解背后的机制。因此,回答时需要结合实际应用场景,让用户明白虚拟内存的重要性,比如在运行多个程序时的内存管理,或者处理大文件时的内存扩展。 还有可能用户对分页和分段机制不太清楚,需要简要说明虚拟内存是如何通过页表、页面置换算法等实现的。但不需要太深入技术细节,保持解释的易懂性。同时,可能需要提到虚拟内存带来的好处和可能的缺点,比如页面交换导致的性能开销,但总体来说利大于弊。 总结一下,回答的结构应该是先定义虚拟内存,再分点说明为什么需要它,结合实际例子和好处,最后可以简要提及实现机制。确保语言通俗易懂,避免过多专业术语,或者如果使用术语的话,要解释清楚。</think>虚拟内存操作系统管理物理内存的**核心机制**,其本质是通过软硬件结合的方式,为每个进程构建**连续且独立**的虚拟地址空间。以下是分层解析: --- ### 一、虚拟内存的本质(What) 1. **物理内存抽象化** - 使用$页表(page\ table)$实现虚拟地址到物理地址的映射 - 示例:32位系统提供$4GB$虚拟地址空间($2^{32} = 4,294,967,296$字节) 2. **内存分页机制** $$ 虚拟地址 = 页号(PFN) \| 页内偏移(offset) $$ 通过MMU(内存管理单元)完成地址转换 3. **交换空间支持** 当物理内存不足时,将不活跃的页换出到磁盘的$swap分区$ --- ### 二、虚拟内存存在的必要性(Why) #### (1)突破物理内存限制 - **案例**:运行10个占用1GB内存的进程,物理内存仅8GB 虚拟内存通过交换机制使总内存需求突破$8GB \times 10 = 80GB$ - **实现公式**: $$ 可用内存 = 物理内存 + 交换空间 $$ #### (2)内存安全隔离 ```cpp // 进程A访问0x4000地址时 虚拟地址 -> 页表A -> 物理地址X // 进程B访问同地址0x4000 虚拟地址 -> 页表B -> 物理地址Y ``` 通过独立的页表实现进程间内存隔离 #### (3)简化编程模型 - 程序员无需考虑物理内存分配 - 所有进程都认为自己独占连续地址空间 #### (4)支持内存映射文件 ```bash # Linux系统调用示例 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); ``` 将文件直接映射到虚拟地址空间,实现高效I/O --- ### 三、关键技术实现(How) 1. **按需分页** 仅在实际访问时加载物理页,减少初始内存占用 2. **页面置换算法** | 算法 | 特点 | 应用场景 | |-------------|-----------------------------|------------------| | FIFO | 简单但存在Belady异常 | 教学示例 | | LRU | 跟踪最近使用记录 | 数据库缓存 | | Clock | 近似LRU的低开销实现 | 通用操作系统 | 3. **写时复制(Copy-On-Write)** 在进程fork时共享父进程内存,仅在写入时创建副本 --- ### 四、性能影响与优化 - **TLB(Translation Lookaside Buffer)** CPU缓存常用页表项,减少地址转换开销 $$ TLB命中时间 < 1ns,未命中惩罚约10-100ns $$ - **缺页异常处理流程** ```mermaid graph LR A[CPU访问虚拟地址] --> B{页表命中?} B -- 是 --> C[直接访问物理内存] B -- 否 --> D[触发缺页中断] D --> E[加载磁盘页到内存] E --> F[更新页表] F --> C ``` --- ### 五、现代发展延伸 1. **大页(Huge Page)** 使用2MB/1GB页减少TLB miss(Oracle数据库常用) 2. **内存压缩技术** Linux zswap在内存紧张时压缩页面而非换出 3. **非易失性内存支持** Intel Optane持久内存打破传统内存层级 **关键结论**:虚拟内存通过空间换时间、磁盘换空间的策略,在保证安全隔离的前提下,极大提升了内存利用率,是现代操作系统不可或缺的基础设施。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值