【Linux取经路】冯诺依曼结构体系与操作系统的碰撞

在这里插入图片描述

文章目录

  • 一、冯诺依曼体系结构
    • 1.1 硬件介绍
    • 1.2 内存的重要性
  • 二、操作系统
    • 2.1 设计操作系统的目的
    • 2.2 操作系统是如何进行管理的?

一、冯诺依曼体系结构

我们现在常见的计算机,如笔记本,以及我们不常见的计算机,如服务器,它们本质都是一堆硬件(如:cpu、内存、网卡、磁盘等)的集合。并不是把这些硬件毫无章法的放在一起就能够组成计算机,各硬件之间首先要具备协同能力,这就要求硬件与硬件之间要组织好,构建成一个系统,这样才能对外提供计算输出服务。

我们现在常见的计算机,大部分都遵守冯诺依曼体系

在这里插入图片描述

1.1 硬件介绍

📖输入、输出设备的理解
首先,计算机是为了给用户提供计算服务的。前提条件是,用户需要先把数据交给计算机,但是计算机只认识二进制0和1,并且是以各种电路信号来控制的,而用户的数据一般都是文字、图片、音频等,此时就需要有一些设备,能够把用户的数据转换成二进制,然后再交给计算机。这就决定了,用户是无法直接访问到内存、中央处理器等硬件,必须要经过输入设备。例如通过键盘上输入字母abcd,在用户看来,输入的是一个个的字符串,但在计算机看来,我们只是输入了一串01序列。计算机运算完毕时,也只能输出二进制,为了将这些二进制结果转换成文字、图片等用户可以看懂的形式,就需要经过输出设备的处理。因此,输入、输出设备一般是用来进行人和计算机,计算机和计算机之间互相传递信息的外部设备。

输入设备:鼠标、键盘、摄像头、磁盘、网卡等
输出设备:显示器、播放器硬件、磁盘、网卡等

小Tips:需要注意,磁盘属于外部设备,计算机可以从磁盘中读取数据进行运算,也可以把运算结果写入到磁盘当中。

📖存储器
这里的存储器就是我们平时所说的内存,它是一种硬件级别的缓存空间,在冯诺依曼体系结构中占据核心地位。

📖中央处理器CPU
中央处理器也叫做CPU,它由运算器和控制器共同组成。在不考虑缓存的情况下,CPU只能对存储器(内存)进行读写,不能访问外设(输入、输出设备)。其中运算器是对用户输入的数据执行计算任务,分为算数运算和逻辑运算,前者就是加减乘除,后者就是真假判断。控制器是对计算过程,即硬件流程进行控制,协调各组件与各单元间的工作。

📖总线概念
冯诺依曼体系结构中涉及的五大模块,输入设备、存储器、运算设备、控制器、输出设备,都是独立的个体,有各自独立的功能,这些独立的个体要共同组成一个计算机,就必须要将它们组织联系起来。输入设备需要把数据交给内存,CPU再从内存中读取数据进行运算,将运算结果再写入内存,内存最终再把数据交给输出设备,为了实现数据在五大模块间的流动,就需要把用“线”把各个硬件单元连接起来,这个“线”在计算机中就被称作总线,总线可分为系统总线和IO总线。前者是用于连接CPU和内存,后者是连接内存和外设(输入、输出设备)。有些总线在我们拆开计算机后可以直接看到,有些则是直接集成在硬件电路上。

1.2 内存的重要性

冯诺依曼体系结构要求,数据必须先从输入设备写入存储器,CPU再从存储器读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入存储器,再从存储器中将结果刷新到输出设备。

📖为什么CPU只能和内存打交道?
在一台计算机中,可以用来存储数据的硬件有多种,例如:寄存器、缓存、内存、硬盘、网盘等,它们按照访问速度的快慢形成了一个存储金字塔,如下图所示:在这里插入图片描述
寄存器的读取速度是纳秒级别,内存的读取速度是微秒级别,外部设备(磁盘)的读取速度是毫秒级别的。由于CPU和外设之间的速度代差比较大,如果将CPU与外设直接进行连接,那么在木桶效应的影响下,会导致计算机整体的运算速度下降。
在这里插入图片描述
如果CPU直接和外设连接,尽管CPU的运算速度再怎么快,计算机整体的运算能力也会被外设的读取速度所限制。因此为了降低木桶效应对计算机整体运行速度的影响,引入了一种速度和容量都比较合适的存储设备——内存,冯诺依曼体系结构要求CPU只能和内存进行数据交互。

