操作系统的作用: 操作系统对软硬件进行合理的管理,以达到为上层用户提供良好的,稳定的,安全的运行环境的目的!
我们知道一台电脑是由CPU、输入和输出设备组成的(具体请看该篇博客冯诺依曼体系结构),那如何使这些硬件稳定的工作,为用户提高服务呢?这就需要一个软件来管理这些硬件,这个软件就是操作系统,接下来我们就来看一下操作系统如何管理这些硬件与操作系统的发展史。(注意:本文内容有点干)
操作系统是管理计算机硬件和软件资源的计算机程序,会对计算机管理硬件、驱动硬件;管理软件;资源分配与回收。操作系统也提供一个让用户与系统交互的操作页面。
我们买的电脑就是硬件,在电脑开机的时候就是在加载操作系统。
- 操作系统就是一个做管理的软件
- 它对软硬件进行合理的管理(手段),以达到为上层用户提供良好的,稳定的,安全的运行环境的目的(目的)!
而我们笼统的理解操作系统,它主要是由以下两部分组成
- 内核(进程管理,内存管理、文件管理、驱动管理)
- 其他程序(例如函数库,shell程序等等)
我们想要了解操作系统到底是用来干嘛的就不得不说一下计算机的软件体系结构。
计算机系统软件体系结构采用一种层的结构,有这样一句名言:
“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”
如上图,这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。
如上图,我们要让计算机运行那每个层次之间都必须要相互通信,既然需要通信就必须有一个通信的协议,我们一般称为接口。
- 接口下面那层是接口的提供者,由它定义接口。
- 接口上面那层是接口的使用者,它使用该接口来实现所需的功能。
在层次体系中,接口是被精心设计过的,尽可能的保持稳定不变。
体系结构中除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面的那层的包装和扩展。正是这些中间层的存在,使得应用程序和硬件之间保持相对的独立。
虚拟机技术就是在硬件和操作系统之间增加了一层虚拟层,使得一个计算机上可以同时运行多个操作系统,这也是层次结构带来的好处,在尽可能少的改变甚至不改变其他层的情况下,新增加一个层次就可以提供前所未有的功能。
体系结构中位于最上层的是应用程序和开发工具,它们属于同一层,因为它们使用同一个接口,那就是操作系统的应用程序编程接口(API)。应用程序接口的提供者是运行库,不同操作系统的运行库提供不同的API。
运行库使用操作系统提供的系统调用接口,系统调用接口在实现中往往以软件中断的方式提供,而不同的操作系统提供的中断号也不相同。
操作系统内核层对于硬件层来说是硬件接口的使用者,而硬件是接口的定义者,硬件的接口定义决定了操作系统内核,就是驱动程序如何操作硬件,如何与硬件通信。这种接口往往被叫做硬件规格,硬件规格由生产硬件厂商负责,操作系统和驱动程序开发者通过阅读文档来编写操作系统和驱动程序。
我们已经知道了各层接口的存在,而在开发的角度,操作系统对外会表现为一个整体,但是会暴漏自己的部分接口,供上层开发使用,这部分是由操作系统提供的接口,叫做系统调用。这即帮助我们完成了需要的功能,又保护了操作系统本身。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利与更上层用户或者开发者进行二次开发。例如:图形化界面,shell和工具集。
printf
显示的设备是硬件,而向硬件写入的就是通过操作系统进行软硬件资源管理。printf 就是 C 语言通过包含头文件,而它的底层就调用了系统调用接口。同时我们需注意,上面已经讲了,不同平台它的硬件不同,给出的接口不同,所以使用系统调用的程序,不具备跨平台的能力,因为不同的接口属于不同的系统。
操作系统的一个功能是提供抽象的接口,另外一个主要功能是管理硬件资源。
计算机硬件的能力是有限的,一个计算机的内存大小,CPU执行指令的速度都是一定的,那我们该如何合理的应用这些资源?
一个计算机的主要资源为CPU、存储器(内存和磁盘)、I/O设备,我们从合理利用资源这一角度更深层的探索操作系统的作用。
接下来我们看一下,不同时期的操作系统是怎样工作的:
计算机发展早期,人们编写了一个监控程序,当某个程序暂时无需使用CPU时,监控程序就把另外的正在等待CPU资源的程序启动,使得CPU能够充分地利用起来。这就被称为多道程序。
优点:
缺点:
经过稍加改进,每个程序运行一段时间以后都会主动让出CPU给其他的程序,使得一段时间内每个程序都有机会运行一小段时间。
在Windows 3.1中,程序调用Yield、GetMessage或PeekMessage这几个系统调用时,Windows 3.1操作系统会判断是否有其他程序正在等待CPU,如果有,则可能暂停执行当前的程序,把CPU让给其他程序。
如果一个程序在进行一个很耗时的计算,一直霸占着CPU不放,那么操作系统也没有什么办法,其他程序都只有等着,整个系统就和死机了一样。比如一个程序进入一个while(1)的死循环,那么整个系统都停止了。
操作系统接管所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的应用程序都以进程的方式运行在比操作系统权限更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。CPU由操作系统统一分配,每个进程根据进程优先级的高低都有机会得到CPU。但是运行一段时间,操作系统就会暂停该进程,将CPU资源分配给其他等待运行的进程。这种CPU分配方式即称为抢占式,操作系统可以强制剥夺CPU资源并分配给它认为目前最需要的进程。
目前几乎所有现代操作系统都采用这种方式。
操作系统作为硬件层的上层,它是对硬件的管理和抽象。对于操作系统上面的运行库和应用程序来说,它们希望看到一个统一的硬件访问模式。作为应用程序的开发者,我们不希望再开发应用时直接读写硬件端口、处理硬件中断等这些繁琐的事情。
当成熟的操作系统出现以后,硬件逐渐被抽象成了一系列概念。在Windows系统中,图形硬件被抽象成了GDI,声音和多媒体设备被抽象成了DirectX对象;磁盘被抽象成了普通文件系统,等等。程序员逐渐从硬件细节中解放出来,可以更多地关注应用程序本身的开发。这些繁琐的硬件细节全都交给了操作系统,具体地讲是操作系统中的硬件驱动程序来完成。
驱动程序可以看作是操作系统的一部分,它往往跟操作系统内核一起运行在特权级,但它又与操作系统内核之间有一定的独立性,是得驱动程序有较好得灵活性。
因为PC(个人电脑)得硬件种类非常多,操作系统开发者不可能每个硬件开发一个驱动程序,这个工作通常由硬件生产厂商完成。操作系统开发者为硬件厂商提供一系列接口和框架,凡是按照这个接口和框架开发得驱动程序都可以在该操作系统上使用。
这里我们以一个读取文件为例,来看一下操作系统和驱动程序在整个过程中扮演什么样得角色。
更具上面的内容,和文章前提到的冯诺依曼体系结构该篇博客的知识,我们就可以推理出一个程序在计算机中完整的简陋的运行过程。
我们给计算机通过输入设备下达一道命令,如打开一款软件、新建一个文件夹,操作系统就会调用接收这道命令,调用相对应的硬件,先将对应的程序存储到内存,以进程的优先级排队等待操作系统操作CPU执行该命令,最后将结果返回内存,由内存传输给输出设备。这一切都在操作系统的指导下有序进行。
所以我们在开头就说了,操作系统的作用就是合理的管理计算机的软硬件,使其为上层用户提供良好、稳定、安全的运行环境。
被一句话激励:舞台再大,你不上台,永远是个观众,平台再好,你不参与,永远是个局外人,能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑的累不累,摔得痛不痛,他们只想知道你最后站在什么位置,然后羡慕或鄙夷。