前言:本节主要讲解内核也就是操作系统对于硬件的管理, 本节内容同样为进程的周边知识。 主要是关于软件方面, 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章, 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但不能说本篇文章内容不重要, 本篇文章内容不管是对于理解整个计算机世界, 还是接下来理解进程, 都有重要的作用。
ps:本节内容适合了解一些冯诺依曼体系的友友进行观看。
目录
操作系统的概念
什么是操作系统的管理
为什么要进行管理
如何进行软硬件管理
库函数
操作系统的概念
内核:内核主要进行进程管理、内存管理、驱动管理、文件管理
其他程序: 例如语言库、 shell外壳。
这些合起来叫做宏观的操作系统。 (内核加上操作系统配套的软件)
狭义上就是内核。
什么是操作系统的管理
在我们的电脑上, 我们应用qq和微信, 或者游戏等软件。那么请问, qq或者微信, 为什么能够被打开, 为什么操作系统要跑qq或者微信。这个是由操作系统控制的。
为了能够更好的使用冯诺依曼结构, 更好地统筹里面的硬件, 必须要有人对硬件或者软件进行统筹, 而操作系统就是跟这个的。
所以, 由上面两段论述就可以说——操作系统是一款进行管理的软件!操作系统管理硬件, 软件。 为什么能够管理软硬件, 因为操作系统的下层就是驱动器, 是软件, 而驱动器的下层就是硬件。 所以, 操作系统向下管理, 本质上就是管理软硬件。
为什么要进行管理
计算机的层状结构, 是由上图的层状结构构成的。
最底层的就是上层的底层硬件, 这些硬件是根据冯诺依曼体系结构, 由总线串连起来的。 这些硬件之所以能够被软件去访问, 都是因为这些硬件上面有一层驱动器——这些驱动器也是软件。
这些驱动器是和硬件打交道的一些软件。 他们能够让硬件动起来, 至于如何动, 需要让更上层的驱动器提出需求。
所以, 那么为什么要有操作系统?
我们可以思考这个问题:如果我们买完笔记本回来没有操作系统, 那么就只有一堆硬件,用户根本没有办法使用计算机。
所以第一个理由——操作系统帮助用户管理好下层软硬件资源。
如果一个电脑, 经常用着用着就蓝屏, 如果这个电脑的信息容易被盗取, 或者游戏玩着非常卡。 那么很显然, 这样的操作系统用户就不愿意用, 要知道, 计算机是一个工具, 他是为了给用户提供服务的。 所以, 操作系统就是要给用户提供良好的(稳定, 高效, 安全)的运行环境。
所以, 即: 操作系统通过管理软硬件资源——手段
为用户提供良好的运行环境——目的(这里的用户可以是普通用户, 也可以是程序员)
那么再来考虑另一个问题: 操作系统里面会有各种数据, 可是, 操作系统不相信任何用户!这是因为操作系统为了保证自己的数据安全, 为了保证给用户提供服务, 操作系统以接口的方式给用户提供调用的入口, 来获取操作系统内部的数据。 也就是说, 如果用户想要获取系统内部的数据, 就要使用相关的系统接口访问操作系统内部的数据。
接口是操作系统提供的用c实现的, 自己内部的函数调用——系统调用。
所有的访问操作系统的行为, 都只能通过系统调用完成!
系统调用可以对用户提供的参数进行审核, 又因为系统接口是操作系统内部的接口, 所以不存在恶意修改的问题, 所以操作系统就在既保证自己安全的情况下, 又为上层提供服务, 有了这些系统调用接口, 就有人在这些系统调用接口上, 实现各种各样的软件了。
任何一门语言, 在访问底层硬件的时候, 都要经过操作系统, 都要经过系统调用。
操作系统是世界上少有不变的东西, 语言可以变, 但是操作系统永远不变。 我们把这种基于系统接口之上的开发, 叫做系统编程。
如何进行软硬件管理
我们想这么一个例子, 就比如在大学中, 有校长, 有辅导员, 有学生。 其中, 校长就是管理者, 学生就是被管理者。 辅导员是什么暂且不谈。 那么, 校长对我们进行管理的时候, 需要见到我们吗?我们平时见不到校长, 为什么校长还能把我们管理的很好呢? 因为校长平时只需要知道我们的个人信息, 知道我们有没有犯纪律, 知道我们有什么奖项。 他就能对我们进行奖惩或者奖励。由此可见——
1、管理者和被管理者是不需要见面的。
2、管理者在不见被管理者的情况下, 如何做好的管理呢? ——只要能够得到被管理者的管理信息, 就可以在未来进行决策。 ——管理的本质:是通过对数据的管理, 达到对人的管理。
3、那么, 管理者和被管理者都不见面, 管理者又是如何获得被管理者的数据的呢?
那么我们就要考虑一个问题, 既然在大学中, 校长是管理者, 学生是被管理者。 那么辅导员的身份是什么呢?
想一想我们生活中就两件事——决策与执行。 比如说我们今天放假, 现在你很无聊, 就想打一局王者荣耀还是歇一会写作业?你想了想, 觉得还是先打一把王者荣耀——这就是做决策, 然后做完决策, 你就开始打开游戏玩了——这是执行。
那么我们知道校长更偏向于做决策, 那么执行是谁来做呢?答案就是辅导员。 辅导员不是决策者, 他是执行者。
那么就是说, 对于校长, 学生, 辅导员。 他们的关系是这样的:
那么对于操作系统, 它是主要的决策者。 但是硬件那么多, 它是如何对某个硬件进行管理的呢?
那么我们还是使用上面的校长的例子进行解释: 其实对于校长来说, 每一个学生都是类似的。每一个学生都有自己的学号、姓名、性别、班级、家庭住址等等。 那么, 一般的校长可能会使用excel表格, 弄成下面的一个表格:
然后, 校长就会让辅导员们以这个表格的形式, 去获取学生的信息——其中, 校长将学生的属性罗列出来, 这个过程, 就叫做描述的过程。
但是, 今天校长变了一个方法, 他不用excel表格了, 他自己创建了一个结构体。 这个结构体里面定义了学号, 性别, 班级, 住址等等。 如下:
那么, 原本校长要保存全学校学生的信息需要建立一个excel表格。 但是现在就不需要了, 校长只需要创建一个学生链表, 就可以保存下全校学生的信息。
在上面这个过程中, 创建结构体就是描述的过程。
而我们保存学生的信息, 保存一个学生的信息, 就是创建一个学生的对象。 并且使用对应学生的信息初始化这个对象。 当我们创建一个又一个对象, 比如创建了学生1对象, 学生2对象, 学生3,4对象。 那么我们就可以使用对象里面链表的指针将这些对象串联起来, 所以, 这些学生对象都会被连接起来,那么校长就能获得一个学生基本信息的链式结构
至此, 校长就不需要再使用人工管理excel表格了——只需要管理好链表结构就可以了!
那么, 校长就成功地将对学生地管理工作, 转化为了对链表的增删查改!
以后校长想要对学生进行什么样的处理, 只需要使用相应的链表接口就可以了。比如说想要查找全体学生中分数最高的学生, 或者分数最低的学生等等。那么, 以上校长将一个个学生对象创建,并且连接成链表, 这个过程, 就叫做组织!
对于上面的整个逻辑也就是说:对于校长来说, 想要获取学生信息, 但是每个学生的情况不太一样, 很繁杂。 所以他就将学生信息描述成了一个个属性,让辅导员去获取每个学生的属性信息。然后绘制成excel表格, 但是全校学生很多。人工查找excel很慢,校长就利用属性, 创建一个结构体, 描述了一个学生。 然后将每个学生的信息放到一个结构体对象里面保存起来, 并且将这些对象组织起来, 成为一个链表。
那么我们回到操作系统, 对于操作系统来说, 它是由c语言写的, 那么操作系统要描述一个对象, 它只能使用结构体来描述。
所以在操作系统当中, 他管理软硬件资源, 一定和上面校长使用的链表管理的思路是一样的——我们把这种思路, 叫做先描述, 再组织。 (在操作系统中, 管理任何对象, 最终都可以转化为对某种数据结构的增删查改。)
这里有个例子进行辅助理解, 是关于c++的, 没学过c++的容器的友友可以自行跳过——就是我们在学习c++的时候, 是不是先学习c++的类, 然后才开始学习的容器。 对于c++的类来说, 它不是就是c语言的结构体吗?也就是说, 它不就是一种描述方式吗。 然后容器不就是将类组织的方式吗? 所以对于c++来说, 类就是描述方式, stl容器就是组织方式。 即——c++天然就是让我们先描述, 再组织的。
为什么, 因为任何一个程序, 它或多或少, 都要进行一些管理工作。 有管理工作, 那么就要对数据进行描述, 进行组织。 不光c++, 任何一门语言, 他都要提供描述, 组织的方式, 这是由整个计算机世界所决定的。 整个计算机世界, 都是围绕上面六个字展开——先描述, 再组织(计算机只能这么做,这就是建模的过程)。 语言提供相应的方式, 我们未来写的程序, 永远都会描述数据, 然后对数据进行管理。
操作系统是一个管理软硬件资源的软件, 他就是建立了底层硬件设备的属性的结构体。 然后根据这些属性创建相应的结构体对象。 通过管理这些结构体对象, 来达到管理硬件的目的。 那么就是说, 操作系统内部, 一定存在了大量的数据结构!!
库函数
知道了操作系统如何管理硬件之后, 我们还要知道,对于库函数, 它是如何调用底层硬件的?
那么假如有两个学校的校长, 一个A学校, 一个B学校。 那么假如A学校有一个算法很厉害的学生, 但是B学校没有。 有一天, B学校的校长想要让A学校这名学生代替他们学校出去比赛, 那么请问, 这个时候, B学校的校长应该找A学校的校长还是这名学生?
很明显, 应该找A学校的校长, 因为这名学生是被校长管理起来的, 他要服从管理。 那么就不能直接访问到他。 所以, B学校校长就必须先和A学校校长协商。
那么, 我们库函数也是一样, 他们如何调用底层硬件?比如说printf, 它如何将数据打印到显示器上, 显示器是硬件, 被操作系统管理起来, 那么printf函数就不能直接访问到显示器, 而是要先沟通操作系统, 然后才能访问底层硬件。 也就是说, 库函数想要访问底层硬件, 那么就要贯穿整个操作系统。
而沟通操作系统, 我们知道, 操作系统不相信任何人, 他只是开了一扇窗——系统调用。那么就是说, 我们的库函数想要调用底层硬件, 就势必要封装系统调用。 也就是说, 我们的C/C++标准库的库函数与系统调用, 他们之间的关系就是调用与被调用的关系。
-------------以上就是本节的全部内容, 下面是本人的笔记