Linux冯诺依曼体系与计算机系统架构认知(8)

文章目录

  • 前言
  • 一、冯诺依曼体系
    • 冯•诺依曼体系结构推导
    • 内存提高冯•诺依曼体系结构效率的方法
    • 你用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函数将缓冲区当中的数据直接输出之类的,都是将内存当中的数据直接拿到输出设备当中进行显示输出。

也就是说,内存的核心作用在于:

  1. 【利用内存作为缓冲】:通过预先将大量数据加载到内存中,减少CPU直接等待输入输出设备的时间。内存的读取和写入速度远高于外设,能够更快地向CPU提供所需数据。加快数据传递速度,为CPU提供高效支持。
  2. 【分离操作,提升并行性】:CPU从内存中读取数据与外部设备向内存导入数据这两个过程可以同时进行。这种并行处理方式避免了串行执行所带来的效率低下。实现数据流动的并行化,大幅提升整体效率。

你用QQ和朋友聊天时数据的流动过程

  要使用QQ,首先需要联网,而你和你的朋友的电脑都是冯诺依曼体系结构,在你向朋友发送消息这个过程中,你的电脑当中的键盘充当输入设备、显示器和网卡充当输出设备,你朋友的电脑当中的网卡充当输入设备、显示器充当输出设备

在这里插入图片描述
  刚开始你在键盘当中输入消息,键盘将消息加载到内存,此时你的显示器就可以从内存获取消息进而显示在你自己的显示器上,此时你就能在你自己的电脑上看到你所发的消息了。

  在键盘将消息加载到内存后,CPU从内存获取到消息后对消息进行各种封装,然后再将其写回内存,此时你的网卡就可以从内存获取已经封装好的消息,然后在网络当中经过一系列处理(这里忽略网络处理细节),之后你朋友的网卡从网络当中获取到你所发的消息后,将该消息加载到内存当中,你朋友的CPU再从内存当中获取消息并对消息进行解包操作,然后将解包好的消息写回内存,最后你朋友的显示器从内存当中获取消息并显示在他的电脑上。

在这里插入图片描述

与冯•诺依曼体系结构相关的一些知识

在这里插入图片描述
  根据冯诺依曼体系结构图,我们可以知道,站在硬件角度或是数据层面上,CPU只和内存打交道,外设也只和内存打交道。到这里我们也可以说明一个问题:为什么程序运行之前必须先加载到内存?

  因为可执行程序(文件)是在硬盘(外设)上的,而CPU只能从内存当中获取数据,所以必须先将硬盘上的数据加载到内存,也就是必须先将程序加载到内存。

常见的输入设备和输出设备(拓展):

  1. 输入设备:键盘、鼠标、网卡、硬盘、话筒、摄像头、扫描仪等。
  2. 输出设备:显示器、音响、网卡、硬盘、打印机等。

  注意: 同种设备在不同场景下可能属于输入设备,也可能属于输入设备。

  在物理层面上,各个硬件单元之间是通过总线连接的,外设与内存之间的总线叫做IO总线,内存与CPU之间的总线叫做系统总线。

总结一下:

  1. 计算机只能识别二进制,用户和计算机不能直接打交道,必须需要通过输入输出设备进行交流。关于设备,有纯的输入或输出,也有兼容输入输出设备。
  2. 中央处理器(CPU):含有运算器和控制器等
  3. 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取简单来说,所有设备都只能直接和内存打交道。

二、计算机层次结构分析

操作系统(Operator System)

  操作系统是一款管理计算机软硬件资源的软件,它向上为应用程序提供稳定的服务接口,向下为硬件提供统一的管理和调度,创造稳定可靠的运行环境。

  每个硬件设备都有其特定的功能,并能够在冯诺依曼体系下高效运行。然而,仅具备硬件功能还远远不够,因为硬件的操作需要明确的调控和协调。也就是说,何时执行何种功能,必须通过一个统一的管理者来安排,这正是操作系统和程序设计的重要作用。

在这里插入图片描述

驱动层的作用与意义

在这里插入图片描述
  上层的任何操作最终都会反馈到底层硬件,操作系统接收上层请求后,会调用相关的底层硬件。然而,由于硬件特性不同,可能会导致需要修改硬件或操作系统以适配新设备。为了解决这种问题,在软件和硬件之间引入了一层驱动层。

  驱动层是一种专门的软件,每种硬件都有对应的驱动层。它的主要作用不是直接管理软硬件资源,而是为操作系统提供统一的通信接口,让操作系统能够通过标准化的方法访问和控制硬件设备。例如,操作系统可以通过驱动层读取硬件信息或发送控制指令,而不需要关心硬件的具体实现细节。

  不论硬件如何变化,只要硬件厂商提供了合适的驱动程序,操作系统就能够正常管理和使用该硬件。

