虚拟存储

简介: 虚拟存储

虚拟存储是一种计算机系统技术,它为每个进程提供一个独立且连续的逻辑地址空间,这个空间远大于实际物理内存的容量。虚拟存储的核心思想是将物理内存与进程视角的内存(即虚拟内存)分离,通过硬件(如内存管理单元,MMU)和操作系统协作,使得进程可以访问一个似乎无限大的内存空间,而实际上只有其活动部分(经常访问的部分)驻留在物理内存中,其余部分则存储在外部存储设备(如硬盘)上。以下是虚拟存储的主要原理、工作方式、优点及应用领域:

主要原理:

  1. 逻辑地址与物理地址的映射:
  • 每个进程有自己的逻辑地址空间,进程通过虚拟地址访问内存。操作系统通过页表(或段页表)将虚拟地址转换为物理地址。虚拟地址到物理地址的映射通常是多对一或一对多的关系,允许不同进程共享物理内存,同时保证了各自逻辑空间的隔离。
  1. 页面调度与替换:
  • 当进程试图访问不在物理内存中的虚拟页面时,会发生页故障(Page Fault)。操作系统捕获此异常,选择一个牺牲页面(通常是最近最少使用,LRU算法决定)写回硬盘(换出),然后将所需的页面从硬盘加载到空闲的物理内存位置(换入),更新页表,并重新执行引发页故障的指令。
  1. 内存映射文件:
  • 虚拟存储不仅用于管理进程内存,还支持将磁盘文件直接映射到虚拟地址空间,形成内存映射文件。这样,对文件的访问就如同访问内存一样快速,无需传统的I/O操作,提高了数据访问效率。

工作方式:

  • 地址空间划分:
  • 进程启动时,操作系统为其分配一个连续的虚拟地址空间,并初始化页表。地址空间通常划分为代码段、数据段(静态、堆、栈)和未映射区域。
  • 页表管理:
  • 操作系统维护每个进程的页表,记录虚拟页面与物理页面之间的映射关系。页表可能有多级(如二级、三级页表),以支持大容量虚拟地址空间。
  • 内存分配与回收:
  • 进程动态申请或释放内存时,操作系统调整页表,并在必要时执行页面调度操作。
  • 页故障处理:
  • 遇到页故障时,操作系统暂停进程,执行以下操作:
  • 检查访问是否合法(例如,是否越界、是否有权限);
  • 如果合法,选择一个牺牲页面换出到硬盘(如果尚未换出);
  • 将所需页面从硬盘加载到空闲物理内存;
  • 更新页表,将新加载页面与虚拟地址关联;
  • 重启被暂停的指令,此时所需页面已在物理内存中。
  • 缓存一致性与预取:
  • 现代系统中,硬件和操作系统可能还采用缓存一致性协议和预取机制,确保多核环境下的数据一致性,并提前将可能需要的页面加载到高速缓存或内存中,以优化性能。

优点:

  1. 内存抽象:
  • 隐藏了物理内存细节,为进程提供一致、独立的视图,简化编程模型。
  1. 内存扩充:
  • 通过将部分数据暂时存储在外存,使得应用程序可以使用远超实际物理内存容量的地址空间。
  1. 内存保护:
  • 通过页表中的访问权限位实现对每个页面的读写执行权限控制,防止非法访问和数据破坏。
  1. 内存共享:
  • 同一物理内存可以被映射到多个进程的不同虚拟地址,实现数据或代码的共享。
  1. 内存交换:
  • 在多任务环境下,操作系统可以根据需要将暂时不用的进程换出到外存,以便为其他进程腾出物理内存。

应用领域:

  • 通用操作系统:
  • 几乎所有现代操作系统(如Windows、Linux、macOS等)都采用了虚拟存储技术作为其内存管理的基础。
  • 服务器与云计算:
  • 在服务器环境中,虚拟存储支持大量并发进程和多用户共享资源,是虚拟化技术(如VMware、KVM、Docker等)的关键组成部分。
  • 嵌入式系统:
  • 部分高端嵌入式系统也采用了虚拟存储,以支持复杂的多任务处理和资源隔离。
  • 数据库管理系统:
  • 数据库系统常利用虚拟存储进行大规模数据缓存、事务管理及日志记录等,提高数据访问速度和系统可靠性。
  • 科学计算与大数据处理:
  • 虚拟存储有助于处理远超过物理内存容量的大规模数据集,通过智能调度和缓存策略,实现高效的数据访问和分析。

总之,虚拟存储是现代计算机系统中不可或缺的一部分,它通过逻辑地址与物理地址的映射、页面调度与替换机制,实现了内存抽象、扩充、保护、共享等功能,极大地提升了系统性能、可靠性和资源利用率,广泛应用于各类操作系统、服务器、虚拟化技术、数据库系统以及科学计算等领域。

相关文章
|
NoSQL 算法 Java
【工具类用法】Hutool里的生成唯一Id唯的工具类
【工具类用法】Hutool里的生成唯一Id唯的工具类
1831 0
|
机器学习/深度学习 人工智能 自然语言处理
清华大学NLP开源项目,6大神器推荐
清华大学NLP开源项目,6大神器推荐
1323 0
|
关系型数据库 MySQL 数据安全/隐私保护
远程连接mysql8,报错10061 解决办法
远程连接mysql8,报错10061 解决办法
1332 0
|
6月前
|
人工智能 移动开发 安全
零基础用 OpenClaw AI 制作 HTML5 企业官网
OpenClaw(小龙虾)是一款本地离线AI工具,支持零代码生成HTML5企业静态网站。通过自然语言描述需求(如行业、风格、页面模块),30分钟内即可完成部署、生成、调试与上线,全程不联网、数据不出本地,安全可控,适合中小企业快速建站。(239字)
924 125
|
8月前
|
数据采集 安全 调度
Python异步编程入门:asyncio实战指南
Python异步编程入门:asyncio实战指南
407 133
|
12月前
|
数据采集 机器学习/深度学习 人工智能
31_NLP数据增强:EDA与NLPAug工具
在自然语言处理(NLP)领域,高质量的标注数据是构建高性能模型的基础。然而,获取大量准确标注的数据往往面临成本高昂、耗时漫长、覆盖度不足等挑战。2025年,随着大模型技术的快速发展,数据质量和多样性对模型性能的影响愈发显著。数据增强作为一种有效扩充训练样本的技术手段,正成为解决数据稀缺问题的关键策略。
732 0
|
数据采集 机器学习/深度学习 数据挖掘
清洗数据的魔法:让你的数据干净又整洁
清洗数据的魔法:让你的数据干净又整洁
1243 2
|
消息中间件 监控 关系型数据库
综合医院LIS系统全套源码,开箱即用,支持二次开发
该实验室管理信息系统采用C# .Net开发,支持多种主流数据库,利用MQ和Remoting实现分布式3层架构。系统强调标本全周期管理,包括采集、检测、报告和归档,集成多种医院系统,提供生化等多个专业报告,智能审核规则,支持危急值管理、微生物培养跟踪,并具备全面的质控和试剂管理功能。系统维护、条码、样本、常规与微生物检验、质控、查询统计、试剂耗材管理以及临床提醒和报告打印等功能一应俱全。
659 6
综合医院LIS系统全套源码,开箱即用,支持二次开发
|
搜索推荐 算法 Java
堆排序实战:轻松实现高效排序,附详细Java代码
嗨,大家好!我是小米,一名热爱技术分享的程序员。今天要带大家了解堆排序——一种基于二叉堆的数据结构,具有O(n log n)时间复杂度的选择排序算法。堆排序分为构建大顶堆和排序两个阶段:先建堆使根节点为最大值,再通过交换根节点与末尾节点并调整堆来逐步排序。它稳定高效,空间复杂度仅O(1),适合对稳定性要求高的场合。虽然不如快速排序快,但在避免递归和节省空间方面有优势。一起动手实现吧!如果有任何疑问,欢迎留言交流!
660 2
|
JSON API 数据库
Django的web框架Django Rest_Framework精讲(一)
Django的web框架Django Rest_Framework精讲(一)
986 1

热门文章

最新文章