前言
很高兴见到你!
上一期我在掘金发表了《重学安卓:Activity 的快乐你不懂!》,原本只是想给大家一把进阶的钥匙,能够因为文章从 0 到 1 的介绍,而对显示系统大家族 建立起感性的认识、并且埋下好奇的种子 去推动自己继续探究,没想到公众号后台 有不少读者追问是否还有后续。
关于这个问题呢,不要慌,答案就在文章的末尾。
平心而论,我比较倾向于 “从 0 到 1” 的这种思考。一上来就讨论技术细节的话,对我来说也是件很摸不着头脑的事。
所以在开放场合,我清一色地是以 “从 0 到 1” 和大家见面,也希望你们能记得, KunMinX 就是 “专好这口” 的那个作者 ~
好了,今天的主题是介绍操作系统的缘起。为什么会想起介绍这个呢?
问问你身边的同事或朋友,他们对于操作系统的认识到底有多少?为什么我们做软件开发的,要认识操作系统?
或者说,到底在什么情况下,才会涉及到操作系统知识?——
比如,你是否原以为 Android 应用层开发 根本涉及不到什么底层的概念,没想到 在分析 Looper 时,对进程阻塞的概念不解,导致无法理解为什么死循环不会导致 ANR?
又比如在 Android 中,一个 App 通常是一个进程,App 间的组件通信,靠的就是进程间通信,所以如果不明白进程,你是否有办法理解为什么存在进程间通信?
再比如,像 “双缓冲” 或 “内存抖动” 这些概念,是几十年前就存在的操作系统概念,是大学教科书上就有的东西,并不是安卓平台独有的。所以当有人拿着这些名词向你臭显摆的时候,你是否能够嗤之以鼻?
不过呢,在介绍任何事物之前,我还是会以事物的缘起做开头,所以本文的目标就是介绍操作系统的缘起。
如果阅读完本文,你对操作系统的缘起、发展,和作用 有了最基本的感性的认识,那我的愿望也就达到了。
不得不先讲的背景缘由
1946 年到 50 年代中期,计算机还处于手工操作方式,此时还没有出现操作系统。
操作系统最开始的出现,是为了解决 CPU 运算资源利用严重不充分的问题。
那究竟是有多严重、有多不充分呢?下面我拿具体的客观数据,来为你奠定一下感性的认识:
1.从第一代计算机开始,CPU 的运算速度 就已远远超过人类,达到每秒 5000 次加法运算。因而任何手工操作在其看来都是度日如年、巨慢无比。
2.第一代计算机的输入输出设备和主机是一体的,计算机需要通过输入设备接收 穿孔纸带
来读取程序,因而每次上机,整台计算机是一个上机人员独占的。并且在上机人员上纸带时,CPU 是处于等待状态。
3.第一代计算机的 CPU 是由电子管构成,电子管 每隔 6 分钟就可能烧坏一个。
综上,早期计算机的上机成本十分高昂,为了解决 CPU 运算资源利用不充分的问题(或者说弥补巨慢的输入输出和巨快的运算速度之间的巨大鸿沟),先后做了 3 次改革。
第一次改革:联机批处理系统
将作业运行的全流程交给批处理系统来监控和调度,也即解放过程中几乎所有的人力操作,实现自动化。
如此一来,便 解决了“人机矛盾”,节省了输入输出操作和运算操作之间的切换时间间隙。
但并没有解决:在作业的输入和输出时、CPU 仍处于忙等状态、等待慢速的输入输出设备完成工作。
第二次改革:脱机批处理系统
将输入输出设备与主机分离,通过转换器将输入机的数据事先读取到高速磁带,并将高速磁带用于 CPU 的计算,计算结果也存放在高速磁带中,通过转换器将数据通过输出机输出。
所以可以理解为,高速磁带就是内存的雏形,由转换器将输入输出设备的数据转换并读写在高速磁带上。这样,主机并不直接与慢速的输入输出设备打交道,而是与高速的磁带发生关系,如此便 有效缓解了主机与外设的矛盾。
但此时仍没有解决的是:当一个程序执行到一半,发出 IO 请求时,CPU 便不得不等待 IO 操作完成。
第三次改革:多道批处理系统
此时出现了多道程序设计技术:
将多个程序同时放入内存中,当一个程序执行完了、或请求 IO 操作时,就会切换到另一个程序继续执行,而不让 CPU 忙等。
多个程序之间在微观上来看是串行,但由于此处的串行不包含 IO 操作,因而 大大缩短了整体时间。
并且又由于各自都未执行完,因而宏观上来看多道程序又是在并发执行。
(进程和空间隔离的概念也是这个时期出现的,让多道程序处于不同的内存空间,让数据更加安全和稳定。)
于是,在批处理系统和多道程序设计技术的基础上,演化出多道批处理系统。特点是:
1.多道:系统可以同时容纳多个作业,作业以队列的方式存放于外设中,系统将作业读取到内存中运行并最终输出结果,整个过程是个自动转接的、连续的作业流。
2.成批:系统运行过程中,用户无法干预,无法与之交互,必须等待运行完成。
所以多道批处理系统 解决了“吞吐量和资源利用率”的问题,以及实现作业流程的自动化。
但缺点是:无法实现人机交互,而且到目前为止,计算机仍是独占的。
背景变迁
20世纪60年代初,晶体管的出现,使 CPU 在大幅降低耗能、体积和损毁率的同时,性能大幅提升。这使得计算机的背景环境发生了变化。
再加上前 3 次改革的目标是解决资源利用率和吞吐量的问题,而没有解决计算机独占的问题,因而促成了分时系统的出现,来 解决计算机独占的问题,并且让彼时的系统能与用户发生交互。
分时系统
分时技术的特点:把 CPU 的运行时间分成很短的时间片,按时间片轮流把 CPU 分配给各联机作业使用。在一个时间片内不能执行完,则时间一到,任务暂时中断,切换给另一作业使用,直到下一次再轮到自己。
此时的一个典型应用就是 多个终端共享一台主机。宏观上看好像是并行执行,微观上看其实是轮流串行执行。并且终端之间独立运作、互不干扰。
并且 此时的系统是 可交互、且及时响应交互的。用户可在系统对上一个请求作出响应的基础上,再次发出新的请求。
(对换存储等概念也是这个时候出现的。分时系统可以同时接纳数百个用户。由于内存空间有限,往往采用 对换方式 的存储方法,将未轮到的作业先放入磁盘,一旦轮到再放入内存,而时间片一用完,又将作业存回磁盘,使同一内存区域轮流为多个用户服务。)
实时系统
虽然 多道批处理系统 和 分时系统 分别解决了 资源利用率 和 系统响应 的问题,但却不能满足 实时控制 和 实时信息处理 这两个应用领域的需求。
于是就产生了实时系统,可以及时响应随机发生的外部事件,并在严格的时间内完成对事件的处理。
1.实时控制系统:比如飞机飞行、导弹发射的自动控制。
2.实时信息处理系统:比如查询航班、航线、票价等实时信息。对实时性的要求稍弱于第一种。
特点:及时响应,高可靠性。
通用操作系统
复合了 多道批处理系统、分时系统、实时系统,也即包含其中两种或三种特性的系统。
进一步发展
个人操作系统、网络操作系统、分布式操作系统等。
综上
1.操作系统的出现,最初是为了 解决资源利用率和吞吐量的问题。(因为打从一开始,CPU 的速度就已一骑绝尘,让人类和外设无以望其项背。CPU 的巨快,是导致操作系统的出现,乃至 “多道程序设计”、“分时复用技术” 这些 “骚操作” 得以存在的最根本的缘由。)
2.含分时特性的操作系统可以 与用户发生交互、响应用户的操作。
3.含实时特性的操作系统可以 实时响应事件、或动态获取最新信息。
4.操作系统是对硬件的一层封装,上层应用直接与操作系统接口打交道,即可间接地调动硬件资源来完成工作。
这样说,你理解了吗?