关于物理内存跟虚拟内存的映射关系以及MMU的映射原理的疑问

vac_LJ 2017-04-29 09:49:37
看了关于物理内存跟虚拟内存的关系,有几点不明白:
1.如果物理内存比虚拟内存少,那是不是程序有一部分数据映射不到物理内存(例如32位系统指针寻址4G范围,那我装2G的物理内存)
2.我看有些博客说虚拟内存概念的加入是为了解决进程地址空间不隔离的问题,那最后还是映射到物理内存,也是不隔离啊?
3.如果我物理内存100M,两个程序分别为60M,那MMU怎么分配
...全文
277 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vac_LJ 2017-04-29
  • 打赏
  • 举报
回复
理解了,其实就是进程初始化的时候加载到虚拟内存,然后执行虚拟内存的某段的时候去查页表,页表上有两个信息,一个是有效位,无效的话系统会引发缺页异常。另外一个是磁盘地址。如果内存已经满了,没有空地方了,那就找一个页覆盖,当然如果被覆盖的页曾经被修改过,需要将此页写回磁盘。
vac_LJ 2017-04-29
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 6 楼 weixin_35836035 的回复:] [quote=引用 3 楼 sp1234 的回复:] 假设这100K物理内存被分为10个“段”来管理 --> 假设这100G虚拟内存被分为许多个10K的“段”来管理
那每个段的物理内存是多少是怎么分的?[/quote] 每一种操作系统具体怎么实现,其实都是不一样的。关键是你是否有自己的理解力。 每一个段都可以有描述,例如用4个字节描述一下自己这个段在虚拟内存中的序号,也可以。就好象你涉及任何一个数据对象都有字段一样,不是说对象都是最低级的一堆二进制 byte。 什么叫做“每个段的物理内存是怎么分的”呢?这是一个本末倒置的问题。物理内存中的段(这里是通用的操作系统说法,并不是具体到某一个操作系统版本的实现)是浮动的,所以你纠结磁盘上的数据要“写死了”物理内存编号,这还是脑袋没有开窍,硬要往写死物理内存地址的思路上来理解。把脑袋倒过来,就正常理解了。[/quote] 那我这样理解你看对不对,假设有两个程序先后运行,经过的步骤就是如果两个程序的都分了十段,只是要把要运行的那个段放到物理内存,那现在物理内存上就有两个编号,分别代表第一个和第二个程序的内存占用。如果第一个编号占用的内存已经是物理内存的百分五十,另一编号占用的内存需要占用物理内存的百分值六十,那就是第二个程序就加载不进来?
  • 打赏
  • 举报
回复
比如说你有3个酒杯,有100瓶红酒,请问你会要求红酒瓶子的出产厂家必须写死用哪一个酒杯吗? 你顶多就是要让使用红酒杯的人告诉你每一杯酒出自哪一个瓶子就行了!这才是正常思维方式。 而反过来本末倒置,则是不正常的思维方式。
  • 打赏
  • 举报
回复
引用 6 楼 weixin_35836035 的回复:
[quote=引用 3 楼 sp1234 的回复:] 假设这100K物理内存被分为10个“段”来管理 --> 假设这100G虚拟内存被分为许多个10K的“段”来管理
那每个段的物理内存是多少是怎么分的?[/quote] 每一种操作系统具体怎么实现,其实都是不一样的。关键是你是否有自己的理解力。 每一个段都可以有描述,例如用4个字节描述一下自己这个段在虚拟内存中的序号,也可以。就好象你涉及任何一个数据对象都有字段一样,不是说对象都是最低级的一堆二进制 byte。 什么叫做“每个段的物理内存是怎么分的”呢?这是一个本末倒置的问题。物理内存中的段(这里是通用的操作系统说法,并不是具体到某一个操作系统版本的实现)是浮动的,所以你纠结磁盘上的数据要“写死了”物理内存编号,这还是脑袋没有开窍,硬要往写死物理内存地址的思路上来理解。把脑袋倒过来,就正常理解了。
  • 打赏
  • 举报
回复
自己想一想就明白,假设内存里已经有了10段数据,没有空闲的段位置了,那么当然就需要将内存里的某个不常用的数据段写回磁盘,使得这个段变为空闲的,然后就能用来加载其它段了?
vac_LJ 2017-04-29
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
假设这100K物理内存被分为10个“段”来管理 --> 假设这100G虚拟内存被分为许多个10K的“段”来管理
那每个段的物理内存是多少是怎么分的?
  • 打赏
  • 举报
回复
引用 4 楼 weixin_35836035 的回复:
100G放不进每个段啊?还是只是100G需要用的数据映射到每段中?
真实固执啊,你应该多想些悟性的的东西。 假设有1000万个数据段,只能保存到磁盘上,而物理内存只能放下10个段,那么读取一个数据段的时候当然就是先要“后判断这个段在不在内存里,如果不在就要从磁盘上加载这个段里边的数据,就有延时。加载了之后再来访问”。
vac_LJ 2017-04-29
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
比如说虚拟内存100G,物理内存100K,假设这100K物理内存被分为10个“段”来管理,当程序访问一个地址时,首先换算为“段号+段内偏移”,然后判断这个段在不在内存里,如果不在就要从磁盘上加载这个段里边的数据,就有延时。加载了之后再来访问。
100G放不进每个段啊?还是只是100G需要用的数据映射到每段中?
  • 打赏
  • 举报
回复
假设这100K物理内存被分为10个“段”来管理 --> 假设这100G虚拟内存被分为许多个10K的“段”来管理
xuzuning 2017-04-29
  • 打赏
  • 举报
回复
虚拟内存 = 物理内存 + 硬盘交换区 MMU 负责在 物理内存 和 硬盘交换区 之间搬运数据,你说是映射也可以
  • 打赏
  • 举报
回复
比如说虚拟内存100G,物理内存100K,假设这100K物理内存被分为10个“段”来管理,当程序访问一个地址时,首先换算为“段号+段内偏移”,然后判断这个段在不在内存里,如果不在就要从磁盘上加载这个段里边的数据,就有延时。加载了之后再来访问。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