系统调用接口(system call)

在这里插入图片描述
  底层硬件的管理者是操作系统,任何涉及到访问硬盘的行为,必须通过操作系统进行访问。操作系统里面本身是对软硬件资源进行操作,所以操作系统内部会包含所有的软硬件资源。

所以有一个问题,如果出现用户想要访问某种软硬件资源数据,可不可以直接访问操作系统特定的数据呢?

  答案是不行,操作系统内部资源是十分重要的,不允许其他用户直接进行访问,避免用户造成内部资源的损坏。然而,用户仍然需要通过操作系统向底层硬件提出请求并执行操作。

  为此,操作系统设计者使用 C语言 编写了一系列内部函数接口,这些接口为用户程序提供了访问系统资源的标准服务。这些接口被称为 系统调用(System Call)。

用户操作接口

在这里插入图片描述
  由于系统调用本身的使用难度较高,普通用户直接使用系统调用可能面临复杂的操作流程和较高的技术门槛。因此,程序员通常会基于系统调用设计上层的软件或接口,通过封装特定的功能和逻辑,提供更简单、易用的服务。

三、操作系统管理

管理者决策被管理者

  我们可以举个例子方便理解:评选奖学金
  将评选奖学金的工作人员看成管理者,而参与评选的学生看成被管理者。
  如果管理者需要对于被管理者需要进行决策,决定奖学金分配。根据我们日常流程可以知道,管理者和被管理者间是不需要见面,管理者会根据被管理者数据进行相关决策。

这也说明管理的本质是通过对于数据进行管理,从而达到对于人的管理。

如何得到被管理者数据

  管理者是负责对被管理者数据进行决策,而被管理者数据是需要通过执行者去执行收集数据。由于人数过多,精力有限,不可能一一去问,所以我们可以使用EXCEL表格进行管理,但是庞大的数据量也是十分的棘手。

  管理者是老练的程序员,想到可以将自己手上的活交给编译器去做,那么将学生信息封装到结构体中,在每个结构体内部添加结构体指针用于连接其他包含学生信息的结构体,形成链表。

  管理者只需要对链表进行管理,对于学生信息数据进行增删查改转变为了对链表的增删查改。相对于Excel表可以根据链表的特点添加一些方便的接口,比如找到这一堆学生中数学成绩最好的学生。

在这里插入图片描述
  在计算机体系结构里,我们的OS就相当于管理者,我们的软硬件资源就相当于被管理者,而我们的驱动程序就相当于是执行者。

库函数与系统调用的关系

  【场景】:假如有A和B两个校长,A校长有一个学生数学特别厉害,但是B校长没有,于是B校长就想跟A校长商量借这个同学来打比赛,但是B校长肯定不能直接去找这个学生,因为这个学生是A校长的人,他得负责,所以他必须要通过A校长的同意才行。

  库函数必须通过系统调用接口才能与操作系统进行交互,从而访问底层资源。因此,库函数与系统调用呈现出上下层关系,可以理解为:

  1. 系统调用是基础层
      系统调用是操作系统提供的接口,直接与操作系统内核交互,用于访问硬件资源或执行关键的系统操作(如文件管理、进程控制等)。

  2. 库函数是封装层
      库函数建立在系统调用之上,进行二次开发,通过封装复杂的系统调用逻辑,为开发者提供更加简单、统一的操作接口。例如:printf() 是C标准库函数,但它最终调用了系统调用 write() 来实现数据输出。

  总结一下: 管理者管理被管理者,实际上是先将被管理者的各种信息进行描述,然后再将多个被管理者的描述信息根据某种数据结构组织起来,最后管理者管理被管理者实际上就是对数据结构的管理。

先描述,再组织,这是一个很重要的思想,往后我会在教学中不断提起的!!!


总结

  往下只会越来越难哦,哎,这Linux!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV的基本用法全解析

《小白入门:OpenCV的基本用法全解析》 嗨,朋友们!之前咱们知道了OpenCV在机器视觉里就像个超级厉害的瑞士军刀,那今天咱们就来好好唠唠,**OpenCV到底该怎么用呢?**这就像是拿到了一把好剑,咱们…

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,不需要任何操作,但是有一些需要知道的东西。具体如下: 1、汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站…

在 Offset Explorer 中配置多节点 Kafka 集群的详细指南

一、是否需要配置 Zookeeper? Kafka 集群的 Zookeeper 依赖性与版本及运行模式相关: Kafka 版本是否需要 Zookeeper说明0.11.x 及更早版本✅ 必须配置Kafka 完全依赖 Zookeeper 管理元数据2.8 及以下版本✅ 必须配置Kafka 依赖外置或内置的 Zookeeper …

