虚拟内存讲得较好的一篇博客:(53条消息) 操作系统(八)——虚拟内存、内存分段和内存分页_却道天凉_好个秋的博客-CSDN博客_虚拟内存分页
1.什么是虚拟内存,有什么用?
是计算机系统内存管理的⼀种技术。它使得应⽤程序认为它拥有连续的可⽤的内存(⼀个连续完整的地址空间),⽽实际上,它通常是被分隔成多个物理内存碎⽚,还有部分暂时存储在外部磁盘存储器上,在需要时进⾏数据交换。
作用:
1)每个进程都认为自己获得的是一块连续的地址;
2)通过在页表上面添加访问权限控制符,实现内存权限控制;
3)更容易实现内存和数据的共享;
4)SWAP可以帮助进程扩充“内存”。
2.虚拟内存实现过程
操作系统吧内存抽象为虚拟地址空间,然后这个空间被分为多块,每一块称为页,这些页被系统映射到物理内存(页框),为了让页和页框进行映射,利用页表来完成,参数是虚拟⻚号,结果是物理⻚⻚框号。
3.物理地址和虚拟地址区别
物理地址是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取,是内存单元的真正地址。
虚拟地址是指计算机⽤户看到的地址,但不一定是元素存储的真实地址。操作系统将逻辑地址与物理地址进行映射,使得逻辑地址看起来连续,更符合直观思维。
4.什么是请页?
处理器访问虚拟内存页面 → 页表查询页表查询该页是否映射到页框中 → 在,MMU将页码转为页框码;不在,MMC通知操作系统发生访问错误 → 启动请页机制 → 判断虚拟地址是否有效,有效,将虚拟内存中将该地址读入内存的一个空闲页框,并修改对应的页表,然后处理器从发生错误的地方重新运行,无效,终止此次访问。
5.什么是交换?
请页成功,又没有空闲的页框,则调用相应的内核操作函数,选择一个较少使用或近期使用概率较小页面对应的页框,移出该页,装载新页。若移出页未修改过,直接删除;若修改过,则保存回磁盘。
6.页面置换算法有哪些?
1)最佳⻚⾯置换算法(OPT)
置换在「未来」最⻓时间不访问的⻚⾯,但是实际系统中⽆法实现,因为程序访问⻚⾯时是动态的 我们是⽆法预知每个⻚⾯在「下⼀次」访问前的等待时间,因此作为实际算法效率衡标准。
2)先进先出置换算法(FIFO)
将⻚⾯以队列形式保存,先进⼊队列的⻚⾯先被置换进⼊磁盘。
3)最近最久未使⽤的置换算法(LRU)
根据⻚⾯未被访问时⻓⽤升序列表将⻚⾯排列,每次将最久未被使⽤⻚⾯置换出去。
4)时钟⻚⾯置换算法
把所有的⻚⾯都保存在⼀个类似钟⾯的「环形链表」中,⻚⾯包含⼀个访问位。 当发⽣缺⻚中断时,顺时针遍历⻚⾯,如果访问位为1,将其改为0,继续遍历,直到访问到访问位为0⻚⾯,进⾏置换。
5)最不常⽤算法
记录每个⻚⾯访问次数,当发⽣缺⻚中断时候,将访问次数最少的⻚⾯置换出去,此⽅法需要对每个⻚⾯访问次数 统计,额外开销。
7.什么是快表(TLB)?
灵感来源:大多数程序总是对少部分页面进行多次访问。
快表是一个包含少量表项的硬件寄存器,当系统访问虚拟内存时,先去快表中查找,这样不必访问页表(减小内存访问),从而加快了地址映射速度。当虚拟页号不在TLB中,再访问页表,然后将新的表项替换TLB中的一个淘汰项。
8.什么是多级页表?
当页表过大,为了不让整个页表都存在内存当中,将页表也进行分页存储,需要哪一页再将那一页放入内存当中。
9.什么是分段?
分段是将内存分为多个独立的段,且每个段不一定等长,且段长度可以动态变化。分段有两个有点:有助于不同进程共享过程和数据,例如共享库;每个段都可以独立增大或减小而不影响其他的段。分段有可能会带来内存碎片问题。
分段与分页有本质不同,分段的地址空间是二维的,分页是一维的,分页目的在于完成虚拟内存功能,分段是为了使程序和数据可以被划分为逻辑上独⽴的 地址空间并且有助于共享和保护。⻚的⼤⼩不可变,段的⼤⼩可以动态改变。
10.用户态和内核态
⽤户态和内核态是操作系统的两种运⾏状态。
内核态 :处于内核态的 CPU 可以访问任意的数据,包括外围设备,⽐如⽹卡、硬盘等,处于内核态的 CPU 可以从⼀个程序切换到另外⼀个程序,并且占⽤ CPU 不会发⽣抢占情况。
⽤户态 :处于⽤户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,⽤户态下的 CPU 不允许独 占,也就是说 CPU 能够被其他程序获取。
简而言之就是两者权限不一样,计算机中有⼀些⽐较危险的操作,⽐如设置时钟、内存清理,这些都需要在内核态下完成,如果随意进⾏这些操作,系统可能会崩坏。
11.什么是抖动,如何避免?
对于一个进程,如果没有能够支持其活动的足够页面帧数,那么就会频繁发生缺页错误,然后需要请页,但是所有的此时所有的页面都在使用,就只能置换出正在使用的页面,就会引起反复请页的操作,这种情况被称为抖动。
由于过多的给进程分配页面会导致系统的并发性变弱,因此通过给进程分配合理的页面能解决抖动问题。可以控制缺页错误频率来解决抖动问题,通过设置缺页错误频率上下限,如果实际缺页错误率超过上限,则可为进程再分配一帧;如果实际缺页错误率低于下限,则可从进程中删除一帧。如果缺页错误率增加并且没有空闲帧可用,那么必须选择某个进程并将其交换到后备存储。然后,再将释放的帧分配给具有高缺页错误率的进程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)