什么是操作系统
广义的操作系统可以是很多东西,例如:微信、浏览器、一个组织、Hadoop、K8s云原生操作系统等等,这些抽象度比高的话,都可以认为是操作系统。广义上的操作系统是没有严格定义的。但是作为程序员大部分使用的都是Linux
这些系统,管理硬件资源的,为上层软件提供服务,为我们编写的软件提供服务的是软件。
为什么要有操作系统
上面说了广义上的操作系统是为某项东西服务的,本身就是一个服务类型的软件,所有我个人认为操作解决的问题就是高度抽象一些东西,然后提供一些基础的服务的软件。例如:Windows、Linux这些都是为了上层用户能更好操作计算机硬件,如果计算机光有硬件是没有用的,也就是一堆没有组织化管理的硬件的设备,操作系统要解决的问题就是要把这些设备组织管理起来然后提供同意的访问和服务接口,还有更友好的界面图形化出来界面。
现在操作系统要解决最大的问题就是平台差异性,现在计算机硬件都是有很多厂商生产的,例如:联想、惠普、华硕、Acer这些PC厂商。CPU架构也有不同厂商生产的,然后问题来了?怎么把这些硬件组织管理起来,交给操作系统了,现在操作系统要解决的就是平台差异性,如何适配这些不同硬件,然后抽象一层服务给上层其他软件使用。
如果大家熟悉Java语言的话,Java的JDK里面的JRE,也就是Java运行时里面的就一个缩小的HotSpot
虚拟机,虚拟机要解决的问题也是屏蔽底层硬件的差异化,然后Java编译出来的字节码可以在不同的平台上运行。还有2010年时候出来的把浏览器内核V8移除出来的NodeJS也做的JS运行时,也是为了解决JS在不同的平台上运行执行代码方案。
综上所述,操作系统概念不止指的就是现在我们所说的非要是Linux和Windows这样的软件,操作系统非常广泛,大部分的场景就是为了统一一个标准,然后为上层的应用提供服务。对应程序而言操作系统就是要对外提供syscall
指令的底层软件,而程序等于状态机的状态变换。
现在操作系统
现在操作系统总结一句话就是:管理软件的软件,能控制底层硬件设备,抽象硬件设备为上层软件提供服务的软件。 现在操作系统一般Linux
和Windows
这些都是管理计算机硬件为用户态的软件提供服务的软件,可以让上层软件更好使用到底层的硬件资源,当如果上层应用出现问题的时候还能协助上层应用处理发生的问题,这就是现在操作系统要做的事情。
服务对象是谁?为谁提供服务?如何服务?如何处理请求?如何管理需要管理的资源?这些都是操作系统要解决的问题。现在计算机操作系统种类有很多可以看看这篇文章:https://data-flair.training/blogs/types-of-operating-systems/
现在操作系统分类也很多,例如:移动端操作系统、PC端操作系统、实时操作系统、分时系统、物联网操作系统这些都是根据不同应用场景进行划分的操作系统;还可以从操作系统的实现架构来分类,例如:宏内核系统、微内核系统、多内核系统等,从具体架构设计和与实现来分类。
操作系统发展阶段
现在操作系统有多个发展阶段,1946年左右的的ENIAC
计算机都是单任务执行的,还没有操作系统的概念,把一段程序载入到计算机里面,然后运行,这就是整个程序运行过程。
一张卡片代表一行程式,也就是在程序需要在一张卡片上进行编程,一行代码的长度几乎不会超过80个字符的限制。在那时,程序存储在卡片上,然后结果输出到卡片上存储起来。
相关链接:http://rust-class.org/tag/multics.html
当时要运行一个程序,计算机管理员需要收集这些卡片,如何把卡片输入到计算机里面,卡片队列,但是如果卡片上有错误,那么整个计算机就出现了问题,这也是当时的问题缺陷。
另外现在操作系统另外一个主要的功能就是要管理用户态上的其他软件,上面我说到了卡片程序,如果卡片程序有问题,那么整个计算机就会出现问题,需要重起来解决。如果程序是一个死循环,或者有严重bug,程序可以执行陷入指令交给操作系统来处理这些程序异常。
时间到1964的时候计算机就发生变化,成一个数据中心一样,一台计算机要给一个学校服务,那么学校有多个系:物理系、数学系、计算机系,那么如何让一台计算机分配给多个组织使用呢?这时候的计算机的设计就要考虑到分时操作系统了,能把每个程序能充分分配到不同用户使用,对应的就是Multics
多任务分时操作系统,来处理多任务之间切换和调度工作。还提出了通过管道的方式来共享数据和消息交换,这个设计在当时提出来之后,影响不少后面的系统设计,例如CSP
并发模型。
多处理器系统架构,早期的电脑机器处理器都是单核的,也就是和卡片程序一样的,输入进去就串行执行,并不是并发执行的程序。随着时间发展计算机变成多核处理器架构,那使得操作系统也要支持多个核心执行程序,也就是多线程的支持,下图就是一个单核处理器和多核处理器系统调度过程:
多任务分时操作系统也是现在计算机操作系统的开山鼻祖,现在操作系统要解决的怎么在一段时间内存运行多个程序,如何管理如何调度这些程序。现在Linux多用户远程登录作业系统,个人感觉就是受到这些历史原因的影响。
再往后就是图形化系统了,早期的计算机系统可能就是一个系统内核提供一个shell
让用户输入命令来操作电脑,这对于专业用户来说使用没有问题,如果对应一些非专业用户还是有上手难度的。后面就出来了图形操作系统,苹果和微软公司都是受Xerox Alto
公司的产品启发,然后产生图形化计算机界面灵感,影响实至到现在的计算机操作系统。
下面是操作系统发展和关系图,里面包含各个操作系统内核版本关系,看到了这个图,也会跟随者计算机发展历史来的:
商业化操作系统和闭源操作系统的关系:
现在大多数操作系统都是基于Linux
内核的,如果真的没有kernel 那真的各大公司都开始基于现有的系统继续造轮子了,就像罗永浩为openBSD捐款,支持它发展,然后基于它去做新的系统研发,下图基于Linux派系的操作系统:
现在操作系统架构
现在计算机操作系统很大程度是伴随着时代发展而变化的,例如多核处理器,还有现在智能汽车的普及,操作系统要接入的传感器设备越来越多,这就给现在操作系统设计带来新的挑战,目前PC是主流的操作系统还是Windows和Linux还有MacOS。但是如果想支持更多物联网设备我觉得未来微内核操作系统是一个发展方向,核心操作系统模块只提供主题的功能,而其他模块则以插件的形式提供,这样就可以做到可扩充可插拔形式。
还有现在计算机对图形计算例如GPU,多CPU架构,也会带来操作系统适配的问题,操作系统要支持多核心的计算,新型指令架构ARM架构软件适配。现在操作系统的几种结构类型如下:
- 宏内核架构
- 微内核架构
- 多内核和外内核架构
宏内核架构: 主内核系统提供硬件资源的抽象和管理,然后就是应用服务框架,应用服务框架提供一些基础的系统服务,框架的作用就主要提供一些API编程接口和一些依赖代码库。如果没有系统框架提供的API,那么上层用户去实现一些功能就要写很多的代码,并且一些代码不能复用的。POSIX接口就是为统一应用程序在不同操作系统正常运行所制定的标准,除了POSIX接口还要一些在此接口之上包装的接口叫领域特定接口,方便给汽车这些传感器开发使用的。一部分还设计了ABI接口也就是二进制数据文件交换接口,如何定义二进制文件格式等等;例如下图的Android
系统架构:
微内核架构: 大部分操作系统功能和服务运行在用户态,而不是宏内核那样直接全部运行在内核态,微内核架构和现在的服务器端微服务架构相似;核心运行时模块也就是核心系统模块,另外就是插件模块,核心模块负责整个系统核心功能实现并且负责其他模块之间互相通讯工作,插件模块就负责一些功能增强的模块,插件模块由核心模块负责管理,这些常见的设计模式应用有例如Eclipse
插件模块和VSCode
模块,如下图:
微内核和宏内核架构差异:二者差异很明显就是一个是高度模块化可以定制模块的架构,一个是把核心的功能实现全部放在内核态完成的。宏内核架构内存管理,进程调度,文件管理这些全部在内核态下的。随着时间发展内核功能需求越多那么内核实现功能就越多并且实现的功能可能出现bug,如果在运行中出现了bug会影响到整个内核导致整个系统不可以正常运行的情况。微内核的好处可以选择性将那些功能放在内核态实现和那些放到用户态去实现,还能挂载其他的模块,也是以后操作系统的发展方向。缺点也很明显:如果应用程序要处理文件,程序会跨进程通讯,然后在去请求内核复杂,这样会导致整个状态切换次数变多;
其他架构:此外就是外内核系统类似于一个内核库,然后程序可以复用这个;多内核是一种新的概念,多个内核系统组成的系统,也可以看做是一个分布式操作系统。
小 结
看完整个操作系统概述和具体架构设计实现方案的不同,可以总结出来操作系统的设计可以用万能分治法来设计,模块化设计,现在很多的第三方编辑器软件也是这样设计的,微服务也是这样的设计的,具体的服务实现和语言无关通过rpc来互相调用访问即可,本文是笔者对操作系统目前的认知和针对已有知识广度的总结。