前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer

使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件) 方案1:获取选择文本内容的最前面的字符坐标的位置(这种写法会导致如果选择超出…

生活电子常识-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型,32b模型部署在本地电脑上也能实现非常好的性能。 因此有兴趣研究了下如何在本地部署。 同时最新流行mauns工作流,他们提供一句话实现网页端任意应用的能力。实际上,你也可以用本地的模型来实现离线的ai工作流功能。…

mac丝滑安装Windows操作系统【丝滑简单免费】

mac丝滑安装Windows操作系统【丝滑&简单&免费】 记录mac丝滑安装windows系统1、安装免费版 VMware fusion 132、安装Windows镜像文件3、跳过联网安装(完成1后将2拖入1 点点点 即可来到3的环节)4、 安装vmware 工具【非常重要,涉及联网…

基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Pytorch实现之对称卷积神经网络结构实现超分辨率

简介 简介:针对传统的超分辨率重建技术所重建的图像过于光滑且缺乏细节的问题,作者提出了一种改进的生成对抗图像超分辨率网络。 该改进方法基于深度神经网络,其生成模型包含多层卷积模块和多层反卷积模块,其中在感知损失基础上增加了跳层连接和损失函数。 该判别模型由多…

Scikit-learn模型构建全流程解析:从数据预处理到超参数调优

模型选择与训练步骤及示例 1. 数据准备与探索 步骤说明:加载数据并初步探索其分布、缺失值、异常值等。 注意事项: 检查数据类型(数值/类别)、缺失值和异常值。对类别型特征进行编码(如独热编码)。 实例&…

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行,让它边下载,我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…

第2.2节 Android Jacoco插件覆盖率采集

JaCoCo(Java Code Coverage)是一款开源的代码覆盖率分析工具,适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况,生成可视化报告,帮助开发者评估测试用例的有效性。在github上开源的项目&#xff…

特征工程自动化(FeatureTools实战)

目录 特征工程自动化(FeatureTools实战)1. 引言2. 项目背景与意义2.1 特征工程的重要性2.2 自动化特征工程的优势2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化特征工程理论基础4.1 特征工程的基本概念4.2 FeatureTools库简介4.3 关键公…

Scikit-learn模型评估全流程解析:从数据划分到交叉验证优化

模型评估的步骤、scikit-learn函数及实例说明 1. 数据划分(Train-Test Split) 函数:train_test_split使用场景:将数据分为训练集和测试集,避免模型过拟合。作用:确保模型在未见过的数据上验证性能。示例&…

Spring AI相关的面试题

以下是150道Spring AI相关的面试题目及答案: ### Spring AI基础概念类 **1. 什么是Spring AI?** Spring AI是Spring框架的扩展,旨在简化人工智能模型在Java应用中的集成与使用,提供与Spring生态无缝衔接的工具和抽象&#xff0c…

C++ 学习笔记(四)—— 类和对象

1、this指针 class Date { public:void Init(Date* this, int year, int month, int day){this->_year year;this->_month month;this->_day day;this->Print();// 这就是this指针,是编译器自己加的,是用来让成员函数找到成…

SpringMVC全局异常处理机制

异常处理机制 异常处理的两种方式: 编程式异常处理:是指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 f…

深入LangChain:LLM交互机制与RAG集成的技术

本文将聚焦于 LangChain 如何集成检索增强生成(RAG),了解其架构、主要组件,以及与 LLM 的交互 LangChain 架构概览 1、基础层 这是与各类 LLM 对接的 “桥梁”。LangChain 支持多种流行的 LLM,如 OpenAI 的系列模型、H…

本地部署 LangManus

本地部署 LangManus 0. 引言1. 部署 LangManus2. 部署 LangManus Web UI 0. 引言 LangManus 是一个社区驱动的 AI 自动化框架,它建立在开源社区的卓越工作基础之上。我们的目标是将语言模型与专业工具(如网络搜索、爬虫和 Python 代码执行)相…

SQL注入(SQL Injection)攻击原理与防御措施

SQL是一种代码注入技术,可使攻击者修改应用程序向数据库提供的查询。 迄今为止,最常见和最严重的应用 程序安全威胁总是隐藏在与数据库有某些连接的网络应用 程序中。 通过这种 SQL 注入,攻击者可以绕过登录程序,获取、更改甚至更…

【算法】十大排序算法(含时间复杂度、核心思想)

以下是 **十大经典排序算法** 的时间复杂度、空间复杂度及稳定性总结,适用于面试快速回顾:排序算法对比表 排序算法最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性核心思想冒泡排序O(n)O(n)O(n)O(1)稳定相邻元素交换,大数沉底…