内存除了读取速度比较快以外,它还起着第三方中转站的作用,即我们可以把数据从输入设备先预加载到内存,等CPU空闲了,再直接到内存读取数据即可。CPU的运算和内存从外设读取数据是可以同时进行的。内存的工作就像菜鸟驿站,寄给我们包裹可以暂存在菜鸟驿站,等我们工作结束有空了再去将包裹取回来,假设没有菜鸟驿站,包裹就必须直接寄到收件人的手上,那就只能等收件人在家的时候再寄包裹。内存也是同理,假设没有内存,外设与CPU直连,那此时外设就只能等CPU当前的运算结束后,才能继续将数据喂给CPU。

小Tips:操作系统保证了CPU的运算和IO可以同时进行。

📖一个程序要运行,必须先加载到内存
以我们写的.c源文件为例,我们代码写好后,需要先编译生成一个.exe结尾的可执行程序,然后才能运行。我们写的源文件,以及编译得到的可执行文件,它们都是存在磁盘(外设)上的。运行就是让CPU来执行我们的代码,对我们的数据进行运算,而根据冯诺依曼体系结构的要求,CPU只能从内存中拿数据,因此就决定了,一个程序想要运行,就必须先加载到内存。

所有的软件设计,都必须遵守硬件结构,硬件是我们整个计算机的下线和边界,软件是上线和天花板,只要是硬件要求,所有的软件都必须要遵守。即所有的软件要想运行,必须先把数据加载到内存。

现在再来看我们之前写的进度条小程序,在不加\n的时候,输出信息会暂时存储在缓冲区中,只有当我们主动去刷新缓冲区才能把数据输出到显示器(外设)上。缓冲区就是内存的一部分,上面的现象就是冯诺依曼结构体系的侧面印证,CPU会将运算的结果先写入到内存,然后外设再从内存中拿数据。

小Tips:外设和CPU在数据层面不会直接交互,但是在信号控制阶段,CPU和外设是可以直接进行交互的。

📖QQ聊天时的数据流动
在这里插入图片描述
QQ聊天的第一步是打开QQ这款软件。在春人看来,打开QQ这款软件,就是点击它的应用图标,但是在计算机看来,本质上是把QQ这个可执行程序加载到内存当中,此时CPU就可以从内存中读取数据进行运算啦,运算的结果在春人看来,就是显示出了QQ的应用界面。

在这里插入图片描述
接下来,春人点开和你的对话框,通过键盘输入了“你好呀,伙计!”。因为这个对话框是QQ的,此时QQ已经被加载到了内存当中,所以春人通过键盘输入的内容,本质上会被加载到内存中。接下来CPU就闪亮登场啦,它从内从中将春人想要发送的消息拿出来,进行一系列的打包运算,再把它交还给内存,然后内存会将这个包交给输出设备(这里是网卡、显示器),输出设备再将包通过网络就可以发送给对方啦。

对方的计算机,要通过网卡从网络中获取春人发送的消息,此时网卡又充当了输入设备,网卡拿到的数据必须先交给内存,CPU从内存中把数据拿出来进行解包将结果再写入到内存,内存再将数据刷新到输出设备(显示器),此时你就能看到春人发送的消息啦。

二、操作系统

上面我们提到了很多硬件设备,如键盘、显示器、网卡、CPU等等,它们都有各自独特的功能,可以完成不同的工作,它们就像是一个个的工具,最终要被使用就必须要有一个角色将它们管理起来,该角色能够在合适的时间去使用合适的工具,操作系统就充当了这个角色。

操作系统的定位是:一款纯正的“搞管理”的软件。

📖概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括下面两个部分:

  • 内核(进程管理、内存管理、文件管理、驱动管理)

  • 其他程序(例如函数库、shell程序等等)

小Tips:我们把这种包含其他程序的操作系统概念称为宏观上的操作系统,微观上操作系统的概念只包括内核。

2.1 设计操作系统的目的

  • 与硬件交互,管理所有的软硬件资源。

  • 为用户程序(应用程序)提供良好的执行环境。

这两点相辅相成,我们需要从一下几个方面来深入理解。

