本篇开始,将介绍操做系统相关知识,这一部分的知识涵盖操做系统通识到具体的平台。和本系列前面全部文章同样,力求精简但有所突破。 程序员
若是已经阅读过前面的文章,那么应该对计算机硬件执行计算的概念有所了解,这里作一下简单回顾,也是做为操做系统必要性的基础。
计算机硬件主要能够分为以下四大部分: 算法
那么典型的计算过程是: 编程
看起来也没什么问题,程序员应该有能力独立完成上述步骤,顺利调用CPU进行计算。但有一个问题要先引发重视,那就是总线的使用时机。 架构
图中能够看出,总线分为地址总线、数据总线、控制总线三种,这里不去讨论分类的细节,毕竟从名称上所能观察到的含义足够使用。思考的问题是,为何总线要分类? 编辑器
总线之因此要分类,首先是由于总线总数有限,就是说从硬件层面,不能将每两个可能发生通讯的组件之间所有用总线相连。既然不能造成点对点专线,而组件之间又确实有通讯的需求,那就只能采起一个办法,共用总线。 工具
共用总线是好事,毕竟远离CPU的线缆大部分时候都是处于空闲状态的,假如可以共享硬件总线,不管是从经济仍是电路设计的角度来说,都是一件节约成本的事。简单的共用无非就是你们约定俗成,分时段使用,不过这样一点也不高效,毕竟使不使用总线要看任务描述中的指令顺序,要看指令的操做对象是数据、地址仍是须要控制。为了更加高效地利用线缆,那么必定须要一个相似总线控制的单元。该单元管理并维护着全部总线的使用,拥有调度的能力,这样才可以及时填补空档,并有效响应其余组件使用总线的需求。 操作系统
到了这里,就天然明白总线为何要分类了。分类是为了更好地管理总线,不只要分,最好是能进一步细分,分类越细,越能在调度时提供更多信息支持,越能物尽其用。 翻译
说了这么些关于总线使用的问题,主要是引出一个概念:硬件资源独占时,能够随意使用,但带来问题是使用率低,不经济。若是要共享,就必须有所谓的控制单元,创建规则,进行管理。不然各个用户不只没法正常完成本身的计算任务,并且还颇有可能干扰其余人的计算需求。 设计
如上所述,当须要共享某一硬件资源来达到提升利用率并同时保持良好响应的目标时,就须要有控制单元进行管理。对于计算机硬件总体而言,如独占使用,每次只运行一个计算任务,那么只要在总线这一层实现控制便可。然而若是要运行多个计算任务,或是多个用户共享使用,那就须要一个控制单元来完成管理、调度的功能。而在计算机系统中,这个单元就叫作操做系统。 3d
那么不言而喻,操做系统最根本的工做是进行资源管理,确保计算任务能够正确执行。固然任何管理老是有管理理念的差别存在,对应的也就是操做系统调度算法各有侧重。对比操做系统发展史,主要有以下两个方向:
这两个方向有各自相违背的点,由于所谓的低响应时长,就表明着必须可以中断执行中的任务,而每次中断,实质上,对于单个任务来说,都是延长了总执行时长的因素。不过若是能所以服务于更多用户、更多计算任务,甚至更好地将使用到不一样组件的任务同时执行,一点点中断开销仍是值得的。
道理讲到这里,也不能免俗,须要为操做系统下一个定义。操做系统是一种系统软件,它管理计算机硬件和软件资源,并向计算机应用程序提供通用服务。
换成图示的话,它在整个计算任务中的位置以下所示:
貌似前文中咱们只讲到操做系统是管理计算机硬件的,但这里的定义中还出现了软件资源,那么这些软件资源指的又是什么?
咱们知道,所谓软件、应用程序这些名词表明的无非是计算任务描述,它从根本上是由CPU ISA中指令加上操做对象有序组合而成。既然核心元素是CPU ISA,而各厂家CPU又有所不一样,那么编写程序时,必定须要根据具体ISA去编写。这就带来一个问题,每一个软件想要运行在某一CPU上,先要找到手册,逐字逐句进行翻译(指令映射),才能运行。但这些工做其实都是机械重复且低效的,也就意味着要重复地投入大量人力物力来完成这个步骤,然而有一个设备很擅长干这种脏活累活,那就是计算机。若是咱们能够将指令映射的步骤自动化,读取CPU ISA手册,自动映射,就无需再手动处理。而这个过程,就是编译器的雏形。
因此软件资源指的是一些基础功能资源,提供一些基础功能,以供编写计算任务描述时使用,简化任务描述的编写时间。而也是由于这些基础软件资源,对底层硬件(如CPU)进行了封装(wrap),才使得操做系统能够提供通用服务。
因为我的没法给出准肯定义,而又不能误人误己,只能选择翻译大牛书籍,书籍名称为《Operating Systems Internals and Design Principles》 2.1.1小节内容。
一般,一个完整的操做系统须要提供如下几个方面的服务:
程序开发
操做系统提供各式各样的工具和服务,如编辑器、调试器,用于帮助程序员开发程序。这些工具按照封装程度能够进一步划分为如下两种:
Instruction Set Architecture
指令系统体系结构ISA,定义了操做系统使用的机器语言指令系统。事实上,应用程序和操做系统都可以直接访问ISA。
Applicaiton Binary Interface
应用程序二进制接口ABI,定义了操做系统的系统调用接口,以及在系统中经过ISA可以使用的硬件资源和服务。每一个操做系统或平台会选择使用一种二进制格式做为可执行格式,同一程序如需在不一样操做系统上实现可移植,就必须在ABI层进行适配。
Application Programming Interface
应用程序编程接口API,API封装了操做系统所提供的硬件资源和服务,使用API能够下降应用程序复杂度,移植时,也能够直接在API层进行映射。
程序运行
程序运行须要不少步骤,包括加载指令和数据、初始化I/O设备和文件,以及其余相关资源。有了操做系统,程序员只要在编写程序是遵循所提供接口便可,而无需关心执行所需的具体细节。
I/O设备访问
一样的,操做系统中可能会同时运行多个程序,程序之间对I/O设备的访问须要管理以便顺利协做。操做系统封装I/O设备的硬件细节,为程序提供统一接口,同时也管理、维护I/O设备使用状况以便调度。
文件访问控制
文件从操做系统的角度来看,是I/O设备磁盘上的一种对象。经过对象的抽象,将一组二进制值约束为文件内容,同时经过额外的二进制值来表明各类访问属性。因此文件实际上能够成为磁盘类I/O设备的访问单元,所以,对于I/O设备自己的管理天然包括了内部全部文件状况的维护。
系统访问
操做系统管理资源,也维护这大量有关资源的信息。这些信息的访问必须有所保护,不然一旦被恶意修改,轻则系统信息错误,重则直接崩溃。同时,对于同一资源的访问,系统层也应当进行调度,以保证相互间互不冲突。
错误检测和响应
计算机硬件终归是电气电路组成的,电气电路在使用环境、寿命等因素的影响下,会出现潜在错误。同时,软件编写中也可能引入错误,如除零。操做系统会对这些潜在错误进行检测,并尝试修复。如没法修复,则提示用户或最终关机。
统计信息
对于全部资源的管理调度,须要基于对应的维护信息,只有在各相关组件间共享这些内容,才能更加精确地达成提升CPU利用率或更低响应时长的目标。
单内核中全部服务如文件系统、存储管理等都由多个运行在内核态(Kernel Mode)的模块来完成。虽然每一个模块单独服务,但因为高度集成,一旦某一模块产生bug,则会使整个内核崩溃。不过一样由于集成度高,全部操做位于同一地址空间内,控制代码的运行效率会更高。
传统UNIX、DOS以及早期的Mac OS系统均采用单内核形式。
微内核的原则是将服务的实现和基础操做分离,如某些功能能够经过运行在微内核以外的服务组件来提供。对比单内核,一个模块的错误并不会引发整个内核的崩溃,并且服务的扩展也更加便捷。固然微内核在效率上就略有劣势。
下图是Windows和Linux操做系统结构图,感兴趣的话能够先有个概念,具体讨论将放在后续文章中。
本篇定位于介绍操做系统的由来、必要性、所提供的服务,以及服务组织形式。掌握了这些概念,就应该要朝着提升CPU使用率、下降响应时长的目标去,进一步了解内部具体实现原理,而这些,均会在接下来几篇中慢慢道来。