文章目录
- 冯诺依曼体系结构
- 操作系统(Operator System)
- 什么是操作系统
- 为什么要有操作系统
- 操作系统是怎么实现管理的
- 系统调用接口和库函数
- 总结
冯诺依曼体系结构
谈到计算机的硬件结构,第一个想到的必然是经典的冯诺依曼体系结构:
我们常见的计算机,如笔记本,和我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
我们所认识的计算机,都是有一个个的硬件组件组成:
输入设备:包括键盘, 鼠标,扫描仪, 写板等
中央处理器(CPU):含有运算器和控制器等
存储器:这里特指内存(泛称,像缓存等也都在这里归结为内存),存放临时数据,通电时才工作
输出设备:显示器,打印机等
其中输入设备和输出设备都叫做外设,在数据层面,CPU是不直接和外设打交道的。
怎么理解呢?
如上图中的实线所标记的数据流,
是先由输入设备传输到存储器,也就是内存,
然后数据再有内存传到CPU进行运算,
运算结果再由CPU返回到内存,
最终输出到输出设备,可能是显示器,也可能是网卡、音响等等。
这种设计的合理之处在哪呢?
首先我们知道,CPU再细分一下,
内部有寄存器,作为存储结构,
而寄存器是读取速度最快的存储单元,
内存次之,外设最次。
可不可以让数据直接从外设流入寄存器呢?
当然可以,但是这样有一个问题,
寄存器直接从外设中读取数据,
数据的传输数据是取决于寄存器还是取决于外设呢?
很明显是外设,可以类比一下木桶原理。
而内存呢,造价相对寄存器低了太多,效率相比外设又高了许多,
所以内存的存在,一是可以存放大量的临时数据而又控制了成本,
二是可以作为一个缓冲,让数据的流入和流出效率更高。
代码指令同样是数据,
所以外设中需要CPU执行的指令也要先流入内存,
再由内存流入控制器,由控制器直接发送相关指令操作。
举一个很简单的例子,我从微信给朋友发送了一条消息,这条消息是如何经过上面的体系流入我朋友的机器最终在他的屏幕上显示出来呢?
首先我从键盘输入信息,此时键盘就作为输入设备,
信息经内存流入运算器进行编码,然后再由内存流入输出设备,也就是网卡,
其中输入信息点击发送后不仅有数据的流入,还有指令的流入,
指令经过控制器解码执行,最终给各硬件发送指令,
比如让我的显示器显示我发送的信息,
比如让网卡将消息经网络传输到我朋友的网卡。
然后朋友的网卡那边就接收到了来自我这边的消息和一些指令,
消息和指令数据通过内存从网卡流入运算器和控制器,
处理完毕后再作用于外设,也就是他的屏幕上。
经过这么一个过程,就完成了数据的流转。
操作系统(Operator System)
有了这么一个硬件体系,计算机就可以正常工作了吗?
显然不是,就好比工厂购入了各种机器,此时工厂就可以进行生产了吗?
工厂需要工人来操作这些设备,
而计算机也同样需要这样一个角色将各种硬件组织起来。
充当这个核心角色的就是大名鼎鼎的操作系统了。
什么是操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。
操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。
笼统理解,操作系统由两部分组成;
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
为什么要有操作系统
对上层使用者来说,操作系统可以为用户提供一个安全的、稳定的、高效的运行环境:
从普通用户的角度来说,计算机操作系统体现为其提供的各项服务
从程序员的角度来说,其主要是指用户登录的界面或者接口
如果从设计人员的角度来说,就是指各式各样模块和单元之间的联系
对中层的各种需要运行的程序来说,操作系统需要将它们组织起来,对其进行管理。
对下层的各种硬件来说,操作系统需要将它们组织起来,让硬件跑起来,物尽其用。
从计算机的视角出发,操作系统是一款纯粹为管理而打造的软件。
操作系统是怎么实现管理的
作为学校学生,我们可以先思考一下,
学校是怎么对我们进行管理的呢?
学校不会去一对一地监视到我们每个具体的个人,
而是会通过我们的各种信息对我们进行管理。
比如开学的时候会对新生进行信息采集,
将新生的基本信息录入到教务系统的数据库中,
在此基础上,对学生的管理就变成了对数据的管理。
比如你参加了期末考试,你的成绩会被更新到数据库中上,
从而评奖评优就可以以你所取得的“数据”为部分参考指标。
学校对你的管理并不严格关注你个人,而是关注你的数据。
但是对你的数据进行管理会影响到你个人吗?
把你的成绩全都改成了0,会影响你吃喝睡吗?
不影响,因为你不知道你的数据是什么样的,
而影响你的会是学校通过你的数据对你下发的决策。
比如你门门挂科要延毕了,学校会对你下发延毕的决策,
而决策真正作用到你身上是通过你的学院对你下发的通知。
这里就诞生出了三个角色:
学生,也就是被管理对象,会被抽象成各种数据
学校,也就是管理者,会对各种数据进行管理并下发通知
学院,也就是执行者,接收上层的通知并对下执行
而对计算机来说,操作系统就充当了这里的管理者的角色,
各个硬件就充当了被管理者的角色,
操作系统怎么实现对硬件的管理呢?
通过各种硬件驱动,比如声卡驱动、网卡驱动。
这是第一个关注的问题 —— 操作系统对数据进行抽象管理,并通过执行者实现具体的管理,而不与具体的数据所有者进行直接交互。
第二个需要关注的问题就是 —— 管理者会将被管理对象的数据从被管理对象本身抽象出来,这个过程叫做对被管理者的描述,通过学号、姓名、年龄等数据描述你这一个人,然后将你的这些数据整合成一个类,将同类数据整合起来,从而实现对所有学生的管理,这个过程叫做对数据的组织。先描述,再组织,也就成了管理的核心。
就好比写一个简单的学生管理系统,需要声明一个结构体来描述一个学生的信息,然后通过建立一个链表或数组,将学生信息用一定的数据结构组织起来,对学生的管理就转为了对数据结构的增删查改。
操作系统同样是以此模式工作的。
系统调用接口和库函数
首先明确一点,操作系统为了安全,是不信任任何用户的。
可以类比银行系统来理解,银行系统是不信任任何一个用户的,
不然为什么还要给你开放窗口而不是直接让你去小金库。
但与此矛盾的是,他又要为你提供各种服务。
银行会开放窗口或提供ATM机供你操作完成服务,
既向你提供了服务,又保证了一定的安全性。
同样地,
操作系统对外也提供了像银行窗口似的各种接口供开发者使用,
从而满足用户的各种操作。
这就叫是所谓的系统调用接口。
而系统调用接口的优点很明显,
缺点也同样明显,
比如功能比较基础、使用门槛较高…
所以又有大神对其进行封装,
封装开发出了一系列的库,
在此基础上对其进行二次开发,
开发出了诸如shell、函数库、图形化界面等等开发门槛的更低的接口。
总结
所以回顾一下前面提到的软硬件。
从最底层的各种硬件:外设、内存、处理器…
向上是作为管理者的各种驱动对具体硬件进行具体管理;
再向上是作为管理者的操作系统,
通过各种控制块对软硬件进行描述,
然后再通过一定的数据结构将其组织起来,
实现对硬件或是运行在硬件之上的软件的管理;
再向上是操作系统对外开放的各种系统调用接口;
再向上是大佬们开发出来的各种封装好的库;
而最上层的就是我们用户所使用的各种较为成熟的库,或者称之为用户调用接口: