当前位置:首页 > 编程笔记 > 正文
已解决

一天一八股——虚拟内存

来自网友在路上 176876提问 提问时间:2023-10-09 01:05:09阅读次数: 76

最佳答案 问答题库768位专家为你答疑解惑

虚拟内存的必要性

计算机系统中的程序在运行的过程中要进行数据的访问就需要知道数据存放的地址,对于每个进程,操作系统都会通过虚拟地址来映射到实际的物理地址

虚拟内存地址通过OS中维持的映射关系来转换未物理地址的访问,对于每个进程来说,都会有属于自己的一块虚拟内存空间,这个可以对进程使用的地址进行隔离,而将一些转换映射的工作交给操作系统进行完成。

虚拟地址和物理地址的映射

内存分段

        将程序分为若干的逻辑分段,一个程序可分为(代码段,数据段,栈段,堆段)组成,不同的分段有不同的属性,使用分段的形式分离不同的部分。

        分段使用段表来进行段的物理地址和虚拟地址的映射

    虚拟地址=段选择因子(短号+特权等标志位)+段内偏移量((0,段界限])

        通过段号可以找到段表中虚拟地址对应的段内描述符

   段内描述符=段基地址+段界限+特权级DPL 

 段基地址+段内偏移量=要访问的内存地址

内存分段的缺点:

  1. 内存碎片(外部内存碎片+内部内存碎片)
  2. 内存交换的效率低(内存交换是内存碎片的解决方法之一,但交换的段占用空间很大,交换效率很低) 

内存分页

        内存分页将内存空间的划分刻度变得更细,将虚拟内存空间和物理内存空间切成一段段固定大小的页,linux下,内存大小为每页4kb

        页表存储在内存中,内存管理单元将虚拟内存的地址转换成物理地址,如果进程访问的数据在页表中访问不到时,会产生缺页异常,进行系统内核空间分配内存,更新进程页表

        因为采用了分页的内存都是通过页为单位去进行管理的,也就不会产生无法给进程使用的小内存,同时通过页设置置换算法,内存的交换效率也会较高

虚拟地址=页号+页内偏移量

 通过页号可以找到页表中与之对应的页表项

 页表项=虚拟页号+物理页号

   物理地址=物理页号+偏移量

内存分页的缺陷:

  1.  空间上的缺陷(需要很多空间来建立和维护页表) 

解决方案:多级页表--》可以提升空间的使用率

段页式内存管理

先将程序分段,然后将每个段分成多个页

地址结构=段号+段内页号+页内位移 

通过段号引导到段表中,段表项中可以得到页表的地址,通过页表地址+页号可以得到物理页号,最后通过页内位移可以得到物理地址

 

 

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"一天一八股——虚拟内存":http://eshow365.cn/6-17530-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!