1:冯诺依曼体系结构
- 计算机的目的就是为了解决人的问题,而要解决问题,首先需要将数据或者问题输入到计算机当中,因此计算机必须要有输入设备。计算机解决完问题后还需要将计算结果输出显示出来,所以计算机必须要有输出设备。计算机通过输入设备得到数据,数据在计算机当中进行一系列的算术运算和逻辑运算后,通过输出设备进行输出.
- 但是计算机当中只有算术运算功能和逻辑运算功能是远远不够的,还需要有控制功能,控制何时从输入设备获取数据,何时输出数据到输出设备等。对应到C语言当中,算术运算就完成一系列的加减乘除,而逻辑运算就对应于一系列的逻辑与逻辑或等,控制功能就类似于C语言当中的判断、循环以及各个函数之间的跳转等等.
- 而后人就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器,简称为CPU.
- 但是输入设备和输出设备相对于中央处理器来说是非常慢的,于是在当前这个体系整体呈现出来的就是,输入设备和输出设备很慢,而CPU很快,根据木桶原理,那么最终整个体系所呈现出来的速度将会是很慢的.
- 所以当前这个体系结构显然是不合适的,于是就不让输入设备和输出设备直接与CPU进行交互,而在这中间加入了内存.
- 内存有一个特点,就是比输入设备和输出设备要快很多,但是比CPU要慢.将内存放置于设备与快设备之间,是一个不快也不慢的设备,能够在该体系结构当中就起到一个缓冲的作用.
- 那么该体系的运行流程就是:用户输入的数据先放到内存中,CPU读取数据的时候就直接从内存当中读取,CPU处理完数据后又写回内存当中,然后内存将数据输出到输出设备中,最后由输出设备进行输出显示.于是就形成了最终的冯诺依曼体系结构.
PS:这里存储器只是内存,不包括外存.
1.1:内存提高冯诺依曼体系结构的方法
- 有的uu会有疑问,先将输入的设备数据交给内存,再由内存将数据交给CPU,这个过程真的比CPU直接从输入设备获取数据更快吗?
- 回答这个问题之前,我们首先得知道:内存具有数据存储的能力.虽然内存的大小只有4G/8G/12G/16G等,但是既然内存有大小,那么它就具有预存储数据的能力,而这就是提高冯诺依曼体系结构的核心所在.
- 这里还需要提到局部性原理:根据统计学原理,当一个数据正在被访问时,那么下一次有很大可能会访问其周围的数据.所以当CPU需要获取某一行数据时,内存可以将这一行的数据后面的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据.
- 输出数据的时候也是同理,CPU处理完数据后直接将数据放到内存当中,当输出设备需要时再在内存中进行获取即可,这也就有了缓冲区的概念.例如:缓冲区满了以后才将数据打印到屏幕上,使用fflush函数将缓冲区当中的数据直接输出等等,都是将内存当中的数据直接拿到输出设备中进行显示输出.
1.2:使用QQ与朋友聊天时数据的流动过程
- 要使用QQ,首先需要联网,而你和你的朋友的电脑都是冯诺依曼体系结构,在你向朋友发送消息这个过程中,你的电脑中的键盘为输入设备,显示器与网卡当作输出设备,你朋友电脑的网卡充当输入设备,显示器充当输出设备.
- 刚开始你在键盘当中输入消息,键盘将消息加载到内存中,此时你的显示器就可以从内存获取消息进而显示在你自己的显示器上,此时你就能在你自己的电脑上看到你所发的消息.
- 在键盘将消息加载到内存后,CPU从内存获取到消息后对消息进行各种封装,然后再将其写回内存,此时你的网卡就可以从内存获取已经封装好的消息,然后在网络中经过一系列的处理,之后你朋友的网卡从网络当中获取到你所发的消息后,将该消息加载到内存当中,你朋友的CPU再从内存当中获取消息并对消息进行解包操作,然后将解包好的消息写回内存,最后你朋友的显示器从内存当中获取消息并显示在他的电脑上.
1.3:与冯诺依曼体系结构的一些相关知识
2:操作系统
- 操作系统是一款管理计算机软硬件资源的软件,它向上为应用程序提供稳定的服务接口,向下为硬件提供统一的管理和调度,创造稳定可靠的运行环境.
- 每个硬件设备都有其特定的功能,并能够在冯诺依曼体系下高效运行.然而,仅具备硬件功能还远远不够,因为硬件的操作需要明确的调控和协调.也就是说,何时执行何种功能,必须有一个统一的管理者来安排.
2.1:驱动层的作用与意义
- 上层的任何操作最终都会反馈到底层硬件,操作系统接收上层请求后,会调用相关的底层硬件。然而,由于每一个硬件的特性不同,可能会导致需要修改硬件或操作系统以适配新设备。为了解决这种问题,在软件和硬件之间引入了一层驱动层.
- 驱动层是一种专门的软件,每种硬件都有对应的驱动层。它的主要作用不是直接管理软硬件资源,而是为操作系统提供统一的通信接口,让操作系统能够通过标准化的方法访问和控制硬件设备。例如,操作系统可以通过驱动层读取硬件信息或发送控制指令,而不需要关心硬件的具体实现细节.
2.2:系统调用接口
- 底层硬件的管理者是操作系统,任何涉及到访问硬盘的行为,必须通过操作系统进行访问。操作系统里面本身是对软硬件资源进行操作,所以操作系统内部会包含所有的软硬件资源。
- 那么有的uu会有一个问题,如果出现用户想要访问某种硬件资源数据,可不可以让用户直接访问操作系统特定的数据呢?
- 答案是不可以!!!
- 操作系统内部资源是十分重要的,不允许其他用户直接进行访问,避免用户造成内部资源的破坏.然而,用户依然需要通过操作系统向底层硬件提出请求并执行操作.
这就好比我们去银行取钱,我们不可能说直接进入到银行的操作柜台的内部,自主去进行操作,然后去取钱,因为银行不相信任何人,哪怕你是银行的vvip客户,所以就会让我们去用户操作柜台,然后将我们需求告诉操作人员,让他们来帮我们进行操作,这里的用户操作柜台就类似于系统调用接口
2.3:用户操作接口
由于系统调用本身的使用难度较高,普通用户直接使用系统调用可能面临复杂的操作流程和较高的技术门槛。因此,程序员通常会基于系统调用设计上层的软件或接口,通过封装特定的功能和逻辑,提供更简单、易用的服务.
这就好比上了年纪的大爷大妈去银行取钱,但是他们不知道该怎么去用户操作柜台操作,因为要进行取号,排队,然后表达需求,外加大爷大妈的表达能力可能不是特别的强,这就导致了效率会降低,因此为了解决这一问题,银行就会有专门的客户经理去为大爷大妈服务,一步步地耐心解答,这里的客户经理就类似于用户操作接口.
2.4:操作系统管理
2.4.1:管理者决策被管理者
这里可以举一个简单的例子:大学校长管理学生
把校长当作管理者,学生当作被管理者.那么校长对学生进行决策时,并不是直接说跑到学生的面前一个一个下达决策,而是首先将决策下达给辅导员这个执行者,然后辅导员再下达给学生.校长与学生不需要直接进行见面,而是会根据学生的数据作出相关的决策.
那么因此管理学生本质就是对学生的数据进行管理.
2.4.2:得到被管理者的数据
- 管理者是负责对被管理者数据进行决策,而被管理者数据是需要通过执行者去执行收集数据。由于人数过多,精力有限,不可能一一去问.
因此校长首先对每个学生所有的相关信息进行描述,例如:个人信息,相关荣誉,健康状况等等,然后让学生自主去进行填写上交,那么校长对于学生的管理就变成了对学生数据的管理,由于学校的人数过多,那么校长通过某种特定的数据结构将学生的数据组织起来,例如:双向循环链表,因此对学生的管理就变成了链表的增删查改.
- 所以管理者要想管理好被管理者,遵从六个字:先描述,再组织.
2.5:库函数与系统调用
假如有A和B两个校长,A校长有一个学生打篮球特别厉害,但是B校长没有,于是B校长就想跟A校长商量借这个同学来打比赛,但是B校长肯定不能直接去找这个学生,因为这个学生是A校长的人,他得负责,所以他必须要通过A校长的同意才行,然后告诉A校长,A校长再通过他的辅导员去转达给这个学生.
库函数必须通过系统调用接口才能与操作系统进行交互,从而访问底层资源。因此,库函数与系统调用呈现出上下层关系,可以理解为:
1.系统调用是基础层
系统调用是操作系统提供的接口,可以与操作系统内核交互,用于访问硬件资源或执行关键的系统操作。
2.库函数是封装层
库函数建立在系统调用之上,进行二次开发,通过封装复杂的系统调用逻辑,为开发者提供更加简单、统一的操作接口。例如:printf() 是C标准库函数,但它最终调用了系统调用的write()函数来实现数据输出。