1
dilu 2020-12-01 12:45:17 +08:00 via Android
虚拟内存通过 CPU 中的 mmu 进行映射操作,查询页目录跟页表。好处是进程直接内存是隔离的,同时用户空间不会影响到内核空间。你想想实地址模式跑个 qq 就把操作系统搞挂的场景?这样做大大的增加了稳定性。同时还方便进行碎片内存的回收,也简化了上层调用者的调用逻辑。
你看计算机的各个技术方向,都是分层思想,尽量让每一层都不互相干扰。 |
2
msg7086 2020-12-01 13:47:32 +08:00
「这些都是虚拟地址,最后还需要靠 OS 映射到物理地址,那管理虚拟地址的必要性在哪里?」
虚拟地址的必要性和最终是否映射到物理地址是无关的,前者无法推出后者结论。 就像说你到了 100 岁牙全掉光了,那现在为什么还要保护牙齿一样。 如果像你说的,去掉了虚拟内存地址,那么所有的程序最终都得读写物理地址。那程序是不是还是要有一个机制去管理哪些地址不能读写,哪些地址能读写。那最后不就等于在每个程序内部重新写了一个内存管理器么。 既然每个程序都要实现内存管理器,不如整个拿出来抽象成一个虚拟内存地址,然后程序只要很简单地申请和释放就行了。 |
3
msg7086 2020-12-01 13:49:52 +08:00
换句话说,没有「必要性」,但是白嫖的开发成本,为什么不拿呢。
就像说牙齿,反正有假牙,套上也能用,实在不行还能种牙。 但是你还是会保护牙齿,因为性价比高啊。 |
4
systemcall 2020-12-01 15:55:44 +08:00
虚拟地址与物理地址之间的映射是硬件实现的,优化是硬件厂家的事。SSD 上面系统拿到的照样是虚拟地址,看主控性能
如果想直接用物理地址,欢迎来到嵌入式。能够直接操作物理内存,不仅仅是可以影响到别的进程那么简单,你甚至可以直接操作硬件 |
5
nicolemeimei OP |
6
msg7086 2020-12-04 02:15:51 +08:00
性能当然是有影响的。
但是你反过来想想,现在的操作系统在管理 CPU 分片的时候也有严重的性能损失。 你所有的 CPU 时间都是先交给操作系统,然后操作系统从一大堆进程里挑一个,然后把时间片下放给他。 这个过程每秒钟要执行几十到几百次。 那么如果是你,你会选择花一个小时写个简单的几十行代码来完成你想做的事情,还是去花个半年时间写一个完整的和 CPU 直接交互的私有时间片管理器,然后绕开操作系统,直接从 BIOS/UEFI 引导进你的小程序,就为了这 5%(猜的)的性能? 抽象当然会带来性能上的损失,但是他节约下来的,是全球数千亿美元的开发成本。 一般认为这些都是必须要付出微小代价。 人力成本只会越来越高,硬件成本只会越来越低,没有必要为了个便宜货去搭上昂贵的人工。 这也是为什么高级语言才是开发主力,而底层语言终究还是为了基建。 |
7
nicolemeimei OP @msg7086 嗯嗯,我现在明白了这里头的 trade off 。太谢谢您了!感觉思路开阔了很多!
|