操作系统设计演变/什么是操作系统?
计算机操作系统是管理计算机硬件并通过 API 向应用程序提供这些资源的软件和/或固件。它也可以被定义为负责控制计算机或相关可编程电子设备的硬件功能的程序(一组逻辑指令)。(Martin Muduva 2014)。
通过处理硬件的需求和限制,应用程序和应用程序程序员无需额外工作量和额外知识来处理硬件。这使得为该计算机编写应用程序变得更加容易。它还使维护文件系统完整且正常运行变得更容易,因为对文件系统的所有更改都通过操作系统进行,而不是由每个应用程序程序员自己完成。(Tischeritz 和 Bernstein)。第一台计算机没有操作系统,并且一次只能运行一个程序。第一个电子计算电路只是分离的功能,甚至不需要编程语言来测试。大约在 1945 年,像 Eniac 这样的计算机诞生了,它占地 4 个街区,其处理能力与您今天可能在钥匙扣上获得的四功能计算器相当。这些庞然大物的编程是通过插接板完成的,这些插接板安装在一个类似电话交换机的装置上。由于它们是当时运行在真空管上的实验性引擎,而且维护是一个问题,因此几乎没有实际的生产力,而且只有少数人知道如何运行它们。编程是在每台机器自己的机器语言中完成的,因此不需要操作系统。到了 1950 年代,打孔卡片机的发明使得更容易读取一个小程序,但系统运行所需的一切只是按下几个按钮,一个将卡片加载到内存中,另一个运行程序。
在 1950 年代中期,晶体管使计算机电路成为固态,从而消除了不断巡视计算机内部以寻找烧毁的管子和清洁电气触点中的错误的需要。第一批固态计算机占用了大型空调计算机房,里面摆满了机架,主要用于政府处理表格,例如瞄准军事武器所需的弹道表格。这导致需要更多地控制每次操作所花费的时间,从而导致维护和运营组与程序员分离。最初,程序员在纸上写出他们的程序,然后将其打孔成卡片,操作员将这些卡片按顺序加载到机器中,一次一叠。后来,设计了一种作业控制语言,允许程序员将作业信息本身声明为其卡片堆栈的一部分,并且可以运行一个名为监视器的程序,该程序读取堆栈并将堆栈存储在称为输入磁带的磁带上。然后,输入磁带可以在单独的计算机(“主机”)上运行,并将它的输出转储到第二盘磁带上,称为输出磁带,该磁带稍后会安装在打印机上以输出对程序的响应。批处理监视器是这种早期形式的计算机最接近操作系统的组件。它的工作是从卡片中读取信息并设置作业,自动释放操作员。大约在同一时间,Fortran 被发明,一个“编译器”转储可以加载到主机上,允许程序员用人类可读的形式编写,而计算机仍然使用机器语言运行。
到 1965 年,第一个类似操作系统的程序开始出现,例如 Fortran 监控系统,该系统必须处理三种类型的程序的加载:Fortran 程序、编译器和机器语言程序,这是编译的结果。这需要该程序能够以某种方式识别它正在磁带上读取的文件类型。类似的系统,IBSYS 是 IBM 为 7094 开发的操作系统。加载操作系统需要首先加载一个包含操作系统的磁带,以便启动操作系统。早期的操作系统没有所有现代操作系统都使用的引导机制来初始化计算机,因此计算机的启动是一个漫长而复杂的过程。
到 1960 年代初,很明显,计算机公司必须支持两种完全不同的计算机:1401 这样的字符型计算机和 7094 这样的字型科学计算机。在这些完全不同的系统上进行维护和培训很成问题,因此 IBM 发明了 System/360 并创建了一系列使用这种通用架构的产品。IBM 360 是第一条使用小规模集成电路的计算机系列,因此与之前的固态机器相比,价格大幅下降。这极大地扩展了市场和机器的性能。
OS360 被编写为在所有 System360 机器上运行,从最小的输入处理器到最大的数值计算类型处理器。它是由数百名程序员编写的数千行代码组成的,维护很成问题,因为几乎每次修复一个 bug 时都会产生一个新的 bug。尽管如此庞大的单体程序不可能维护,但它与之前的第二代操作系统相比,仍是一个明显的改进,并获得了相当的流行。
它普及的概念之一是多任务处理的概念,即计算机可以同时运行多个作业,而不是等待单个作业完成。这消除了操作员装卸磁带时的等待时间,因为计算机可以在等待时处理另一个程序。将业务计算机操作系统与数值计算系统操作系统结合起来的一个问题是,涉及的作业规模需要不同的策略。业务作业很简单,每个作业所需的时间更短,因此装卸磁带占用了 80% 到 90% 的处理时间。而大型数值计算器仍然足够昂贵,以至于小型作业并不经济,因此装卸磁带只占作业的 10%,并不是一个严重的问题。解决此问题的一种方法是划分内存,以便每个作业都可以拥有自己的分区。这与多任务处理的概念相一致,因为它意味着多个作业可以在同一台计算机上同时运行,而不会干扰其他作业的内存。
随着这个概念的出现,出现了从一个分区运行读卡器、从另一个分区运行数值计算、从第三个分区运行输出到打印机的想法,消除了类似 1401 的卫星计算机,并减少了磁带由于安装应力造成的磨损。虽然第三代设备非常适合大型运行,但它们本质上仍然是批处理系统,随着程序变得越来越复杂,管理程序的卡片堆栈变得笨拙。这为分时系统铺平了道路,在分时系统中,每个用户都有自己的终端,并且他们共享一个中央主机。
直到第三代后期,用于保护机制的硬件开始普及后,分时系统才变得流行。当时,人们开始研究计算效用这一概念,即一个单一主机将为整个波士顿地区提供分时机会。从这个概念中诞生了第一个第四代操作系统 MULTICS。当然,这个想法是基于小规模集成,以及 LSI 然后是 VLSI(超大规模集成)的发展最终用小型台式机取代了整个房间的计算机。由于 LSI(大规模集成)的发展,在单架机架上构建整个计算机系统成为可能。这些小型计算机开始与 IBM 在小型企业中竞争,并且由于它们的融资条款不像 IBM 那样严格,因此它们有竞争力,取代了小型和中型 System360 组件。到了 80 年代,人们发现分时系统使用小型计算机作为前端来处理终端多路复用,并以主机作为主要的计算机制,这并不奇怪。
在 1970 年代,Ken Thompson 设计了 UNIX,它是基于 PDP-7 小型机的 MULTICS 的一个简化的单用户版本。由于他发布了源代码,它成为一个流行的操作系统,被大学和小型企业广泛使用。到了 1990 年代,它已经如此流行,以至于第三方为它编写的软件比当时拥有其许可证的 ATT 公司编写的软件还要多。ATT 与大学之间关于谁拥有 Unix V5 中新软件权利的法律纠纷导致了两件事:将操作系统出售给 SCO 和 Linus Torvalds 开发了一个替代内核,它可以运行当时由大学制作的公共领域软件,因为它符合 IEEE 开发的 POSIX 标准。
正是对操作系统内核的这种对抗性重写,催生了推动互联网革命的开源软件运动。如今,大多数操作系统都从开源软件运动中获益,因为它们的互联网软件的复杂性依赖于通过自由软件开创和传播的想法。
在今天的大多数情况下,操作系统最好定义为操作系统安装 CD 或 DVD 上提供的软件。这个定义对用户和操作系统供应商来说都很好用。它甚至在法庭上被争论过。
现在,操作系统的定义可能看起来像这样
- 一个系统
- 一组原则和概念以及所有服从这些原则的组件。
- 操作系统
- 一个软件系统,它管理系统的硬件资源,为用户提供一个基础来满足他们的程序计算需求。
程序化是指软件主要由程序使用,而不是由用户直接交互使用。
例如,C++ 不是 操作系统,因为它无法提供许多关键的计算功能。如果没有程序执行、进程调度以及系统软件为 C++ 提供的许多其他功能,C++ 就无法在裸硬件上运行。相反,Basic、Lisp、Smalltalk 和 Java 有时可以被认为是操作系统。虽然它们通常运行在其他操作系统之上,但有时它们直接运行在特殊的硬件之上。
谈到原则,例如 UNIX 的原则就是“一切皆文件,通过描述符引用”和“程序充当过滤器”。所有遵循这些原则的小程序和实用程序都是操作系统不可或缺的一部分,而 X Window System 则不遵循这些原则,因此它不是操作系统。
相比之下,Plan 9 是 Unix 的衍生系统,其原则为“一切皆文件系统”,并且 Plan 9 中的操作系统功能比 Unix 多得多。特别是,Plan 9 的窗口系统是操作系统不可或缺的一部分。按钮,一个用于将卡片加载到内存中,另一个用于运行程序。
在 1950 年代中期,晶体管使计算机电路成为固态,从而消除了不断巡视计算机内部以寻找烧毁的管子和清洁电气触点中的错误的需要。第一批固态计算机占用了大型空调计算机房,里面摆满了机架,主要用于政府处理表格,例如瞄准军事武器所需的弹道表格。这导致需要更多地控制每次操作所花费的时间,从而导致维护和运营组与程序员分离。最初,程序员在纸上写出他们的程序,然后将其打孔成卡片,操作员将这些卡片按顺序加载到机器中,一次一叠。后来,设计了一种作业控制语言,允许程序员将作业信息本身声明为其卡片堆栈的一部分,并且可以运行一个名为监视器的程序,该程序读取堆栈并将堆栈存储在称为输入磁带的磁带上。然后,输入磁带可以在单独的计算机(“主机”)上运行,并将它的输出转储到第二盘磁带上,称为输出磁带,该磁带稍后会安装在打印机上以输出对程序的响应。批处理监视器是这种早期形式的计算机最接近操作系统的组件。它的工作是从卡片中读取信息并设置作业,自动释放操作员。大约在同一时间,Fortran 被发明,一个“编译器”转储可以加载到主机上,允许程序员用人类可读的形式编写,而计算机仍然使用机器语言运行。
到 1965 年,第一个类似操作系统的程序开始出现,例如 Fortran 监控系统,该系统必须处理三种类型的程序的加载:Fortran 程序、编译器和机器语言程序,这是编译的结果。这需要该程序能够以某种方式识别它正在磁带上读取的文件类型。类似的系统,IBSYS 是 IBM 为 7094 开发的操作系统。加载操作系统需要首先加载一个包含操作系统的磁带,以便启动操作系统。早期的操作系统没有所有现代操作系统都使用的引导机制来初始化计算机,因此计算机的启动是一个漫长而复杂的过程。
到 1960 年代初,很明显,计算机公司必须支持两种完全不同的计算机:1401 这样的字符型计算机和 7094 这样的字型科学计算机。在这些完全不同的系统上进行维护和培训很成问题,因此 IBM 发明了 System/360 并创建了一系列使用这种通用架构的产品。IBM 360 是第一条使用小规模集成电路的计算机系列,因此与之前的固态机器相比,价格大幅下降。这极大地扩展了市场和机器的性能。
OS360 被编写为在所有 System360 机器上运行,从最小的输入处理器到最大的数值计算类型处理器。它是由数百名程序员编写的数千行代码组成的,维护很成问题,因为几乎每次修复一个 bug 时都会产生一个新的 bug。尽管如此庞大的单体程序不可能维护,但它与之前的第二代操作系统相比,仍是一个明显的改进,并获得了相当的流行。
它普及的概念之一是多任务处理的概念,即计算机可以同时运行多个作业,而不是等待单个作业完成。这消除了操作员装卸磁带时的等待时间,因为计算机可以在等待时处理另一个程序。将业务计算机操作系统与数值计算系统操作系统结合起来的一个问题是,涉及的作业规模需要不同的策略。业务作业很简单,每个作业所需的时间更短,因此装卸磁带占用了 80% 到 90% 的处理时间。而大型数值计算器仍然足够昂贵,以至于小型作业并不经济,因此装卸磁带只占作业的 10%,并不是一个严重的问题。解决此问题的一种方法是划分内存,以便每个作业都可以拥有自己的分区。这与多任务处理的概念相一致,因为它意味着多个作业可以在同一台计算机上同时运行,而不会干扰其他作业的内存。
随着这个概念的出现,出现了从一个分区运行读卡器、从另一个分区运行数值计算、从第三个分区运行输出到打印机的想法,消除了类似 1401 的卫星计算机,并减少了磁带由于安装应力造成的磨损。虽然第三代设备非常适合大型运行,但它们本质上仍然是批处理系统,随着程序变得越来越复杂,管理程序的卡片堆栈变得笨拙。这为分时系统铺平了道路,在分时系统中,每个用户都有自己的终端,并且他们共享一个中央主机。
直到第三代后期,用于保护机制的硬件开始普及后,分时系统才变得流行。当时,人们开始研究计算效用这一概念,即一个单一主机将为整个波士顿地区提供分时机会。从这个概念中诞生了第一个第四代操作系统 MULTICS。当然,这个想法是基于小规模集成,以及 LSI 然后是 VLSI(超大规模集成)的发展最终用小型台式机取代了整个房间的计算机。由于 LSI(大规模集成)的发展,在单架机架上构建整个计算机系统成为可能。这些小型计算机开始与 IBM 在小型企业中竞争,并且由于它们的融资条款不像 IBM 那样严格,因此它们有竞争力,取代了小型和中型 System360 组件。到了 80 年代,人们发现分时系统使用小型计算机作为前端来处理终端多路复用,并以主机作为主要的计算机制,这并不奇怪。
在 1970 年代,Ken Thompson 设计了 UNIX,它是基于 PDP-7 小型机的 MULTICS 的一个简化的单用户版本。由于他发布了源代码,它成为一个流行的操作系统,被大学和小型企业广泛使用。到了 1990 年代,它已经如此流行,以至于第三方为它编写的软件比当时拥有其许可证的 ATT 公司编写的软件还要多。ATT 与大学之间关于谁拥有 Unix V5 中新软件权利的法律纠纷导致了两件事:将操作系统出售给 SCO 和 Linus Torvalds 开发了一个替代内核,它可以运行当时由大学制作的公共领域软件,因为它符合 IEEE 开发的 POSIX 标准。
正是对操作系统内核的这种对抗性重写,催生了推动互联网革命的开源软件运动。如今,大多数操作系统都从开源软件运动中获益,因为它们的互联网软件的复杂性依赖于通过自由软件开创和传播的想法。
在今天的大多数情况下,操作系统最好定义为操作系统安装 CD 或 DVD 上提供的软件。这个定义对用户和操作系统供应商来说都很好用。它甚至在法庭上被争论过。
现在,操作系统的定义可能看起来像这样
- 一个系统
- 一组原则和概念以及所有服从这些原则的组件。
- 操作系统
- 一个软件系统,它管理系统的硬件资源,为用户提供一个基础来满足他们的程序计算需求。
程序化是指软件主要由程序使用,而不是由用户直接交互使用。
例如,C++ 不是 操作系统,因为它无法提供许多关键的计算功能。如果没有程序执行、进程调度以及系统软件为 C++ 提供的许多其他功能,C++ 就无法在裸硬件上运行。相反,Basic、Lisp、Smalltalk 和 Java 有时可以被认为是操作系统。虽然它们通常运行在其他操作系统之上,但有时它们直接运行在特殊的硬件之上。
谈到原则,例如 UNIX 的原则就是“一切皆文件,通过描述符引用”和“程序充当过滤器”。所有遵循这些原则的小程序和实用程序都是操作系统不可或缺的一部分,而 X Window System 则不遵循这些原则,因此它不是操作系统。
相比之下,Plan 9 是 Unix 的衍生系统,其原则为“一切皆文件系统”,并且 Plan 9 中的操作系统功能比 Unix 多得多。特别是,Plan 9 的窗口系统是操作系统不可或缺的一部分。
虽然操作系统是一套原则及其遵循这些原则的软件,但通常情况下,操作系统的一部分不遵循这些原则。当原则表达不清或不足时,就会出现这种情况。
在 Unix 和 Plan 9 的情况下,进程既不是文件流也不是文件系统。例如,不可能通过复制来复制一个进程。因此,我们看到“一切皆文件流/文件系统”的原则是不够的。请注意,即使某些东西是过滤器,也不妨碍它成为文件流;文件流的概念只是不够完善。
原则不足的结果是开发过程随机进行,遵循阻力最小的路径。这种开发的结果根本无法用任何设计原则来描述,并且已经废除了系统开始时遵循的任何原则。这解释了现代 Unix 和 C++。这些系统之所以被认为是凝聚的,仅仅是因为它们的不连贯性与其他系统截然不同。
出于学术目的,测试两个操作系统之间差异的一个好方法是软件移植的难易程度。如果两个操作系统使得从一个操作系统移植软件到另一个操作系统变得困难,因为概念不同,那么这两个操作系统就相对不相似。另一方面,如果两个平台使得不需要任何努力就可以从一个平台“移植”到另一个平台,那么这两个平台就相对相似。由于存在法律原因,我们不能将两个由不同制造商生产的不同产品称为同一个产品,因此我们称它们为兼容。
通常,两个兼容的系统之所以兼容,是因为它们遵循一个称为标准的单一协议。像 IEEE 和 ISO 这样的组织发布这些标准,不同的公司可以根据标准构建自己的项目,即使它们在较低级别拥有专有元素。例如,Linux 和 Unix 共享 IEEE POSIX 标准,因此它们在该标准定义的接口级别上是兼容的。
根据这种定义,许多常见的操作系统可以归为一类,并被认为是相似或兼容的。OS/2 和 Windows 是相似的。UNIX 和 BSD 是相似的,Linux 是兼容的。
两个不同操作系统之间的最小距离可能是 Plan 9 和 Unix 之间的距离。尽管它们存在差异,但它们都是由同一个人创建的,旨在实现相同的目标。尽管 Unix 和 Plan 9 之间存在时间间隔,但很明显,设计人员认为许多 UNIX 设计决策仍然有效。这一切都表明,Plan 9 和 Unix 是两个操作系统之间可以达到的最接近的距离,同时仍然保持不同。
请注意,这种测试操作系统区别性的方法在生物学中也有类似的应用,用于确定物种的区别性。生物学认为,当物种无法再自由交配时,它们就是不同的物种。就我们而言,当操作系统无法再自由共享代码时,它们就是不同的操作系统。