📖计算机的层状结构
在这里插入图片描述
📖什么是驱动程序?
所有的硬件要想被软件去访问,都必须配上相应的驱动程序,没有驱动程序是无法使用硬件的。举个例子:在电脑刚开机的时候,我们的鼠标,键盘虽然在物理上已经和电脑建立起了连接,但并不是直接就可以使用,往往需要等上几秒,等待的过程就是加载驱动的过程。所有的硬件都有它自己的驱动程序,一般的驱动程序操作系统会自带,也有的需要我们自行下载。

📖操作系统为什么要进行软硬件资源的管理?
以银行为例,在银行中有保安、保洁阿姨、柜员、行长等几种角色,其中保安负责维护银行秩序,保洁阿姨负责银行的卫生,柜员负责办理业务,行长负责管理银行的各种事务。前三种角色就对应计算机中的各种硬件,行长就对应于计算机中的操作系统。假如行长不履行他的管理职责,那么这家银行就很可能出现,安保措施不到位,柜员办理业务不积极,保洁阿姨不认真打扫卫生等各种问题,反正行长啥也不管,大家都开始摆烂,这样就会导致客户体验变差,大家都不想再到这家银行办理业务。

计算机也一样,假如操作系统不对各种软硬件资源进行管理,那么用户在使用该电脑的时候,就可能出现一会儿蓝屏、一会儿卡顿、一会儿没声音等各种各样的问题,这样一来会导致用户体验变差,最终就没有人想用这台电脑。而电脑作为工具,生产出来的目的就是让用户使用,因此操作系统对软硬件资源的管理,本质上是为了给用户提供一个良好的运行环境,这里的良好包括不限于稳定、高效、安全。

📖系统调用接口的理解
用户在计算机上的各种操作,最终都会被转换成硬件行为,例如用QQ发送消息,本质上会调用键盘、显示器、网卡等硬件设备;听歌,本质上会调用音响设备。这些硬件都是由操作系统进行调度的,这就意味着,当我们想用计算机干一些事情的时候,必须先经过操作系统。但是我们作为用户是无法直接去和操作系统进行交互的,因为操作系统本质是一款软件,它里面也会有各种信息,它不希望用户直接对这些信息进行随意的访问改动,因此操作系统为了保证自己的数据安全,也为了保证给用户能够提供服务,操作系统以接口的形式给用户提供调用的入口,来获取操作系统内部的数据。就像银行不允许我们直接到金库去拿钱一样,它给我们提供了很多办理业务的窗口,我们只能通过窗口去取钱,操作系统也是这样,我们只能通过系统调用接口去和操作系统进行交互。
在这里插入图片描述
操作系统是用C语言写的,所谓的接口本质上就是操作系统提供的一个函数,这个函数是在操作系统的内部具体实现的。既然是函数调用,那就需要有参数和返回值,就像去银行取钱,我们要把自己的身份证、银行卡等证件交给柜员,柜员确认无误后再将钱交给我们,系统调用接口也一样,它会对用户传递的参数进行合理性检查,确认无误后操作系统再去执行相应的操作,这样既保护了操作系统,也为用户提供了服务。

有了这些系统调用接口,就允许用户对底层的软硬件资源进行间接的管理。用户可以通过系统调用接口去要求操作系统调用某个硬件设备,所以就可以基于系统调用接口来设计实现各种各样的软件,例如shell外壳程序,用户可以在上面执行指令,而指令本质上也是可执行程序存储在磁盘上,要执行指令就需要把可执行程序从磁盘加载到内存,把数据从磁盘加载到内存这个动作,本质上是shell外壳程序调用系统接口来实现的。

直接使用系统调用接口是比较困难的,因此有人又对系统调用接口进行了上层封装,例如我们C语言中平时使用的scanf,它可以从键盘中读取数据到内存,本质上是scanf函数中通过系统调用接口去访问硬件。在同一台计算机上可以使用不同的编程语言来开发,这些语言只要是涉及到硬件的,都是通过系统调用接口来实现的,所有的语言都是在系统调用接口之上的。因此,语言可以发生变化,但是系统调用接口是永远不变的。我们把这种基于系统调用接口的开发,称作系统编程。

📖总结

  • 在开发角度,操作系统对外会变现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用,它是操作系统的一部分。

  • 系统调用在使用上,功能比较基础,对用户的要求也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或开发者进行二次开发。

  • 库函数和系统调用之间是上下层的调用和被调用的关系,库函数在上,系统调用在下。

2.2 操作系统是如何进行管理的?

📖如何理解管理?
以校园管理为例,校长作为学校的管理者,学生作为被管理对象,那校长是如何管理学生的呢?每个学校都有自己的教务系统,教务系统里面存储了学生的各种信息,如姓名、学号、年龄、考试成绩、挂科情况等等。要评选奖学金的时候,校长只需要在教务系统中依据每个学生的成绩排个名,根据排名就可以把奖学金发给对应的学生。一名学生因挂科次数过多需要勒令退学,也是校长在教务系统中查出来的,退学只需要把该学生的信息从教务系统中去掉就可以,校长并不需要亲自告诉张三“喂,你小子因为挂科太多被退学啦”。校长并没有和学生见面就完成了一些列的管理任务。因此我们可以得出下面的结论:

  • 管理者和被管理者并不需要见面。

  • 管理本质上是对信息(数据)进行维护。

管理学生本质上就是对学生各种信息的管理,那校长是如何知道学生的各种信息的呢?答案是通过执行者,在学校里辅导员就扮演者这一角色,相信大家都遇到过辅导员发了一个在线表格,要求我们在几点前填完,这个表头全是我们的一些信息,这个过程就是辅导员作为执行者,去完成管理者(校长)安排的任务。

管理者和执行者的本质区别在于,管理者拥有决策权,而执行者是没有决策权的,执行者只能按照管理者的要求去执行任务。
在这里插入图片描述

回到计算机,操作系统就相当于是校长,属于管理者;驱动程序就相当于是辅导员,属于执行者;硬件就相当于学生,属于被管理者。因此操作系统是通过驱动程序来获取到硬件的各种信息,以实现对硬件的管理。比如说网卡在使用的过程中发生了故障,那么驱动程序会把错误信息报告给操作系统,操作系统能解决了当然是最好的,操作系统解决不了加把信息报告给用户,提示用户需要更换网卡。

📖操作系统是如何维护硬件信息的?
上面我们知道了管理的本质就是对信息的维护,那操作系统是如何对硬件信息进行维护的呢?首先我们需要定义一个结构体,结构体里面是硬件设备的各种属性,这样以来,一个结构体对象就表示一个硬件,计算机中的所有硬件都可以在操作系统中以结构体对象来描述,接下来需要把这些结构体对象组织起来,一般采用链表或其他高效的数据结构。至此,操作系统对硬件设备的管理就变成了对一个链表的管理。

结论:计算机对硬件设备的管理,分为以下两步:

  • 先描述:用struct结构体。(因为操作系统使用C语言写的)。

  • 再组织:用链表或其他高效的数据结构,将描述硬件设备的结构体对象组织起来。

小Tips:操作系统对硬件设备的管理最终都会转换成对某种数据结构的增删查改。这种管理方式就决定了操作系统中含有大量的数据结构。


🎁结语:
 今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是春人前进的动力!
在这里插入图片描述

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

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

相关文章

【ES】笔记-let 声明及其特性

let 声明及其特性 声明变量 变量赋值、也可以批量赋值 let a;let b,c,d;let e100;let f521,giloveyou,h[];变量不能重复声明 let star罗志祥;let star小猪;块级作用域,let声明的变量只在块级作用域内有效 {let girl周杨青;}console.log(girl)注意:在 i…

18 | 基于DDD的微服务设计实例

为了更好地理解 DDD 的设计流程,这篇文章会用一个项目来带你了解 DDD 的战略设计和战术设计,走一遍从领域建模到微服务设计的全过程,一起掌握 DDD 的主要设计流程和关键点。 项目基本信息 项目的目标是实现在线请假和考勤管理。功能描述如下…

springboot房地产管理java购房租房二手房j客户sp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 springboot房地产管理 系统1权限:管理员 …

回归决策树模拟sin函数

# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…

MongoDB文档-进阶使用-MongoDB索引-createindex()与dropindex()-在MongoDB中使用正则表达式来查找

阿丹: 之前研究了MongoDB的基础增删改查。在学会基础的数据库增删改查肯定是不够的。这个时候就涉及到了数据库搜索的时候的效率。需要提高数据的搜索效率。 MongoDB索引 在所以数据库中如果没有数据索引的时候。如果需要查找到一些数据。都会去主动扫描所有可能存…

一键翻译,实现文件名简体中文转日语的便捷改名!

您是否曾经遇到过想要将文件名从简体中文翻译成日语,却苦于没有合适的工具?现在,让我们为您介绍一款便捷的解决方案——文件名简体中文转日语翻译工具! 首先,第一步,我们需要打开文件批量改名,…

ip网络广播系统网络音频解码终端公共广播SV-7101

SV-7101V网络音频终端产品简介 网络广播终端SV-7101V,接收网络音频流,实时解码播放。本设备只有网络广播功能,是一款简单的网络广播终端。提供一路线路输出接功放或有源音箱。 产品特点 ■ 提供固件网络远程升级■ 标准RJ45网络接口&…

CommStudio for .NET Crack

CommStudio for .NET Crack CommStudio for.NET使您的应用程序可以轻松地使用串行端口和调制解调器进行通信。CommStudio for.NET是一套全面的组件和可视化调试工具,可将远程系统和设备与visual Studio 2005和visual Studio 2008集成。开发与遗留系统和外部设备集成…

02_kafka_基本概念_基础架构

文章目录 常见的消息队列工作模式基本概念kafka 特性Kafka 基本架构topic 分区的 目的/ 好处 日志存储形式消费者,消费方式 逻辑消费组 高性能写入: 顺序写 mmap读取:零拷贝DMA 使用场景 常见的消息队列工作模式 至多一次:消息被…

AirPods 充电接触不良问题修复

AirPods 充电接触不良问题修复 问题现象 从充电盒拿出耳机,一只耳机电量不满甚至完全没有电放入充电盒不充电,指示灯是绿色而非橙色多次尝试耳机能充电,但是合上盖子就无法充电 如果你的耳机出现上述症状,基本就是耳机充电接触…

mac电脑访问windows共享文件夹连接不上(设置445端口)

前提:首先需要保证mac和windows都在同一局域网内,如果不在肯定是连不上的,就不用往下看了。 事情是这样的,公司入职发了mac电脑,但是我是window重度用户,在折腾mac的过程中,有许多文件需要从wi…

c++之STL详解

c之STL详解 泛型编程什么是STLSTL发展STL组件容器类型成员适配器STL迭代器STL算法顺序容器向量vector双端队列双端队列实现列表listc关联容器cmapmultimapsetmultiset迭代器函数对象集成函数对象自定义函数对象标准c库中算法STL算法头文件标准函数泛型算法例子自定函数作为算法…

机器学习深度学习——卷积神经网络(LeNet)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——池化层 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 卷积神…

JMeter源码解析之结果收集器

JMeter源码解析之结果收集器 一、JMeter结果收集器概述二、单机模式三、分布式模式四、总结 一、JMeter结果收集器概述 JMeter是在压力领域中最常见的性能测试工具,由于其开源的特点,受到广大测试和开发同学的青睐。但是,在实际应用过程中&a…

数据结构 | 搜索和排序——搜索

目录 一、顺序搜索 二、分析顺序搜索算法 三、二分搜索 四、分析二分搜索算法 五、散列 5.1 散列函数 5.2 处理冲突 5.3 实现映射抽象数据类型 搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回True或False,分别表示元素是否存在。有时&a…

LeetCode 热题 100 JavaScript--142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数…

HDFS架构刨析

HDFS架构刨析 概述HDFS架构图整体概述主角色:namenodefsimage内存元数据镜像文件edits log(Journal)编辑日志 从角色:datanode主角色辅助角色:secondarynamenode 重要特性主从架构分块存储机制副本机制namespace元数据…

快速搭建MQTT测试环境,手把手详细教程

文章目录 前言系统架构准备工具代理服务器客户端客户端 TEST-1客户端 TEST-2 验证消息传递订阅主题发布主题 前言 大家好,我是麦叔,之前有小伙伴建议出一期如何快速搭建一个MQTT协议的测试环境,这里要合理地使用现有的工具,其实很…

ubuntu18.04安装docker及docker基本命令的使用

官网安装步骤:https://docs.docker.com/desktop/install/ubuntu/ docker快速入门教程 Ubuntu-Docker安装和使用 docker官网 docker-hub仓库 1、常用指令 (1)镜像操作 # ############################# 以nginx为例 docker images docker p…

五分钟帮您理解Linux网络核心知识点——socket和epoll

关于linux网络相关的基础知识点,最热的两个就是socket和epoll,接下来我就用最简单的方式把他俩说清楚便于大家理解! Socket Socket 是一种进程间通信的方法,它允许位于同一主机(计算机)或使用网络连接起来…