操作系统的进化史

1、批处理系统时代
批处理系统的特点是,操作系统将程序逐个转载到内存中,然后CPU去运行。缺点是速率太慢

2、为了解决批处理系统速率太慢的问题,有人考虑到让CPU在执行某个程序出现IO的时候,将当前程序挂起,然后去执行另一个程序。那么也就意味着内存中需要保存多个程序。即内存的分配需要处理。

3、当内存中同时装载多个程序,那么会出现一个问题,即两个程序有可能会操作内存中的同一个地址,那么就有可能会出现数据覆盖的情况。这是因为系统的程序引用的都是物理的内存地址,在批处理系统中,所有的程序都是从地址0开始装载,如果内存中有多个程序时,程序可能被装载到了某个地址,而程序还认为其开始地址为0.所以后面装载的程序就会访问到不属于自己的内存了。

4、那么如何解决上面的问题呢?第一种方案就是静态重定向操作系统的进化史
如上所示,既然第一个程序的开始地址为0,第二个程序的开始地址为10000,而程序都认为自己的地址是0开始的,那么第二个程序在处理的时候,在自己本来的地址上加上10000不就可以了吗?这就是所谓的静态重定位!

5、静态重定位显然是不方便的,因为程序是有可能在内存中移动的(内存分配算法),那么岂不是每次都需要静态重定位?那能不能在运行时把地址重定位呢?
即CPU增加一个寄存器,来用保存每个程序的起始地址,当某个程序运行时,就去找到这个程序对应的起始地址。这就是地址的动态重定位

6、动态重定位存在的安全问题:

假设有个不怀好意的恶意程序,它去访问别人的空间怎么办? 比如说地址2000 至 3000属于一个程序, 但是这个程序来了一条这样的指令 MOV AX [1500], 我们在运行时会翻译成 MOV AX [3500] , 这个3500有可能是别的程序的空间啊

这个问题该如何解决呢?又有人想到了,在CPU中增加一个寄存器,记录下每个程序在内存中的长度!妙啊!这样将程序访问的地址和长度对比一下,就知道是不是异常,然后来处理了。
说到这里,将这些寄存器、计算内存的方法封装为一个模块,就成了MMU(内存管理单元!这个内存管理单元其实是CPU来管理的!)

7、分块装入程序
当前,内存中确实是可以装入多道程序了。然后问题又来了。内存不够了!!因为当时出现了越来越多复杂的程序。加载到内存后占用的内存也越来越大。此时,有人提出了新的方案:“对每个程序,不要全部装入内存,要分块装载,例如先把最重要的代码指令装载进来,在运行中按需装载别的东西。
这样做的理论依据是什么呢?就是局部性原理:
(1) 时间局部性:如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行; 如果某数据被访问,则不久之后该数据可能再次被访问。
(2) 空间局部性:指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。“
因此,将程序分割的一个个小块称为页框,根据这个理论进行试验后,发现确实程序大部分时间只运行在几个页框中,所以将这些页框称为工作集

8、虚拟内存:分页
“既然一个程序可以用分块的技术逐步调入内存,而不太影响性能,那就意味着,一个程序可以比实际的内存大的多!”
说实话,这个话我还是不太理解,一个程序可以分块调入内存,是因为是局部性原理,但是为什么意味着一个程序可以比实际的内存大的多?等等!!一个程序确实可以比实际的内存大啊。靠。比如实际内存只有1G,而我的程序有2G,如果没有分块装载的话,1G的内存肯定是无法装载2G的程序的,而现在可以分块了,1G的内存确实可以装载2G的程序啊。

那么这句话我现在想通了,而当时的设计人员想到这里后,他们的思路是这样的,给每个程序都提供一个超级大的空间,例如4G,只是这个空间是虚拟的,程序中的指令使用的就是虚拟的地址,然后MMU将它们映射到真实的物理内存地址。

在这种思想的指导下,分块装入程序时,将虚拟的地址也进行了分块,这里叫做,(注意与页框区分开来)页的大小和物理内存的页框一样,这样好映射。
操作系统的进化史

不太理解。现在我来捋一下思路,为什么要分页?这是因为在可以分块装入程序的前提下还存在程序大小大于内存的问题,所以有了这么一个大胆的想法,给程序一个虚拟内存,让程序以为自己已经被加载了,而实际上是没有被完全加载,而程序的虚拟地址+物理内存之间,需要有一个关联关系来对应起来,这个就是页表!所以当程序使用虚拟地址来进行处理的时候,先要通过页表去查询到虚拟地址对应的物理地址,如果能找到,自然直接就去执行,而如果该虚拟地址没有对应的物理地址,那么就要从内存中找到一个空闲的地方进行加载。如果内存已经满了,那么就要把现有的页框置换到硬盘上。应该就是这个意思吧。

9、分段+分页
为什么需要分段?只能说这是程序员的呼声?反正我现在还是没有这个能力去提出这种想法,不过历史上就是开发人员提出需要分段的需求。

每个程序都需要标准化,一个程序被分成代码段、数据段、堆栈段,如下所示:
操作系统的进化史
在页表的基础上,又添加了一个段表。
操作系统的进化史
靠,这里的分页、分段还真的有点复杂。
这里来整理一下操作系统的进化史

1、批处理系统(程序逐个执行,速率慢)
2、内存同时加载多个程序(涉及到地址静态重定位和动态重定位)
3、分块装入程序(以局部性原理为依据,涉及到页框、工作集)
4、虚拟内存:分页(放飞自我的想法:一个程序可以用分块的技术逐步调入内存,而不太影响性能,那就意味着,一个程序可以比实际的内存大得多啊)
5、分段+分页(程序员们的建议)