你好,我是 Cone。
首先,我们思考一个问题。
为什么会有操作系统?
在我们教科书上会提到分时系统、批处理系统等等现代操作系统前的中间产物,也会讲到管理硬件的功能,但似乎没有讲到为什么有操作系统这个东西,诞生操作系统是为了解决什么样的问题?下面就来通俗易懂的聊聊为什么有这个东西。
假设在远古时代的计算机需要由人工进行运行操作,但是运行期间又不需要更多的人为干预,这个时候人就空闲下来了,但是计算机被这个任务占据了,啥也干不了,白白的浪费时间(程序员的工资那么高,时间这么浪费了的话,损失惨重!),而且对于计算机的核心部件 CPU 来说,并不是一直有数据可以来运行,也有对于其他部件的操作等待,比如 IO 操作,在等待 IO 的时间里特别漫长,这就浪费了宝贵的 CPU 资源。所以这样的计算机运行状况是非常低效的,那么操作系统解决的一个问题就是提高效率,提高 CPU 的使用率,不让 CPU 休息,疯狂压榨它!!!
同时,计算机操作人员直接操作计算机硬件的话,非常麻烦,还容易出错,所以人们总是寻求一些办法来解决现有问题,这种解决问题的方法论在哪个学科都成立,既然麻烦,那何不根据计算机领域哲学方法论:添加一个中间层来解决现有问题,那么操作系统就是相对于硬件的中间层。它的出现就屏蔽了底层硬件的细节,从而让出错的概率大大降低,以及让计算机操作人员更加顺风顺水的操作,程序也开始可以被操作系统自动管理。
上面提到的两个问题可以归结于三个字:自动化。程序员总是趋向于追求自动化,比如自动化测试等等。自动化有什么好处呢?借用一句工业革命时期的话那就是:解放生产力。代替那些重复性工作。
所以操作系统的出现也可比喻成生产力的解放,使得程序运行更加高效。
既然我们知道了需要这么一个操作系统来进行自动化运行,那么什么是操作系统呢,为什么叫操作系统而不叫管理系统或者其他名字呢?
什么是操作系统?
操作系统的英文名为:Operating Systems. 翻译为操作系统,操作二字有点流水线工人操作员的意味,是不是感觉有点土。这么理解的话,那就有些许偏差了,再来一个英语词汇:Operating Surgeon. 这个词汇的意思是主刀大夫. 主刀大夫是什么人物?在整个手术室里是权威呀,说上麻药,麻醉师马上就位,说要 xx 手术刀,助理大夫马上送到,是主宰手术室一切的人物。所以操作系统就是主宰一切的系统,计算机体系世界里的一把手。
那么操作系统主宰的一切,这一切包含什么呢?
当然是计算机上里发生的一切事情。在最原始的计算机并没有操作系统,而是直接由人来掌控事情,即所谓的单一控制终端、单一操作员模式。但是随着计算机复杂性的增长,人已经不能胜任直接掌控计算机了。于是我们编写出操作系统来掌控计算机,将人类从日益复杂的掌控任务中解脱出来。
所以明确的说操作系统就是 掌控计算机一切的舵主,权威至上。
我们知道操作系统管理计算机的一切,那操作系统具体管理哪些东西?
操作系统管理哪些东西?
还是来张图已显得更加清晰。如下图。操作系统的 4 个核心管理,当然还有其他的一些安全性管理等等。
如图,第一个是进程管理,管理要素包含三个:第一个是公平,即每个程序都有机会被 CPU 执行。第二个是非阻塞,任何一个程序不能无限制的阻塞 CPU 给其他程序执行。如果一个程序在运行过程中需要输入输出或者因别的什么事情而发生阻塞,这个阻塞不能妨碍其他进程继续运行。第三个是优先级,CPU 也是分优先级的,也就说优先级高的进程会首先被 CPU 执行,都优先级其次。
内存管理主要是管理缓存、主存、磁盘、磁带等存储介质所形成的内存架构。为实现这一内存架构,设计了虚拟内存这一层结构,即将物理内存扩充到外部存储介质上。这样内存的空间就大大地增加了,能够运行的程序的大小也大大地增加了。内存管理的另一个目的是让很多程序 共享同一个物理内存。这就需要对物理内存进行分割和保护,不让一个程序访问另一个程序所占的内存空间。
外存管理通常也称为存储管理,它也就是文件系统管理了。文件系统的主要目的是将磁盘变成一个很容 易使用的存储媒介以提供给用户使用。这样我们在访问磁盘时无须了解磁盘的物理属性或数据在磁盘上的精确位置,诸如磁道、磁柱、扇面等。当然,文件系统还可以建立在光盘和磁带上。只是使用最为频繁的文件 系统都以磁盘为介质。
I/O 管理也称为设备管理,就是管理输入输出设备。I/O 管理的目的有两个:一是屏蔽不同设备的差异性,即用户用同样的方式访问不同的设备,从而降低编程的难度,你要知道目前存在有上万种 IO 设备,每个 IO 设备的适配都是在这里进行的,这是抽象和封装的魅力;二是提供并发访问,即将那些看上去并不具备共享特性的设备(如打印机等)变得可以共享。
上面三个问题,我们走进了操作系统的世界,了解了操作系统为何而来,它又在干些什么,下面还是来进入主题,操作系统历史,那么操作系统到底经历了些什么呢?老规矩:一图胜千言。
我们就从萌芽阶段的状态机系统来讲起。
第一阶段:状态机系统
状态机系统是计算机在萌芽阶段出现的,也就是大概 1940 年以前。其实这种系统其实都不能算做操作系统,因为他就是一种简单的状态转换程序,通过特定的输入和特定的状态进行转换。能做的计算也非常简单,也就仅限于加减法,也不支持命令交互等等功能。当然,它有一个非常大的好处,没有安全风险,没几个人能接触到它,自然就不存在安全问题了。
第二阶段:单一控制系统
学过计算机导论的话,你应该了解计算机领域的的经典模型——冯若依曼体系结构原理,它是 1945 年左右提出的,属于这个时期,那还记得我们全世界的第一台电子计算机是什么时候出现的吗?没错,也是这个时期出现的,时间是 1946 年 2 月,诞生在美国的宾夕法尼亚大学,名称叫做 ENIAC。
这台电子计算机其实没有搭载所谓的操作系统,他只是提供了一些标准的命令给用户使用,这些标准的命令集就构成了原始的操作系统 SOSC(System Operation Support Center)。这些 SOSC 满足了系统运行的基本功能,提供人机交互功能,在这种情况下,任何时刻却只能做一件事,不支持并发也不支持多道程序设计。在这种系统下的资源利用率很低很低,你输入一个命令它就执行一次,类似于拨一下就动一下,但是动的拿一下又全部占用计算机。这种情况,我们可以理想成只有一个程序能运行。从机器的角度出发,时时刻刻都要等着人来操作,效率真的太低了,详细情况看看下图更清晰。
多个人需要使用这台计算机,指令就会断断续续,就会影响效率,就算是一个人输入多个命令,相比于计算机来讲,人输入的指令速度也会很慢。
那有没有不等人的操作让其自己执行呢?随着计算机的发展那当然有了,接下来就打破这种过于笨拙的情况,来到自动化一点的时代。
第三阶段:批处理系统
在仔细考察了 SOSC 后,人们发现,SOSC 效率之所以低下,是因为计算机总是在等待人的下一步动作,而人的动作总是很慢。因此,人们觉得,如果去掉等待人输入命令的时间,即让所有的人先想好自己要运行的命令构成一个程序,然后列成一个清单,打印在纸带上,然后交给一个操作人员来一批一批地处理,效率不就提高了吗?这样就形成了批处理操作系统。这是又大大提高单一控制终端的操作系统 SOSC 的效率。
显然,在这种工作模式下,系统的功能得到了提升,必然复杂性也随之提升,在这种系统下,用户只管把程序放在磁带上,用户自己可以不在场而去干别的,接下里就是由操作员操作批处理系统来处理一个个任务,处理完了就给出结果。最早的自动化处理雏形出现了。但是这个时候也只能一个个任务处理,一个任务读取 IO 的时候 CPU 就等待下来了,还是在一定程度上会影响 CPU 运行的效率,有没有办法再提高一些呢。这个时候就抓住了 CPU 和 I/O 设备运行时串行的这点,做了文章。
第四阶段:多道批处理系统
先来看看单道批处理下的 CPU 与 IO 运行关系,如图。
当 IO 操作的时候,CPU 会等待 IO 操作的结果,结果返回后才会继续执行程序,我们可以认为这个时候程序是串行的。由于 I/O 设备的运行速度相对于 CPU 来说实在太慢,这种让高速设备等待低速设备的状况无法接受。那能不能将 CPU 和 I/O 进行并发呢?即在一个程序输入输出时,让另一个程序继续执行。换句话说,能不能将 CPU 运行和 I/O 设备的运行重叠起来而改善整个系统的呢?答案是肯定的,我们可以设计将多个程序同时加载到计算机内存里,以前内存里只有一个程序,而现在有多个程序在运行,从而就出现了多道批处理操作系统。这是一个划时代的操作系统,开始从原来串行执行任务,到并发执行任务,大大提高了 CPU 的使用率,具体如图。
这样 CPU 就开始被任一时刻都用起来了,不会让它再次打盹了。这两个阶段都是可以为围绕如何提高 CPU 运行效率来优化。可以发现,在程序 1 要让出 CPU 的时候,那么到底是让程序 2 执行呢,还是程序 n 执行呢,这就涉及到 CPU 运行时间如何分配问题,随着发展,我们又有了分时运行的方案。
第五阶段:分时系统
多道批处理操作系统的出现使计算机的效率(主要是吞吐率)大大提高。不过批处理系统这里有一个很大的问题,写程序的人需要交给一个计算机操作人员来执行程序,对于结果等全部执行完了之后才知道,也不能知道执行步骤,这显然也是低效且很难接受的。万一这个计算机操作人员操作失误或者忘记了呢,所以这个时候就得提出人人都可以拥有计算机的使用权,从而去考虑 CPU 资源怎么分配,这就是分时系统,给每个用户分配的时间是均等份的。即分给每个人有限的时间,只要时间到了,就换一个进程。这种时分切换下的操作系统就是分时操作系统。在这种系统下,用户就可以自己调试程序,这里就相当于有多个程序并发的在执行,只要我们将 CPU 切换的时间无限细分,那么每个用户就会感觉独自占有计算机资源一样,这样的运行模式下就是有多个程序一起执行,也就是我们现代操作系统里的进程并发概念。详细情况如图。
A,B,C,D 四个程序依次在 CPU 上执行,如果将每等分无限细分,就好像 A,B,C,D 四个程序自己一个人独占 CPU 资源一样,这也就出现了程序执行的并发现象,这是一个假象,只是执行速度太快,人类无法感知而已。
在分时系统下,操作系统的复杂性开始大大提高,还会涉及到资源互斥、进程通信死锁、保护等问题,复杂性指数可以说是增长超快了。
那么在分时系统下,每个进程获得 CPU 的执行时间是公平的,不存在偏差,这就会导致一个问题,比如我输入单词这么一个操作,不可能等 CPU 执行权限来到了才能执行吧,得及时响应,不然的话,用户体验极其差评!所以就出现了实时系统。
第六阶段:实时系统
随着计算机技术的进步,产生了一种需求:有一个程序需要在需要运行的时候马上运行,而不能等到分时轮到这个进程执行,比如现在的鼠标、键盘等输入性操作,在不破坏操作系统原有运行体系下,需要响应这些事件。也就是计算机对这些事件必须在规定的事件内做出响应,这就是实时系统,详细情况如下图。
这个时候响应事件的优先级最高,CPU 会优先处理这些高优的事件,也就是有了实时被处理的感觉。
第七阶段:现代操作系统
1980 之后,就开始进入现代操作系统时代了,计算机工业开始迅速腾飞,出现了 DOS,Windows,MacOS 主流操作系统,总结了前面各个阶段的优缺点,发展了现代操作系统,同期也出现了 PC 机,计算机算力开始大大提高,后来又出现网络,分布式操作系统又得到了发展。
在操作系统的历史演进过程中,我们可以发现基本上是围绕如何提高 CPU 效率这个方向来进行,让 CPU 不打盹是我们的目标,围绕这个点来看计算机发展史,非常能理解当前时代出现了什么问题,如何去解决问题。
最后
我们生活在一个最好的时代,这个时代只要你动动手就能获取你想要了解的信息。一起享受这个时代所带来的的便捷吧!
原文链接:https://mp.weixin.qq.com/s/RCrrwT6i6Ft59MAIITSxhg