计算机存储系统是怎么共同工作的
相信一些初步学习计算机或者说复习备考408的同学在看到存储系统这一部分内容时,会产生这样那样的疑问。
1.什么是内存外存
2.内存外存CPU到底是怎么联系在一起的
3.CPU只能读写内存,那么我放在硬盘上的(外存)游戏是怎么在CPU上运行的呢
然后大家如果学过计组计操,就会知道虚拟地址空间,那么什么是虚拟地址空间,虚拟地址空间是谁创建的,它又是用来干什么的呢
在接下来这篇文章里,我们以运行一个游戏为例,带大家搞懂上述内容
在讲解这个过程之前,大家一定要搞明白最基础的内存与外存的区别,内存是CPU可以直接进行读写的存储元件,造价比较高。通常不会太大,8G,16G。现在有64G的了。而外存则是像固态硬盘啊,机械硬盘啊这一类的,大家如果给自己的计算机加装过硬盘,装的就是固态硬盘,闪存类的。
外存通常容量很大,1TB,2TB都很常见。CPU不能直接读写外存,需要将外存的数据调入到内存中去运行,就会用到虚拟地址空间,这就是我们接下来要讲的内容了。
OK,首先开始构建场景,我现在使用的是天选5,2 * 8的16G的运行内存,然后1TB的硬盘。我在硬盘里下载完成了120G的游戏NBA2K26,然后我在Steam里面点击开始游戏,操作系统会创建游戏进程(过程不细讲,可能会在下个视频详细讲进程的创建),此时OS会开辟一块完整独立的虚拟地址空间,然后硬盘中游戏的代码段,数据段,贴图资源区等区域都会映射到这片虚拟地址空间,最后操作系统为这个进程,创建进程专属的独立页表。简单说一下页表,页表存着虚页号对应的物理页号也就是虚拟地址的虚页号找到数据在主存中的位置(也就是物理页号)。OK,我们总结一下目前的状态:只是创建了虚拟地址,创建了页表。120G的游戏还是在硬盘中,游戏数据并没有开始被调入内存,页表中页表项的有效位是0。
OK,现在我们进入到游戏当中,进入生涯模式,MP出现在自建球馆当中。这个过程中会发生什么呢?CPU已经想要去运行硬盘中的一些程序代码,一些贴图资源。CPU拿到数据所映射虚拟空间地址,会把该地址送到mmu(先不用管是什么)上,然后分离出虚页号与页内地址。OK,现在根据当前进程的CR3寄存器(也不用管它是啥),找到该进程的页表。通过虚页号去查找页表,因为此时硬盘中的数据还没有被调入内存中,所以页表中并没有该虚页号的所对应的物理页号,页表项为0,此时,发生缺页中断!CPU自陷为内核态,交给操作系统去处理中断。
操作系统根据虚页号去硬盘找到数据对应的位置,然后对硬盘发起IO,把这一段数据调入到物理内存中一个空闲页框中去,然后更新页表,填入虚页号对应的物理页号。中断处理结束,CPU重新执行刚才那条指令,此时CPU可以根据页表中虚页号对应的物理页号去主存找到数据然后运行。
其实到这整个过程就差不多了,但我想肯定会有同学会问:如果内存满了,但是CPU依然想要访问新的硬盘中的资源程序,那么应该怎么办?
这里我简单的给大家讲一下,内存满了之后,再次发生缺页中断,但此时没有空闲页框,那么就会使用LRU替换算法,把最长时间没有访问的页面给替换出来,然后更新页表。
OK,到这里就结束了,博主我写这篇文章可谓是呕心沥血,只是为了大家可以更好的理解,然后卑微的求一个点赞加关注。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)