【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【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 的学习路上一起进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

luci界面开发中的MVC架构——LuCI介绍(二)

想要给openwrt开发应用,虽然直接可执行程序也可以运行,但是没有UI会很不方便,想要开发UI就要用openwrt的那一套,自然就是LuCI,LuCI又用了一套MVC框架,今天就讲讲这是个什么东西。 OpenWrt LuCI 界面开发中…

zyNo.25

SSRF漏洞 在了解ssrf漏洞前先了解curl命令的使用 1.curl命令的使用 基本格式&#xff1a;curl<参数值>请求地址 get请求&#xff1a;curl http://127.0.0.1 post请求&#xff1a;curl -X POST -d "a1&b2" http://127.0.0.1/(其中&#xff0c;使用-X参…

2.19学习(php文件后缀)

misc buu-后门查杀 下载附件&#xff0c;我们用火绒安全扫一下然后点击详情进入该文件所在文件夹&#xff0c;再用记事本打开该文件&#xff0c;搜索flag无果&#xff0c;再试试pass&#xff08;由题目中的密码联系到pass&#xff0c;password&#xff0c;key等&#xff09;&a…

浅谈 Redis 主从复制原理(二)

大家好&#xff0c;我是此林。 【浅谈 Redis 主从集群原理&#xff08;一&#xff09; 】 上一篇文章中&#xff0c;说到了 Redis 主从复制的全量同步和增量同步&#xff0c;repl_baklog 复制缓冲区&#xff0c;以及 slave 挂掉之后数据同步的措施。 下面介绍的上一篇遗留问…

接雨水的算法

题目 代码 # 接雨水算法 def trap(height):# 1. 特殊情况&#xff1a;数组为空 则返回0if not height:return 0n len(height)# 2. 初始化左右指针&#xff0c;左右最大值&#xff0c;结果left, right 0, n - 1# maxleft代表左边最大值&#xff0c;maxright代表右边最大值max…

【C++】list 链表的使用+模拟实现

目录 文章目录 前言 一、list的简介 二、list的使用方法 三、list的模拟实现 1.基本框架&#xff1a; 2.迭代器实现 3.常用接口实现 四、完整代码 总结 前言 本文主要介绍C【STL】容器中的 list&#xff0c;包括接口说明和模拟实现。其中讲解了迭代器功能上的分类&am…

Python游戏编程之赛车游戏6-2

3.2 move()方法的定义 Player类的move()方法用于玩家控制汽车左右移动&#xff0c;当玩家点击键盘上的左右按键时&#xff0c;汽车会相应地进行左右移动。 move()方法的代码如图7所示。 图7 move()方法的代码 其中&#xff0c;第20行代码通过pygame.key.get_pressed()函数获…

RT-Thread+STM32L475VET6——ADC采集电压

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟&#xff0c;并修改时钟树1.2 打开ADC1的通道3&#xff0c;并配置为连续采集模式(ADC根据自己需求调整&#xff09;1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…

Jupyter Notebook切换虚拟环境(Kernel管理)

我们在使用Jupyter Notebook的时候&#xff0c;打开文件发现只有一个Python3(ipykernel)&#xff0c;我们自己在conda中创建的虚拟环境为什么没有显示出来&#xff0c;今天我就来和大家一起讨论一下&#xff01; 在 Jupyter Notebook 中&#xff0c;kernel 是执行代码的核心。管…

Ubuntu 22.04 Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…

mysql的源码包安装

安装方式一&#xff1a;&#xff08;编译好的直接安装&#xff09; 1.添加一块10G的硬盘&#xff0c;给root逻辑卷扩容 &#xff08;下面安装方式二有&#xff0c;一模一样的装就行&#xff0c;我就不写了&#xff0c;再写的话篇幅就太长了&#xff09; 2.下载编译好的源码包…

内网网络安全的解决之道

本文简要分析了企业内部网络所面临的主要分析&#xff0c;阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状&#xff0c;并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全&#xff…

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

Orange 单体架构 - 快速启动

1 后端服务 1.1 基础设施 组件说明版本MySQLMySQL数据库服务5.7/8JavaJava17redis-stackRedis向量数据库最新版本Node安装Node22.11.0 1.2 orange-dependencies-parent 项目Maven依赖版本管理 1.2.1 项目克隆 GitHub git clone https://github.com/hengzq/orange-depende…

在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)

在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 安全性风险&#xff1a;内外网直连可能导致病毒传播、数据泄露。 操作繁琐&#xff1a;传统方式需频繁切换网络环境&…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么&#xff1f; Unity 是一款广受欢迎的跨平台游戏开发引擎&#xff0c;由 Unity Technologies 公司开发并推出。它以强大的功能和易用性&#xff0c;在游戏开发领域占据着举足轻重的地位&#xff0c;甚至可以说&#xff0c;它改变了游戏开发的格局。凭借其出色的跨…

骁勇善战的量化利器:多因子模型【量化理论】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 风险模型雏形 股票因子受多种因素影响&#xff0c;其价格由多种因素决定&#xff0c;所谓的多因子策略就是要发掘诸如此类的因子&#xff0c;以一种合理的方…

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门&#xff1a;DeepSeek 在这里主要介绍DeepSeek的两种部署方法&#xff0c;一种是调用API&#xff0c;一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘&#xff0c;不要放c盘 3.进入软件后…