操作系统复习概论
在计算机里,有一个思想用的非常之广,即封装,就是把变化的部分封装起来,只留个接口供外部调用。这个思想在编程中很常见,比如说面向对象的编程,针对接口的编程,调用API,放宽点乃至函数都是;在硬件中,同样也有这种思想的广泛使用,操作系统算是最重要的一个。
1.为什么要搞个操作系统?
现在的计算机好像没有不用操作系统的,那不用操作系统可以吗?行。但那是怎样一种情形呢?你每次打开电脑时都要预先手动把你要运行的程序加载到存储器中,就是每次开机有个额外的初始化操作,就像现在的引导程序一样,然后开机后才能运行。就是把现在的操作系统换成你要运行的程序就行了。在操作系统出现之前都是这么干的,因为那个时候首先软件少,计算机庞大,编程都要穿孔卡片,手动操作起来相对来说方便,这样做就足够了。很明显,这样做有两个突出确定:1.不能多任务。你见过同时运行(注意是“运行”)两个操作系统的计算机吗?2.软件很难编写而且难移植。那个时候的软件都是纯机器语言编写的,也就是针对具体的硬件编写的,程序员需要了解每个硬件细节,自己管理那些硬件资源,所以要是换个配置不同的机器运行恐怕就要出问题了。随着人类的越来越懒,要计算机做的事情越来越多了,软件越来越多了,而且计算机也越来越小。这样的手工程序切换实在太烦,而且计算机的硬件更新换代那么快,一台计算机跑一个程序太便宜计算机了,而今天编写的软件还有可能明天就不能用了,必须要改进。于是响应了时代的号召,操作系统就应运而生了。这样,计算机的作用也就非常明显了,第一就是管理硬件资源。操作系统解放了的程序员,编写程序不再需要自己去管理那些硬件资源了,操作系统会帮你负责调度硬件的,比如CPU,内存,时钟,磁盘,鼠标等设备;第二就是提供资源集的抽象。如果你要编写一个涉及到I/O操作的程序,在没有文件系统时,就要求你自己用机器语言编写对I/O的操作过程,你愿意做吗?看到一堆0和1,我反正是望而却步。但是有了文件系统就简单多了,你只需要操作抽象的文件就行了,操作系统中的文件系统会帮你访问磁盘进行一系列I/O操作的。操作系统隐藏了硬件,比如GUI,把计算机变得简单友好漂亮了。
2.软件VS程序VS进程VS线程
操作系统就是一个里面可以运行其他软件的软件。那什么是软件呢?软件就是程序及其文档的集合。那什么是程序呢?程序就是一堆静态的代码。而把程序加载到内存中计算机按照代码指令所做的一系列动作的综合就是进程。线程就是进程中那些同时进行的动作。《现代操作系统》中,有一个非常形象的比喻来说明程序和进程的区别。话说有一个计算机科学家(处理器)有一手好厨艺,女儿要生日了,他要给女儿DIY一个蛋糕。于是他找到烘制蛋糕的食谱(程序),准备好各种需要的材料(输入数据),按照食谱一步步做起来了(开始进程A)。忽然,他儿子哇哇大哭着回来了(比A优先级高的进程B要求运行),小朋友被小蜜蜂蛰伤了。科学家就倒扣下食谱(保存现场),帮儿子处理伤口(开始进程B)。伤口处理完毕后(进程B结束),科学家又把食谱翻过来,看做到哪一步了(恢复现场),接着做。在做蛋糕的过程中,他可能需要煮点水(线程1),在煮水的同时他也可以调制佐料(线程2),在一切配料都做好后(线程1结束),但是水还没开,必须等水开了后(线程2结束)才能用锅灶(共享资源)开始下一步。这样按食谱做下来,科学家烹制出了女儿喜欢的蛋糕(输出数据),科学家转而去写计算机程序了(进程A结束)。通过这个例子可以比较清楚的理解这几个概念了。
4.操作系统的任务
(1)管理硬件资源。比如负责调度CPU,分配内存等;
(2)管理抽象资源。比如文件系统管理抽象文件;
(3)管理进程。因为其他应用软件都在操作系统上运行,所以操作系统负责管理各个程序产生的进程;
3.操作系统的进化史
(1)第一代(1945-1955):真空管(也就是电子管)和穿孔卡片。这个时候的计算机还没有操作系统,没有程序设计语言,只能做一些简单的运算,编写程序都是机器语言,后面穿孔卡片代替了插件板;
(2)第二代(1955-1965):晶体管和批处理系统。这时的计算机称为大型机,终于变得可靠了,运行程序时程序员不用战战兢兢的等待了。这一代也有了编程语言了(FORTRAN)。同时,也出现了批处理系统,即根据计算机的特性让他专门负责批量干某一件事,等他把所有他应该做的都做完了,然后把结果交给另一台计算机再做另一个处理。这时的典型操作系统有FMS和IBSYS;
(3)第三代(1965-1980):集成电路芯片和多道程序设计。IBM的360机型首次采用了小规模芯片集成电路,性能得到了很大的提升,他用的操作系统是OS/360。为了充分利用CPU,出现了多道程序设计,即把内存划分为几个部分,每个部分放不同的程序,同时还出现了同时的外部设备联机操作,即计算机能将卡片很快的读入磁盘,然后装入内存运行,完毕后,再读入新的程序,这样就不必再搬运磁带了。但这仍是批处理系统,仍然很费时间,于是就出现了分时系统,即每个用户都有一个联机终端,多个用户登陆后可以轮流执行。第一个通用的分时系统是MIT的CTSS,后来又开发出了MULTICS(用于提供“公用计算服务系统”,和现在的云计算很相似)。这期间还出现了PDP机型的小型机,一位参与过开发MULTICS的科学家在PDP-7上将MULTICS简化为单用户版,这导致了UNIX的诞生,而UNIX导致了LINUX的诞生。
(4)第四代(1980至今):个人计算机。这时候出现了超大规模集成电路,于是让微型机的出现成为了可能,微型机结构上和PDP-11没什么不同,但灰常便宜,这就直接导致了个人计算机时代的到来。最初的微型机系统时运行在Intel 8080上的CP/M系统,非常可惜CP/M的Boss拒绝了IBM将此系统运行于他们的IBM PC上的请求,于是IBM找到Gates,问Gates可不可以给他们搞个操作系统,Gates马上找到了一家本地的计算机制造商,购买了他们的DOS(DOS也是CP/M影响开发的),然后再搭售了自家的BASIC,组成了成套的DOS/BASIC转手给IBM,后来又应IBM的要求,Gates雇了DOS的作者,将DOS改为了MS-DOS,很快主导了IBM PC的市场,Gates确实是一个精明的商人。CP/M和MS-DOS都是通过键盘输入命令的,也就是基于命令行的系统。20世纪60年代在斯坦福研究院工作的Doug Engelbart发明了图形用户界面(GUI),包括窗口,图标,菜单以及鼠标,然后被Xerox PARC人员用在了他们的机器上,可惜Xerox的管理层没有意识到GUI的潜在价值,但是来Xerox串门的Jobs意识到了,后面导致了Lisa的推出,但是由于太贵,在商业上失败了,但是第二次的尝试成功了,那就是Macintosh。后来Gates开发MS-DOS的后续产品时也意识到了GUI的大势,于是也开发了自己的基于GUI的操作系统Windows,早期的Windows更像是MS-DOS上的一个shell,不像真正的操作系统,直到Windows 95,才算是一个独立的Windows版本,后面又开发了另一个版本Windows NT,现在常用的Vista和Xp都属于这个版本。由于MIT为Unix开发出了X Windows的视窗系统(如X 11),在X 11上也有一个完整的GUI,如Gnome或KDE,所以Unix也是个人计算机操作系统中的一个主要竞争者。回顾了计算机发展的这几十年后,计算机的革新速度着实令人惊诧,在人类文明发展的历程中,恐怕没有比计算机革新速度更快的发明吧!