文章目录
- 前言
- 一、冯诺依曼体系
- 冯•诺依曼体系结构推导
- 内存提高冯•诺依曼体系结构效率的方法
- 你用QQ和朋友聊天时数据的流动过程
- 与冯•诺依曼体系结构相关的一些知识
- 二、计算机层次结构分析
- 操作系统(Operator System)
- 驱动层的作用与意义
- 系统调用接口(system call)
- 用户操作接口
- 三、操作系统管理
- 管理者决策被管理者
- 如何得到被管理者数据
- 库函数与系统调用的关系
- 总结
前言
冯诺依曼体系是现代计算机设计的基石,其统一存储和顺序执行理念推动了计算机的发展。结合操作系统、驱动层和系统调用的优化设计,计算机实现了高效的软硬件协作。
其实我这个Linux专栏,表面上只是讲了操作系统,其实未来我还会穿插 计算机网络、数据结构与算法、数据库原理等“四大件内容”
计算机的一切都是如此脉络交织,美妙无比,事实上,在我学习Linux的途中,很多知识点会有一种豁然开朗的感觉,有时候也很幸运自己选了一个对我来说这么完美的专业,我爱她,倾注了我巨大的热情,也希望她能不辜负我,hhhhh
一、冯诺依曼体系
我们今天所有的计算机都离不开 冯诺依曼 体系,这位伟大的计算机科学家早在二十世纪四十年代就提出了这种结构,即计算机应由五部分组成:输入设备、存储器、运算器、控制器、输出设备
冯•诺依曼体系结构推导
计算机的作用就是为了解决人的问题,而要解决问题,首先需要将数据或是问题输入到计算机当中,所以计算机必须要有输入设备。计算机解决完问题后还需要将计算结果输出显示出来,所以计算机必须要有输出设备。计算机通过输入设备得到数据,数据在计算机当中进行一系列的算术运算和逻辑运算后,通过输出设备进行输出,于是就得到了以下流程图。
但是计算机当中只有算术运算功能和逻辑运算功能是不够的,还需要有控制功能,控制何时从输入设备获取数据,何时输出数据到输出设备等。对应到C语言当中,算术运算就完成一系列的加减乘除,而逻辑运算就对应于一系列的逻辑与逻辑或等,控制功能就对应于C语言当中的判断、循环以及各个函数之间的跳转等等。
而我们后人就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器,简称CPU
但是输入设备和输出设备相对于中央处理器来说是非常慢的,于是在当前这个体系整体呈现出来的就是,输入设备和输出设备很慢,而CPU很快,根据木桶原理,那么最终整个体系所呈现出来的速度将会是很慢的
木桶效应:一个水桶所能承接水量的上限并不取决于桶壁上最长的那块木板,恰恰是取决于最短的那块
所以当前这个体系结构显然是不合适的,于是我们就不让输入设备和输出设备直接与CPU进行交互,而在这中间加入了内存。
内存有个特点就是,比输入设备和输出设备要快很多,但是比CPU又要慢。现在内存就处于慢设备和快设备之间,是一个不快也不慢的设备,能够在该体系结构当中就起到一个缓冲的作用。
现在该体系的运行流程就是:用户输入的数据先放到内存当中,CPU读取数据的时候就直接从内存当中读取,CPU处理完数据后又写回内存当中,然后内存再将数据输出到输出设备当中,最后由输出设备进行输出显示。
于是就形成了最终的冯诺依曼体系结构
注意: 这里存储器只是内存,不包括外存。
内存提高冯•诺依曼体系结构效率的方法
在这里在这里在这里大多数人有一个疑惑就是,先将输入设备的数据交给内存,再由内存将数据交给CPU,这个过程真的比CPU直接从输入设备获取数据更快吗?
说明这个问题之前,我们首先需要知道:内存具有数据存储的能力。虽然内存的大小只有4G/8G,但是既然内存有大小,那么它就有预装数据的能力,而这就是提高该体系结构效率的秘诀。
这里不得不说到的就是局部性原理:根据统计学原理,当一个数据正在被访问时,那么下一次有很大可能会访问其周围的数据。所以当CPU需要获取某一行数据时,内存可以将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据。
输出数据的时候也一样,CPU处理完数据后直接将数据放到内存当中,当输出设备需要时再在内存当中获取即可,这也就有了我们平常所说的缓冲区的概念。例如,缓冲区满了才将数据打印到屏幕上,使用fflush函数将缓冲区当中的数据直接输出之类的,都是将内存当中的数据直接拿到输出设备当中进行显示输出。
也就是说,内存的核心作用在于:
- 【利用内存作为缓冲】:通过预先将大量数据加载到内存中,减少CPU直接等待输入输出设备的时间。内存的读取和写入速度远高于外设,能够更快地向CPU提供所需数据。加快数据传递速度,为CPU提供高效支持。
- 【分离操作,提升并行性】:CPU从内存中读取数据与外部设备向内存导入数据这两个过程可以同时进行。这种并行处理方式避免了串行执行所带来的效率低下。实现数据流动的并行化,大幅提升整体效率。
你用QQ和朋友聊天时数据的流动过程
要使用QQ,首先需要联网,而你和你的朋友的电脑都是冯诺依曼体系结构,在你向朋友发送消息这个过程中,你的电脑当中的键盘充当输入设备、显示器和网卡充当输出设备,你朋友的电脑当中的网卡充当输入设备、显示器充当输出设备。
刚开始你在键盘当中输入消息,键盘将消息加载到内存,此时你的显示器就可以从内存获取消息进而显示在你自己的显示器上,此时你就能在你自己的电脑上看到你所发的消息了。
在键盘将消息加载到内存后,CPU从内存获取到消息后对消息进行各种封装,然后再将其写回内存,此时你的网卡就可以从内存获取已经封装好的消息,然后在网络当中经过一系列处理(这里忽略网络处理细节),之后你朋友的网卡从网络当中获取到你所发的消息后,将该消息加载到内存当中,你朋友的CPU再从内存当中获取消息并对消息进行解包操作,然后将解包好的消息写回内存,最后你朋友的显示器从内存当中获取消息并显示在他的电脑上。
与冯•诺依曼体系结构相关的一些知识
根据冯诺依曼体系结构图,我们可以知道,站在硬件角度或是数据层面上,CPU只和内存打交道,外设也只和内存打交道。到这里我们也可以说明一个问题:为什么程序运行之前必须先加载到内存?
因为可执行程序(文件)是在硬盘(外设)上的,而CPU只能从内存当中获取数据,所以必须先将硬盘上的数据加载到内存,也就是必须先将程序加载到内存。
常见的输入设备和输出设备(拓展):
- 输入设备:键盘、鼠标、网卡、硬盘、话筒、摄像头、扫描仪等。
- 输出设备:显示器、音响、网卡、硬盘、打印机等。
注意: 同种设备在不同场景下可能属于输入设备,也可能属于输入设备。
在物理层面上,各个硬件单元之间是通过总线连接的,外设与内存之间的总线叫做IO总线,内存与CPU之间的总线叫做系统总线。
总结一下:
- 计算机只能识别二进制,用户和计算机不能直接打交道,必须需要通过输入输出设备进行交流。关于设备,有纯的输入或输出,也有兼容输入输出设备。
- 中央处理器(CPU):含有运算器和控制器等。
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取简单来说,所有设备都只能直接和内存打交道。
二、计算机层次结构分析
操作系统(Operator System)
操作系统是一款管理计算机软硬件资源的软件,它向上为应用程序提供稳定的服务接口,向下为硬件提供统一的管理和调度,创造稳定可靠的运行环境。
每个硬件设备都有其特定的功能,并能够在冯诺依曼体系下高效运行。然而,仅具备硬件功能还远远不够,因为硬件的操作需要明确的调控和协调。也就是说,何时执行何种功能,必须通过一个统一的管理者来安排,这正是操作系统和程序设计的重要作用。
驱动层的作用与意义
上层的任何操作最终都会反馈到底层硬件,操作系统接收上层请求后,会调用相关的底层硬件。然而,由于硬件特性不同,可能会导致需要修改硬件或操作系统以适配新设备。为了解决这种问题,在软件和硬件之间引入了一层驱动层。
驱动层是一种专门的软件,每种硬件都有对应的驱动层。它的主要作用不是直接管理软硬件资源,而是为操作系统提供统一的通信接口,让操作系统能够通过标准化的方法访问和控制硬件设备。例如,操作系统可以通过驱动层读取硬件信息或发送控制指令,而不需要关心硬件的具体实现细节。
不论硬件如何变化,只要硬件厂商提供了合适的驱动程序,操作系统就能够正常管理和使用该硬件。
系统调用接口(system call)
底层硬件的管理者是操作系统,任何涉及到访问硬盘的行为,必须通过操作系统进行访问。操作系统里面本身是对软硬件资源进行操作,所以操作系统内部会包含所有的软硬件资源。
所以有一个问题,如果出现用户想要访问某种软硬件资源数据,可不可以直接访问操作系统特定的数据呢?
答案是不行,操作系统内部资源是十分重要的,不允许其他用户直接进行访问,避免用户造成内部资源的损坏。然而,用户仍然需要通过操作系统向底层硬件提出请求并执行操作。
为此,操作系统设计者使用 C语言 编写了一系列内部函数接口,这些接口为用户程序提供了访问系统资源的标准服务。这些接口被称为 系统调用(System Call)。
用户操作接口
由于系统调用本身的使用难度较高,普通用户直接使用系统调用可能面临复杂的操作流程和较高的技术门槛。因此,程序员通常会基于系统调用设计上层的软件或接口,通过封装特定的功能和逻辑,提供更简单、易用的服务。
三、操作系统管理
管理者决策被管理者
我们可以举个例子方便理解:评选奖学金:
将评选奖学金的工作人员看成管理者,而参与评选的学生看成被管理者。
如果管理者需要对于被管理者需要进行决策,决定奖学金分配。根据我们日常流程可以知道,管理者和被管理者间是不需要见面,管理者会根据被管理者数据进行相关决策。
这也说明管理的本质是通过对于数据进行管理,从而达到对于人的管理。
如何得到被管理者数据
管理者是负责对被管理者数据进行决策,而被管理者数据是需要通过执行者去执行收集数据。由于人数过多,精力有限,不可能一一去问,所以我们可以使用EXCEL表格进行管理,但是庞大的数据量也是十分的棘手。
管理者是老练的程序员,想到可以将自己手上的活交给编译器去做,那么将学生信息封装到结构体中,在每个结构体内部添加结构体指针用于连接其他包含学生信息的结构体,形成链表。
管理者只需要对链表进行管理,对于学生信息数据进行增删查改转变为了对链表的增删查改。相对于Excel表可以根据链表的特点添加一些方便的接口,比如找到这一堆学生中数学成绩最好的学生。
在计算机体系结构里,我们的OS就相当于管理者,我们的软硬件资源就相当于被管理者,而我们的驱动程序就相当于是执行者。
库函数与系统调用的关系
【场景】:假如有A和B两个校长,A校长有一个学生数学特别厉害,但是B校长没有,于是B校长就想跟A校长商量借这个同学来打比赛,但是B校长肯定不能直接去找这个学生,因为这个学生是A校长的人,他得负责,所以他必须要通过A校长的同意才行。
库函数必须通过系统调用接口才能与操作系统进行交互,从而访问底层资源。因此,库函数与系统调用呈现出上下层关系,可以理解为:
-
系统调用是基础层
系统调用是操作系统提供的接口,直接与操作系统内核交互,用于访问硬件资源或执行关键的系统操作(如文件管理、进程控制等)。 -
库函数是封装层
库函数建立在系统调用之上,进行二次开发,通过封装复杂的系统调用逻辑,为开发者提供更加简单、统一的操作接口。例如:printf() 是C标准库函数,但它最终调用了系统调用 write() 来实现数据输出。
总结一下: 管理者管理被管理者,实际上是先将被管理者的各种信息进行描述,然后再将多个被管理者的描述信息根据某种数据结构组织起来,最后管理者管理被管理者实际上就是对数据结构的管理。
先描述,再组织,这是一个很重要的思想,往后我会在教学中不断提起的!!!
总结
往下只会越来越难哦,哎,这Linux!!!