任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。
笼统的理解,操作系统包括:
简单来说,操作系统是一款搞管理的软件,它对下要管理好软硬件资源,对上要提供良好的、稳定的、完全的,软件服务。
进言之,在整个计算机软硬件架构中,操作系统的定位是:一款纯正的 “搞管理” 的软件。
管理的本质:不是对 被管理对象 进行直接管理,而是只要拿到 被管理对象的所有的相关数据。我们对数据的管理,就可以体现对人的管理。
下面我通过一个例子来说明,什么叫管理!
在学校里,有这样的三种角色:校长、辅导员、学生。那么很明显,校长是管理者,而学生是被管理的对象,那么辅导员是什么角色呢?
校长作为管理者来管理学生,校长实际上就是那个做决策的人,但是校长作出决策后并不需要自己来执行,而是让辅导员去执行,所以辅导员的主要任务就是执行管理者的决策,我们通常将其称为执行者。
但是,校长连我的面都见不到,他如何来管理我呢?
那么仔细想一下,管理你需要做到和你见面吗?你在学校除了开学典礼和毕业典礼,平时会见到校长来你班级对你进行管理吗?
其实很简单,假设现在校长要求计算机科学与技术专业的辅导员将该专业综合成绩靠前 10 名同学的资料拿给他,他从这 10 名同学中选出最优秀的 3 名学生去参加 ACM 大赛,当辅导员将资料拿来后,校长选出 3 名学生说:“就这三个了,你找个老师对这三名学生进行一下强化训练,然后参加本次的 ACM 大赛”。然后校长就什么也不管了。
你可以发现,在整个过程中,校长根本没见过这 3 名同学,就对其进行了管理,他根据的是什么?没错,他根据的是数据。
实际上,学校将我们每个学生的各种信息都进行了管理,基本信息、成绩信息以及健康信息等等。
像这样抽取所有同学的属性,描述对应的同学。这么一套信息在 C 语言当中我们称之为结构体,而在 C++ 当中又叫做面向对象。
当学生的数量多起来了,校长就可以将全部学生的信息组织起来,当然组织的方式有很多种(链表、顺序表、树),而每种组织方式都有其自己的优势,这里我们假设校长以双链表的形式将学生的信息组织起来。
此时校长对各个学生的管理,实际上就变成了对这个双链表的增删查改。当有新生时直接向该双链表加入一个结点,当学生毕业后直接将学生信息从该双链表当中移除即可。
所以,管理的本质就是对数据做管理,那么对数据的管理就是对某种数据结构的管理!
我们主要分为硬件部分、系统软件部分、用户部分。
我们看得见的,就是计算机底层的硬件。
这些硬件看似是一个个罗列出来的,但实际在底层都遵守冯诺依曼的组织形式。
如果只有这些硬件是不够的,还需要有一个软件来对这些硬件进行管理。
例如,内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?是按行刷新还是全刷新?这些都是由软件进行管理的,而这个软件就是操作系统(Operator System)。
操作系统主要进行以下四项管理:
操作系统的核心工作就是去做管理,管理的重要理念就是:先描述,再组织!
请问操作系统可以直接和底层硬件打交道吗?
举个例子,如果操作系统自己来完成键盘的读取操作,那么只要你的键盘读取方式进行了改变,那么操作系统的内核源代码就需要进行重新编译,这对操作系统来说维护成本太高了。
于是我们又在操作系统与底层硬件之间增加了一层驱动层,驱动层的主要工作就是单独去控制底层硬件的。例如,键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。
驱动简单来说就是去访问某个硬件,访问这个硬件的读、写以及硬件当前的状态等等,驱动层就是直接和硬件打交道的。而驱动一般是由硬件制造厂商提供的,或是由操作系统相关的模块进行开发的(例如网卡)。
此时操作系统就只需关心何时读取数据,而不用关心数据是如何读取的了,也就是完成了操作系统与硬件之间的解耦。
操作系统再往上就是我们所处的位置,在这里我们就可以用命令行或是图形化界面进行各种操作,这一层被称为用户部分。
操作系统为了保护自己,对上只暴露了一些接口,而不会让用户直接访问操作系统,这一系列接口被称为系统调用接口。
那么为什么要提供这些系统接口呢?
相信大家都去过银行吧,银行并不相信任何人,所以把银行的整个系统是用对应的玻璃全部隔开,只给大家开个小窗口,用来办理业务!
操作系统也是一样,并不相信任何的用户,它不会将自己所有的数据结构、所有的结构体、所有的代码、所有的数据全部暴露给用户,是为了防止用户恶意或者误操作,修改了操作系统中的代码,从而影响了操作系统的稳定性!
所以操作系统对外提供的所有服务是以系统调用的方式,对外提供的操作系统方面的接口!
但这些系统调用接口对我们普通用户来说使用成本又太高了,因为要使用系统调用前提条件是你得对系统有一定了解,所以在系统调用接口之上又构建出了一批库,例如 libc 和 ibc++。
实际上在语言级别上使用的各种库,就是封装了系统调用接口的,我们就是通过调用这些库当中的各种函数(例如 printf 和 scanf)进行各种程序的编写。
计算机管理硬件:
系统调用和库函数概念: