4、内存映射
在最初的DOS时代,都是只支持单进程的,后来为了支持多进程,遇到了很多问题。
解决内存撑爆问题:
如下图:
把每个程序分块装入内存页框中,装入的是程序分成的页内存,大小4k。内存也分成大小4k的页框。
当运行一个程序时候,并不是一次就把这个程序分成的所有页内存都给放到内存中,而成用到哪个就加载入哪个。
LRU算法:当内存中放入满了的时候,会把一些不常用的页内存放在一个SWAP区,这一步骤由硬件完全操作,所以速度非常慢的。所有的关于缓存的算法,大多都是是由LRU算法。
解决相互打扰问题
这些页内存都是放在虚拟内存的,这个虚拟内存是比物理内存要大的多。如果是是64位的操作系统,那么它的虚拟内存就是2^64 byte大小的物理内存,同理,32位的操作系统就是2^32大小
比如上图,虚拟内存有这些的存放不同数据的空间,当然不止这些。其中可读写数据 或者 只读的代码数据,里面放的才是一块一块的4k大小的页内存,当使用的时候和物理内存的地址引用对应着,这个就是内存映射。
MMU
如上图,有4个进程P1,P2,P3,P4
它们共享一个虚拟内存地址,然后通过MMU,把数据同虚拟内存地址映射到物理内存,P4进程蓝色的暂时没有用到,所以扔在了SWAP区,也是物理磁盘上。
CPU如何区分立即数还是指令?
总线内部分为:数据总线、地址总线、控制总线。
地址总线目前46位。
比如CPU读取一个数据0100
,它到底是汇编mov指令呢,还是数字4呢?
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