【Linux系统】—— 冯诺依曼体系结构与操作系统初理解
- 1 冯诺依曼体系结构
- 1.1 基本概念理解
- 1.2 CPU只和内存打交道
- 1.3 为什么冯诺依曼是这种结构
- 1.4 理解数据流动
- 2 操作系统
- 2.1 什么是操作系统
- 2.2 设计OS的目的
- 2.3 操作系统小知识点
- 2.4 如何理解"管理"
- 2.5 系统调用和库函数
1 冯诺依曼体系结构
我们的计算机是由硬件构成的,但各种硬件如:显示器、键盘、网卡、磁盘等硬件设备并不是杂乱无法揉在一起就能成为计算机的,所有的计算机都需要按照一定的组织结构将所有的硬件划分在一起,而当前最常见的计算机组织结构就是冯诺依曼体系结构。
1.1 基本概念理解
对上图各个部分的介绍
输入设备:
键盘、鼠标、话筒、摄像头、网卡、磁盘……输出设备:
显示器、磁盘、网卡、打印机……CPU(中央处理器):主要由运算器和控制器组成。
运算器主要是用来进行运算的,我们所做的运算主要分为两种:算术运算(加减乘除)和逻辑运算(真假、位运算)
控制器主要是用来控制CPU去取指令、分析指令、执行指令等工作存储器:现阶段理解存储器就是内存!
其他概念介绍:
外设: 输入输出设备我们统称为外设。外设需要做的是:将输入设备的数据读到内存里,将内存中的数据输出到外设中。
磁盘和网卡比较特殊,他们既是输入设备又是输出设备。网卡因为网络我们还没学习,暂时先不做介绍。IO: 之前我们写C/C++程序进行文件读取时,读文件就是将磁盘中的文件读到内存里,写文件就是将内存中的文件写到磁盘中。我们将这种读写的动作称为 input/output,即IO。
理解IO应站在内存的角度,输入设备把数据交给你(内存)就是input;你(内存)把数据给输出设备就是output
1.2 CPU只和内存打交道
我们都知道,我们写的程序要运行,必须先将生成的可执行文件加载到内存中,那么程序运行之前放在哪里?
答案是在磁盘。
程序本质就是一个文件,它就是我们编译好的,在特定路径下的二进制文件。
为什么程序要运行必须先加载到内存中呢?
上面的冯诺依曼体系结构图中,红色箭头表示数据的流动方向。从图中不难看出:CPU只能从内存中读写数据! 在数据层面上,CPU只认内存,压根不认什么输入输出设备。
那我们的软件运行,是谁在运行我们的软件呢?正是CPU,是CPU执行我们的代码,访问我们的数据
可是CPU无法读取外设,所以我们必须把程序加载到内存,如此才能被CPU访问到。
这是由冯诺依曼体系结构规定的。
在冯诺依曼体系结构中,数据的流动方向永远是:输入设备 -> 内存 -> CPU -> 内存 -> 输出设备
但"流动"这个词太抽象,我们换句话:数据流动的本质是从一个设备 “拷贝” 到另一个设备
所以可以推导出:冯诺依曼体系结构的效率取决于设备的"拷贝"效率决定
小结:
CPU在数据层面,只和内存打交道;外设只和内存打交道。
1.3 为什么冯诺依曼是这种结构
所以冯诺依曼为什么是上图的结构呢?可不可以不要内存,直接:输入设备 -> CPU ->输出设备 这种结构呢?
这里给大家介绍一下存储分级,如图:
在计算机世界中,存储这件事:如果它离CPU越近(金字塔顶端),它的存储容量越小,但是它速度更快、也更贵;离CPU越远(金字塔低端),它的存储容量越小,但速度更慢,不过也更便宜。
ps:我们可以在淘宝看看同等加钱分能买到多少G内存条和磁盘
如果直接:输入设备 -> CPU ->输出设备 这种结构,就会有一个很大的问题:
输入输出设备属于外设,它的运算效率相比于CPU特别低!虽然CPU的运算效率很快,但根据木桶效应,总体的运行效率就取决于外设。
那我们能不能将我们的各种外设全部做成寄存器,这样运行效率不就高了吗。是可以的,只要你有钱,因为这时一台电脑的造价将无比恐怖
为了在效率和成本之间找平衡,我们在计算机体系结构中引入了:寄存器(内存)
有了内存,内存的运行效率本身相对较高,我们可以提前将数据从外设拷贝到内存,这样CPU可以直接从内存中读数据。
这样,我们花少量的前就可以获得一台运算效率不错的计算机。现在的计算机本质上是性价比的产物。
为什么冯诺依曼体系这么简单,却是目前计算机体系的主流结构?
冯诺依曼的历史意义不在技术上,它的意义在于让平民百姓可以用较低的价格买入效率不错的计算机,百姓买得起全世界才有那么多网民,有了这么多网民才有了互联网。冯诺依曼体系的历史意义在于:它是构成互联网的必要条件。是历史选择了冯诺依曼体系
1.4 理解数据流动
请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。
既然两个人聊天是用电脑,那么本质就是两台冯诺依曼体系进行聊天!
首先,要聊天要先登录 QQ,登录 QQ 就是启动 QQ 这款软件,其本质就是将QQ的可执行程序加载到内存。你在键盘输入"你好",本质就是输入设备(键盘)中的数据流动到了内存。数据经过运算器处理(加密、封包)后写回内存,数据再从内存流动到输出设备(网卡)。
网卡将数据交到网络,网络再将数据交到朋友的机器。这点我们以后详细学习
朋友的输入设备(网卡)拿到数据,拷贝给内存(QQ的可执行已加载到内存),再交给CPU解密等;CPU处理完后交给内存,内存在将数据输出到输出设备(显示器)中。
数据流动的本质是在冯诺依曼体系中进行数据流动
2 操作系统
2.1 什么是操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序
说人话:操作系统是一款进行软硬件管理的软件。
没错,操作系统自己本身是一款软件
操作系统分为狭义上的操作系统和广义上的操作系统
狭义:操作系统的内核
内核的四大主要工作:进程管理、内存管理、文件管理、驱动管理
广义:内核 + 其他程序(例如函数库、shell程序等等)
后面若不加说明,操作系统指的是狭义上的操作系统及内核
2.2 设计OS的目的
计算机软硬件结构
在计算机结构的最底层是各种硬件(网卡、磁盘等),各种硬件在逻辑上时按照冯诺依曼体系结构组织的。
每一种硬件都对应有一个驱动程序(网卡有网卡驱动,硬盘有硬盘驱动),因为读取每一种设备的信息都有自己个性化的读取方式,所以访问各种硬件都要配上对应的驱动程序。具体现象比如:你插上鼠标,可以依然动不了,过了一两秒显示器上弹出某某驱动安装成功,这时再动鼠标才有反应。驱动程序大部分是由对应硬件厂商来提供的。
在驱动程序之上则是操作系统。
操作系统对下:要与硬件交互,管理所有的软硬件资源
但操作系统管理硬件并不是目的,而是手段。
操作系统的目的是,对上:为用户程序(应用程序)提供一个良好的执行环境
比如我打个游戏,你总不能3分钟一黑屏5分钟一重启吧,操作系统你能不能把底层的软硬件资源管理好,不要让他出错,让我安心打游戏。
小结:操作系统存在的目的是给用户提供服务的,一切以人为本
2.3 操作系统小知识点
从上图中不难看出计算机软硬件体系结构(从硬件到用户整个过程)是层状结构!
如何理解呢?
层状结构在软件工程上体现出的特点是:高内聚低耦合。
高内聚:把相同功能相同逻辑的代码和数据放在同一层内部,比如操作系统内全是操作系统的代码数据
低耦合:指的是层跟层之间只使用一些接口的方式来互相调用,在数据和逻辑层面没有强耦合
有了这样的设计特点,未来我想该某一层的数据或逻辑,其他层基本没有影响。比如我改操作系统,驱动和硬件都不用变。
高内聚低耦合主要是为了方便代码后续的可维护性。可维护性简单来说就是一个模块我们修改了并不影响另一个模块,那个模块出问题就子啊那个模块找问题。
计算机各种硬件在设计上也是高内聚低耦合的。
一台计算机的各种硬件(CPU、磁盘、主板、网卡、显卡)都是由不同厂商提供的,我们想换某一个硬件随便换。这说明计算机设计在硬件上就是高内聚低耦合的
操作系统不允许任何人直接访问操作系统内的各种代码和数据,我们要访问操作系统,必须使用系统调用 —— 其实就是函数,只不过是系统提供的
用户要正确使用系统调用必须对操作系统有一定的了解。那使用起来成本不是很高?
正是因为系统调用太麻烦了,所以有人给我们做了封装,给我们形成了一个库:比如 C标准库 、C++ 库
所以我们平时的开发动作,在整个体系结构的最上层
我们的程序,只要判断出它访问了硬件,那么它必须贯穿操作系统!
我们之前用 printf 往显示器上打印,其本质是用户把数据写到了硬件,而我们是不可能直接绕过操作系统直接到硬件的,所以 printf 这个函数底层一定要封装系统调用,再通过操作系统访问对应驱动,才能把数据交到硬件上。
所以我们之前的 scanf、printf 对各种文件的IO等等操作是要访问操作系统的
2.4 如何理解"管理"
在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的“搞管理”的软件
因此,要理解操作系统,就要先理解 “管理”。
为帮助小伙伴们更加深刻理解管理,我们举一个小例子。
我们简化学校系统,认为整个学校只有校长(管理层)、辅导员(执行层)、学生(被管理层)。
人类日常生活中做的事情就两种:决策和执行
对老百姓来说,决策和执行是不分家的。决定明天不去上早8是决策,第二天睡到12点是执行
但对一个管理体系来说,管理者最大的能力就是他有决策权,比如学校的校长。辅导员作为执行层时没有决策权的
回过头看软硬件结构的下三层:操作系统是决策层(校长)、驱动层序是执行层(辅导员)、底层硬件是被管理层(学生)
校长是如何管理生的呢?
校长需要和学生见面吗?不需要!我们除了入学和毕业,就没见过校长。
所以:要管理,管理者和被管理者可以不需要见面
连面都不见,如何管理?
见面并不是必要条件,见面只是为了获取你身上的相关数据。只要我有其他方式获得相关数据,就没必要见面。
比如校长想给张三发奖学金,并不需要亲自去宿舍问张三成绩怎么样,只需要知道张三排名全校前十就可以
所以,管理是通过数据进行管理
不需要见面,如何拿到数据?
所以校长和学生之间,必须要加一个人—— 辅导员。数据由辅导员帮忙获取。辅导员获取我们的信息,记录在教务系统当中,校长根据教务系统中的数据管理每一个学生。
回过头,操作系统管理各种硬件并不需要和硬件接触,它管理硬件是通过数据进行管理的,而数据就是由驱动程序获取的。
数据要拿的有意义,总不能让辅导员统计今天学生穿什么颜色的衣服吧。
校长给了辅导员一个Excel表格,让辅导员获取相关数据
现在校长每天的工作由管理学生改为管理表格中的数据,基于数据做决策,比如校长看到表格中李四20门课挂科19门,直接将李四开除。
但如果表格中的数据太多了呢?100名学生校长还管得过来,10万名呢?
对学生的数据进行管理,本质不就是增删查改吗?可随着人越来越多,增删查改的负担越来越大。
幸好,校长是计算机专业出生
校长决定让计算机帮忙管理。
校长发现,表格开头就是学生的各个属性,不同行之间大家的属性一样,只是具体的值不一样。
在软件层面上如何把不同的属性集合在一起呢?
结构体!(校长只会C语言,因为校长是操作系统,操作系统是由C语言写的)
struct student
{
//姓名
//年龄
//籍贯
//...
}
这样我们就可以用这个结构体定义出上万个变量,每个变量都对应一个学生。
可是上万个学生变量本身是独立的,如何对他们进行管理呢?
数据结构!
比如我们可以用链表将所有学生变量链接起来,当然也可以是其他结构。
这样,校长对学生的管理工作就转化为了对链表的增删查改!
如此校长管理学生的工作我们称为:先描述,再组织!
即先用结构体将学生的属性描述起来,再用各种数据结构(如链表)将各个学生结点组织起来
先描述,再组织可以完成现实世界对任何场景的建模。
所以看完了上面的例子,操作系统是怎么管理硬件的?
操作系统先对硬件进行描述,先定义一个结构体包含硬件的各种属性,每个硬件对应一个对象,再创建链表将各个对象链接起来。对应该的管理改为对链表中各个对象的增删查改。
所以C++为什么要提供类的概念,为什么C++该提供STL?
因为类解决的是先描述的问题;而STL是容器,本质是各种数据结构,容器解决的是再组织的问题
任何面向对象的语言,都提供了类和容器!我们这个世界就是先描述再组织的世界。
2.5 系统调用和库函数
操作系统要向上提供对应的服务,但是操作系统不相信任何用户或者人!
操作系统不允许任何人直接访问操作系统内的各种代码和数据,我们要访问操作系统,必须使用系统调用 —— 其实就是函数,只不过是系统提供的
这就是一个非常矛盾的地方:一个事物要给人提供服务,却不相信任何人
现实中有没有类似的机构呢?要给人提供服务,却不相信任何人。
银行!
银行要给我们提供各种金融服务,却不信任任何人,不让任何人到它的金库去取钱。
于是银行将自己封装起来,仅仅设置了各个窗口开放给用户,这个窗口就相当与操作系统的系统调用接口
Linux / Windows / macos 等大部分操作系统都是用 C语言 写的,系统调用本质就是系统提供的函数 — C语言风格的函数。既然是函数,就要有函数参数和返回值。
输入参数是用户给操作系统的,返回值是操作系统给用户的,所以系统调用的本质就是用户和系统之间进行数据交互。银行中我们要取钱,要先将银行卡等资料给窗口里的工作人员,这就是传参;银行在自己内部运作,再将结果返回给我们,我们拿到结果。
这样操作系统与用户之间的耦合度就非常低,能达到既给用户提供服务,又不让用户访问的目的。
但是,银行办一件事往往比较麻烦,有的老太太去银行存钱可能还不知道去银行要先取个号。所以银行在大堂中设置了工作人员来帮助人们完成相关手续。
系统调用也同理,如果让小白直接访问系统调用那成本比较高,所以操作系统还给我们提供了各种库、外壳、指令,我们只需访问库、外壳等不懂操作系统也能将操作系统用起来了。
这就是用户操作接口层,而我们用户就是再最上层做相应开发
总结:
在开发角度,操作系统对外会表现为⼀个整体,但是会暴露自己的部分接⼝,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
库函数和系统调用属于上下层的关系
好啦,本期关于冯诺依曼体系结构与操作系统的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在 Linux 的学习路上一起进步!