什么是虚拟存储器-虚拟存储器定义

咱们聊聊虚拟存器,别整那些教科书堆砌的术语。 这就好比咱们平时租房。房子(物理内存)是房东直接租给你用的,那玩意儿你要想搬走就搬走,想扩容扩容,这行不通。你只能跟房东谈个协议,把能住人的地方(逻辑存区)借给他,只要你不把钥匙扔那会儿,他就能把你那堆数据和程序“借”着用。
这中间隔着个虚拟的仓库,你根本看不见,也别想去翻,反正你只认那把借出的钥匙。 底层逻辑实际上挺好办,就是给那堆数据加了一层包装。当你打开一个程序,操作系统先把那个程序的“影子”(逻辑地址)映射到物理内存块上。
这时候,你在程序里写"read(0)"要么"sleep 3000",操作系统的翻译器就会自动换算成“去物理内存第 456 块位置取数据,然后空等 3 秒”。
你看,你压根不知道底下形成了啥,只认定机器在按部就班干活。
这就好比你在写小说,不用管打印机排气管道堵没堵,只要文笔通顺就行。 说到“不完美”,这肯定是没办法的事。出于内存得是连续的,而逻辑地址是编号的,这俩天生就打架。
你想着要一个大块连续的内存,那系统得把这块地方切分成 N 段,每段都要有一层“虚拟内存页”。每切一段,系统得腾出一段物理内存出来做“基址”,还要算好偏移量,最终把这一连串虚拟页拼起来,才能给你一块整个的物理内存。
这过程不是铁板钉钉,这里卡一卡,那边又跑偏一下。
你想想,要是系统累了,要么那个页面刚刚还没被换出去,那数据是不是就“挂”在半空了?这时候就需求“软换”这个概念。 软换就尴尬了。
你想去把那个物理内存块换到别的地方,比如换到硬盘里去,让系统去读要么写。你得先申请那块空间,把里面的数据移动那会儿。但难题来了,数据移动忒慢了,那会害得页面被“卡住”,掉出你的管理范围,那个页面瞬间就“失踪”了。
这时候系统就得靠“缺页中断”来救场。
你看,当程序试图访问一个它还没有“搬那会儿”的页面时,系统会突然大喊一声:“嘿!
这个地址找不着了,快想想办法!”然后立马把那个虚拟页面“软换”到一块空闲的物理内存上,并且在出错之前把数据复制那会儿。
这样,你别看没拿到那个页面,但数据是保住了,程序也就接着往下跑。
这中间别看有个“掉包”的过程,但数据一辈子都在,只是有个短暂的“断更”罢了。 不过话说回来,效率也是个大难题。
要是每次都要去物理内存里拿数据,那速度简直慢得像蜗牛。
故此,现代系统里有个“一级缓存”这个家伙。它就像你的随身小背包,专门用来放刚读取出来的数据。当你需求数据时,不用去物理内存里翻箱倒柜,直接从背包里掏出来就行。
这就好比你去图书馆借书,不用自己去柜台排队,直接把书塞进包里拎走就行。别看背包里东西多了点,但好歹省得自己跑一趟。 再说说数据不连续的另一个影响。假设你有一堆数据,本来想排成一排连续存放,出于某种缘由被切分了。目前你拿着程序去访问数据,发现这一堆数据零零碎碎,不在一块。操作系统得想办法,要么往旁边借一块地,要么就把程序给“隔离”一下,让它只能用这一盘碎锅进食。
要是隔离了,那数据连续性就彻底瞎 broke 了。
这时候,程序可能得重新做“排序”工作,比如把散落在各处的数据、代码块、指令块给摆正了再来运行。
这过程肯定不是平滑的,中间肯定会有卡顿。 还有那个“自由页”的难题。有些页是能够单独放在堆内存里的,比如用户写的临时变量,这种页状态是自由的,哪位想动哪位就能动。但有些页被系统锁死,比如那些系统占用的关键区域,这时候想点一下,系统直接给你个"404 Not Found"要么"Access Denied"。
这时候程序就得停下来,等系统处理完锁,再重启它的请求。
这种随机带来的延迟,有时候比物理内存慢上千倍。 最终还得提提并发。
要是两个程序与此同时想访问同一个逻辑内存地址,会形成啥?系统会拿一个“锁”去管这件事,要么放行一个,要么挂起另一个。
这就像两个人想在同一个会议室与此同时开会,系统得让其中一人先走。
这种竞争关系,有时候会害得整个程序系统的“雪崩”,也就是所谓的“脏读”要么“乱序”。 总而言之,虚拟内存就是个“借”字游戏。它让那堆数据变得离那堆逻辑地址近了大量,但也给系统带来了一系列的“费事”。从映射、换、缺页中断,到一级缓存、锁机制、并发竞争,这些手段都是为了让那借过来的空间用得更好。别看过程里会有掉包、断档、卡顿就连报错,但核心目标只有一个:尽量让程序跑得顺,让数据别丢。
毕竟,要是连内存都拿不稳,那程序还能叫程序吗?它就是个乱飞的数字。
文章版权声明:除非注明,否则均为 静秋号介绍 原创文章,转载或复制请以超链接形式并注明出处。
相关标签: