操作系统历史与学习任务
# 3. 操作系统历史与学习任务
前面我们讲了操作系统的基本样子,也讲了启动的过程:bootsect.s → setup.s → head.s → main 等;也讲了操作系统的接口,以及背后的实现原理,并讲了如何从一个 printf 函数到 sys_write 的这样一个过程。
如果说我们把操作系统比做一家钢琴的话,那么我们之前讲的内容相当于打开了钢琴的盖子,表面上看一看操作系统。
接下来我们就不仅仅是揭开钢琴的盖子,更要分解整个钢琴,看看钢琴(操作系统)到底包含那些模块,怎么组装成一个系统,所以接下来就应该逐个模块讲解。
但为了加深对操作系统的理解,我们特意先增加了一讲,介绍操作系统的历史。培根曾说过,读书使人明智,从操作系统的历史我们会学到为什么要有操作系统,操作系统是怎么编出来的,为什么操作系统会有这些模块,什么才是操作系统最核心的东西。
这样,我们更能抓住操作系统的重点,在学习的时候不会迷失方向(操作系统是一个非常复杂的东西)
# 批处理系统
在计算机诞生之初,人们就知道如果不配上操作系统,使用是非常费劲的(参考我们第 0 讲,如何在屏幕上显示一个 HelloWorld 的例子),因此出现了批处理系统,在 IBM7094 上使用。这台计算机非常昂贵,造价 250w 美元
面对这么昂贵的,重要的计算机,所有的任务都应该围绕着计算机展开,不能浪费这台计算机的性能。所以当时的批处理系统就会让计算机一个任务接一个任务的执行,不管任务是否出错还是完成,都不会停下来。
这个时候的批处理系统,还不能叫操作系统,,因为其实现起来非常简单,就是一个监控程序,发现第一个任务出错或者完成,就修改一下 PC 指针,让他去执行第二个任务;
如果第二个任务出错了或者完成了,马上去切换到第三个任务…………
# OS/360
后来出现了 OS/360 操作系统,这是一个殿堂级别的一个操作系统,很多关于操作系统的概念都是从这发展出来的.
随着计算机技术的发展,计算机的价格越来越低,性能也越来越好(摩尔定律),那么各行各业也就可以使用计算机了。例如在科学计算领域和银行等领域。不同的领域有不同的任务,例如科学计算领域,主要是使用 CPU 进行计算,例如矩阵的转置和逆运算;而银行等领域,也有计算,不过也有很多 IO 任务(例如保存客户的信息)。
一台计算机要做很多类型的事情,如果仍采用批处理的方式,效率就很低了。举个例子,JOB1 是 IO 型的任务,JOB2 是计算型的任务;IO 型的任务,计算机处理是非常慢的(相对计算型的任务而言)。如果采用批处理系统,在执行 IO 的时候,计算机就只能空等其操作完成,对计算机而言是非常浪费的,特别是计算机还比较贵的情况下。
因此一个很自然的想法就是,如果遇到了 IO 任务,在等待 IO 任务执行的时候,就切换到另一个任务 JOB2 去执行;等 IO 处理完了,再回到 JOB1 继续执行;这就是非常著名的一个概念:多道程序。多个任务同时在计算机中,交替执行。
为了实现多道程序的合理有序的切换和调度,操作系统要做的事情有非常多。据说当年 OS/360 是 IBM 组织了 5000 个人年开发出来的。360 寓意 360°,表示全方位的服务,可以处理几乎所有任务,用在各行各业。
但这些任务切换和调度,使得系统非常复杂,复杂到最后 5000 人开发了一年;现在 OS/360 基本没人使用了,且 bug 非常多,是一个不成功的项目。在当时还没有很好的软件工程思想,当代码特别多的时候,几乎已经不受控制了;
但 OS/360 的基本思想是非常对的,多个任务同时存在于操作系统内,不断的切换和调度,这时候已经萌生出了多进程的结构,这个结构可以说是操作系统最重要的概念了。到了现代,操作系统也是基于多进程结构的
当时有本书《Operating System Concepts》,其封面就是几只恐龙围着操作系统,寓意面对如此复杂的操作系统,我们就和史前动物一样,完全不知道这个是什么……
这也侧面说明了 多进程结构是为了满足计算机进入多个行业是必然会产生出来的样子,但是多进程结构也会导致系统非常复杂,在当时大家认识上比较模糊的情况下,做起来是非常费劲,而且没有成功。
# MULTICS
MULTICS 和 OS/360 在本质上没有多大的区别,只是又增加了一个内容:分时。当计算机开始进入各行各业,不光出现了多种任务,使用人数也增加了;那么对于每个用户都启动一个任务,为用户服务;
因此一个系统上除了出现多个任务同时执行的情况,还出现了每个人控制一个任务的情况,因此调度起来更加复杂:之前我们是遇到 IO 任务才调度,但如果用在这里,一个用户并没有使用 IO 的话,就会一直占用计算机,其他用户就一直用不了,那么其他人就会感觉这个系统太不友好了,一直没处理我的事情。因此就出现了分时的概念,就是每个用户执行一会,就切换到另一个用户去执行。
实际上,分时和多任务并没有太大的区别,都是任务的切换;但这个概念也是非常重要的,引入了这个概念后,一个计算机就可以供很多人使用了(目前的服务器都是多人使用的)
MULTICS 让多进程这个概念更加清晰,但核心依然是多进程的结构
# UNIX
计算机之后还是继续变的越来越便宜,普通人也能购买了,例如 PDP-1;因此在贝尔实验室工作的丹尼斯丘奇和肯托马斯,有机会接触到了 PDP,他们就在想能不能把 MULTICS 在 PDP 上实现出来;因为是两个人做的,协调起来更灵活,不像 OS/360 有 5000 个人做,同时系统也更小,更灵活,bug 也少。但是核心概念仍是多进程,分时。目前 Unix 可以说是学计算机的都要知道的一个系统了,非常有名。
丹尼斯丘奇和肯托马斯也是图灵奖获得者,他们是唯一的因为做出系统而获得图灵奖的人
# Linux
后来 IBM 推出了 PC 机,PC 变的非常的普及;Tanenbaum,发布了 MINIX,非常类似 UNIX,用于教学,而 Linux 学习了 MINIX 后就很想在 PC 机上做出一个系统来,关键是做出来以后,以开源的形式发发在网上,发在互联网上,因此就展开了一场轰轰烈烈的是 Linux 产业化运动,就很多人上来一起去写 Linux,而且都是开源的,后来辉煌到了极致,几乎现在很多系统,像安卓手机底层就是基于 Linux 很多应用,很多什么嵌入设备,上面装的去全是 Linux。
虽然 Linux 是改造了 MINIX,但其核心思想仍是 OS/360 的多进程结构。
这里更加印证了一点,一个人做操作系统,比明白操作系统背后的原理要重要,当然不明白原理是不行的,也就是说明白纸上的原理对操作系统的学习来说,可以说只完成了 10%,剩下的 90% 要真正把它落实到实际的计算机中,因为操作系统就是一个实实在在的软件,这个太重要。
# 操作系统历史与多进程
从 IBSYS → OS/360 → MULTICS → Unix → Linux,其核心思想一直就是多进程。多道程序同时在计算机里,交替切换执行,这个是操作系统的基本图谱。
但是对于操作系统而言,实现概念远比理解概念更加重要,这里老师也说下学习操作系统的一个很重要的任务:掌握操作系统的多进程图谱并实现它!
如果我们只掌握了图谱,在纸上画一画说一说还可以,没有任何用途;如果能把这个图谱实现了,或者至少我们能理解是如何实现的,我们才能有能力适当的改造图谱,对计算机,对操作系统的理解就上了一个层次,这样才能完成我们在第 0 讲里,定下来的学习目标:能通过上层接口进入操作系统,并且扩充系统。如果不明白图谱,肯定是无本之末;但如果只知道图谱而不去实现它,永远不会有这个能力
# DOS
接下来我们来讲操作系统第二个很重要的概念:文件。我们还是从历史讲起。
在 IBM 推出 PC 后,Digital Research 公司也想在其上配一个操作系统,叫做 CP/M。这时候已经有文件的概念了;用户怎么使用计算机?通过操作文件。
在 CP/M 的基础上,又出现了 QDOS
如果 QDOS 一直发展下去,可能就不会有比尔盖茨,但是这家公司没有抓住机会。所以这个世界总是留给那些有机会的人,那么比尔盖茨就要进入舞台了
1975 年 22 岁的保罗阿伦和 20 岁的比尔盖茨看到了一个杂志,当时非常有名的一个杂志,封面上是一个非常小型的计算机,两个人就很感兴趣,说能不能为这个机器做点什么,两个人就开发了 BASIC 解释器,如果你在上面开发了 BASIC 解释器,别人就可以用你的 BASIC 解释器来编 BASIC 程序,那么别人就可以用这个机器了
据此开创了微软,后来过了不久两年以后,比尔盖茨又开发了管理磁盘的一个文件系统,FAT,他就觉得磁盘文件,还有用户怎么对计算机的使用这个非常重要。
然后又在这个基础上把 FAT 和 BASIC 组合出来的,微软又买下了 QDOS,然后把这两个打包在一起最后,推出了 MS DOS,因为当时已经开创了微软,这就产生出了比尔盖茨的第一个系统,这个系统和 IBM PC 打包在一起,再卖出去,当时就非常火。
# Windows
后来,在 DOS 的基础上,出现 Windows。Windows 的主要目的是让客户更加方便和使用 。后来出现的图形界面,人们不再使用命令等(如果输错了文件名还挺麻烦),直接用鼠标点一下就可以。这里最核心的部分就是文件,后来图形化界面就是做了一些图标还对应这些文件,本质上没什么变化。
那么文件是怎么实现的,这个就是学习操作系统的第二个很重要的任务。
# Mac 和 iOS
这里还要稍微简单的说一说这个 IOS,也就是苹果做的,实际上大家可以看到他的思路跟 windows 非常相似,当然他不光专注于界面,文件,他更现在开始关注于媒体,手势,这些特别高级的东西,但是它的核心思想仍然是文件,只是在上面又增加了很多内容。
# 历史小结
我们总结下这堂课。操作系统的发展,始终是以多进程为核心,后来为了普通用户对计算机的使用,开始对文件,对图形化界面进行了发展,因此文件是我们要讲解的第二个很重要的模块。
回顾下我们在本课最开始提到的,要分解整个钢琴,看看钢琴(操作系统)到底包含那些模块,那么主要就是两个模块:多进程和文件。我们会讲解 Linux 的一些代码,看看其是怎么做出来的。
本堂课我们的两大主题就是多进程和文件:
- 多进程图谱涉及到 CPU 和内存
- 文件图谱涉及到 IO 和磁盘
还记得我们在第 0 讲说操作系统要管理哪些硬件,我们要学习哪些模块?如下:
- CPU 管理
- 内存管理
- 终端管理
- 磁盘管理
- 文件管理
因此我们讲多进程和文件,基本上就对应了上述 5 个模块,这两个图谱是操作系统的核心视图,这两个视图弄明白了,操作系统图的基本轮廓就在脑海中形成了,才有能力写出操作系统,改造操作系统。要是我们有这能力,那么以后几乎什么样的计算系统都能写出来,因为操作系统可以说是计算系统中最灵魂的东西
# 我们的学习任务
我们在历史里学到,操作系统最核心的东西是什么?多进程和文件。这两个图谱让 Unix 和 Windows 获得了成功,这些系统实际上就是对这两个图像的一个很好的实现。我们后续的学习,就是围绕这两个图谱展开
我们先将我们之前学习的东西串起来复习下。
我们在第 0 讲说过,操作系统是管理硬件的软件,那么管理硬件就得知道什么是硬件,有什么硬件?有 CPU,内存,IO 设备(显示器,键盘和打印机等),还有磁盘等这 4 个部分;我们后面的主要学习就在这 4 个部分上,CPU 怎么管理,内存怎么管理,这两个东西合起来就是多进程图谱;怎么管理 IO 设备,怎么管理磁盘,怎么产生文件,合在一起就是文件图像。
那么计算机怎么管理硬件的呢?用一些数据结构。类比我们要管理学生,我们要建立一个学生档案。而操作系统启动的时候,就将这些数据结构初始化好了。操作系统的启动无非就是将操作系统从磁盘中读出,然后放在内存中,并且初始化一些相应的数据结构(我们之前讲过了 MEM_MAP)。
等系统初始化好后,上层应该就通过系统调用进入内核,我们之前讲了是通过 int 0x80 中断,那么具体是系统调用是做什么,例如 sys_write 是做什么,我们后面就会展开来说
具体来说,CPU 是怎么管理进程的?Fork,我们要看 Fork 具体是怎么做的;内存是怎么管理的?地址。我们会看地址是怎么使用的。
然后是设备驱动,为什么说它是文件视图?为什么操作这种文件就能操纵对应的设备?我们怎么操作文件:用的是 open 这个系统调用。那么 open 是怎么做的?
所以从下次课开始,我们会讲进程是怎么回事,然后讲内存是怎么回事;然后讲文件视图,一个设别是怎么驱动的,open 一个文件是什么意思。