当前位置: 首页 > news >正文

Linux——系统操作前言:冯诺依曼体系结构、全局理解操作系统

文章目录

  • 系统操作前言
    • 冯诺依曼体系结构
      • 结构认识
      • 数据流动过程
        • 体系结构导向
        • 数据传输本质
        • 设备角度理解
        • 数据流动示例
    • 操作系统(Operator System)
      • 操作系统的本质
      • 设计OS的目的
      • 如何理解管理
      • 系统调用和库函数

系统操作前言

本篇文章开始将正式进入Linux系统的系统层面的学习。在之前学的更多是基础指令和一些基础开发工具,是基础知识。有了这些基础知识后,我们才能更好地学习后面的内容。

本部分将重点来看看系统学习的前言——冯诺依曼体系、对操作系统的深刻理解。目标就是了解并且学习到冯诺依曼体系的思想,以及该体系结构下的操作方式。这也是当今绝大部分电子设备的基础体系架构。同时我们将宏观地来理解操作系统地含义,以便我们对后序地学习有一个大概的认知。

冯诺依曼体系结构

首先我们来了解一下一个重要的内容——冯诺依曼体系结构。

我们的计算机,哪怕是不常见的计算机(如云服务器等),哪怕是一些电子设备,其实他们地基础结构都是尊从着冯诺依曼体系结构的。由此可见,冯诺依曼体系结构是多么的厉害。

在这里插入图片描述
上图为冯诺依曼体系结构的示意图。

当然,现在的电子设备可能会比这个复杂一些。但是基本的大框架还是不会变的,就是冯诺依曼体系结构。我们现在一起来了解一下。

结构认识

**第一点:**计算机必然是有输入和输出设备的。这是毋庸置疑的。因为我们使用计算机的本质其实就是操作计算机的输入输出。比如我们使用键盘输入一些字符,计算机内部会通过一些操作转化为看得懂的二进制码,然后再经过一定的处理将二进制码转化为对应的字符打印在输出设备上(如显示屏)。这样子我们就能看得到我们打的字。

输入设备其实有很多种,如键盘、鼠标、磁盘、网卡、摄像头、话筒…
本质上都是通过输入一些信息(信号)给计算机处理。
输出设备也有很多:如显示器、打印机、网卡、磁盘…
本质上是将输入信号经过处理输出到输出设备上。

当然有些设备即是输入设备,也是输出设备。如网卡、磁盘等。所以到这里我们就初步明白了一件事情,即使用计算机,本质上就是操作计算机输入输出的过程。这个过程被称作IO操作(Input/Output),所以我们常说的IO操作本质上就是输入输出。


**第二点:**计算机被分为几个重要组成部分:
1.外设:即我们上面的讲的一些看得见的输入输出设备。这些统称为计算机的外设。

2.内部结构:
内部结构又被细分为两个部分——存储器和CPU。
存储器部分其实就是我们经常说的内存。即计算机内部的存储。CPU,也称中央处理器,也就是俗称的芯片。CPU由控制器部分和运算器部分组成。

其实冯诺依曼体系结构就是要告诉我们一个电子设备的基础结构就大致是上面那个样子的。电子设备内部是一个又一个的硬件。硬件需要按照冯诺依曼体系结构进行排列,硬件之间通过一定的关系进行控制。这是一个伟大的结构。

数据流动过程

我们仔细观察以下冯诺依曼体系结构图,我们会发现该结构大致有两个过程。一个是硬件之间的控制过程,即控制信号的流动过程。还有一个是数据信号的流动过程。
本部分将重点了解一下数据流动过程。控制信号的大部分内容是硬件层面上的。这里我们只需要做一些简单的了解即可。

我们先输出一个结论:
所有的软件都是必须先加载到内存上再运行的。

但是注意这里我们不要搞混概念。手机的内存和电脑的内存不是一个东西。
手机内存和电脑的硬盘(磁盘)是一个东西,类似于存储仓库。
手机的运存和电脑的内存是一个性质的,类似于临时工作站。即设备数据需要先存放在这个临时工作站上,然后CPU才能进行一些读写操作,处理数据。这点我们需要注意一下。


体系结构导向

我们先以结果论来看,我们观察冯诺依曼体系结构,我们会发现,电脑的数据流动方向是:
从输入设备将内容/数据输入,传递到存储器(内存),CPU会从内存中读取数据并处理数据。将处理好的数据再返回到内存当中。最后,经过处理的数据会传输到输出设备上。

从结构图我们可以清楚地看到,数据整个的流动过程是必然离不开内存这一关的。输入的数据必须先放在内存,输出的数据也是经过处理后放在内存。这本质上的原因就是因为中央处理器CPU只在内存中做读取和写入操作。中央处理器不能直接和外设相连。正是因为这样的体系结构,导致了这种情况。

数据传输本质

上面我们已经大致了解了数据的流动过程了。这里我们需要知道数据流动的本质是什么。
外界输入设备输入数据,然后传输到内存。其实本质上就是数据的拷贝。

CPU所谓的读写内存中的数据,其实也就是将数据进行拷贝而已。所以本质上,数据的流动,其实就是拷贝数据的顺序。由此可知,计算机的运行速度取决于数据的拷贝速度。我们先了解这一点,这点对我们后面理解冯诺依曼体系结构的设计原因有很大的帮助。

设备角度理解

虽然一台计算机中有很多的设备,但是每台设备的运行速度是不一样的。
在这里插入图片描述
上图是常见设备的存储容量和运行速度的分布。

我们会发现一个规律,即设备运行速度越快的,存储容量越小,价格月贵。运行速度较慢的,存储容量反而会越大,价格越低。
这充分应证了前面说到的——不同设备之间的数据处理速度有差异。

类似于木桶原理,一桶水最多存储的水量取决于桶里面的短板。在计算机内部也是一样的,计算机运行的速度是取决于运行速度最慢的那个设备。

这时候就涉及到一个问题,电脑是个性价比产物。为了能够让人人都用的起,又需要大量的存储空间,所以存储器必然是选择造价便宜的。那这会导致下面这个问题:
在这里插入图片描述
如果去掉内存,直接让CPU和输入输出设备交互。由于CPU内部用的是寄存器等高速处理数据的器件,所以和输入输出设备等处理速度差了几个数量级(假设CPU处理速度为纳秒级别,输入输出设备为毫秒级别)。这个时候由于差了几个数量级,导致产生了速度差。有时候CPU处理完输入数据了,但是输入设备还没有办法输入数据。这会导致很大的问题。

但是引入了内存就不一样了,输入数据放内存,CPU只读写内存中的数据。所有的操作都必须经过内存,这样子其实就达到了一个适配器的效果。很巧妙地处理了设备之间的速度差。

可能会有人问,输入设备输入数据到内存不也是需要那么多时间吗?这怎么适配呢?其实很简单,通过一些特定算法,提前的将输入数据全部导入到内存中后CPU再进行处理。这样子就解决上述的问题了。

所以通过上述内容,我们就清楚地认识到,为什么需要内存这个部分。也明白了冯诺依曼体系的作用和优势,理解了数据经过内存的意义。


数据流动示例

现在我们来稍微地模拟一下数据流动的场景。我们就以聊天软件为例子。

我们前文提到过,所有的软件运行的时候,必须先加载到内存,也就是说,我们所有的登录信息,操作内容等一系列信息都必须先加载到内存上。假设现在有两个人要线上聊天,一个人在广州,一个人在北京,那应该是怎么样操作的呢?

聊天软件其实搭载在计算机上,其实就是两台具有冯诺依曼体系结构的设备在互发信息:
在这里插入图片描述
假设是从广州发信息给北京的人。其实就是广州这边的输入设备(可能是键盘输入文字,也有可能是磁盘中要发送的文件)。发送文件可以使用拖拽到聊天界面发送,但这是经过图形化界面处理的,背后调用的还是输入的相关接口。

然后将输入加载至内存先,然后经过CPU的处理后,通过输出设备网卡上传至网络。另一方的输入设备此时就是网卡,会从网络中接收信息,然后经过内存被CPU处理后发送到接收方的输出设备上。只不过聊天软件做了一些处理,发送方也能看到自己发送的信息,本质是发送方的输出设备多了一个显示器而已。

由上面我们就更进一步地了解了冯诺依曼体系结构的实际用处,以及其独特的优势。

操作系统(Operator System)

本部分将重点谈谈操作系统的一些重要的概念。将会从整体的角度来看待操作系统,对操作系统有进一步地认识。为后续学习做铺垫。

操作系统的本质

操作系统的本质其实就是个程序的集合。我们可以把它看成是一个管理硬件和软件的一个软件。所以本质上来说,操作系统就是个软件。

操作系统分为广义上的和狭义上的:
狭义上的操作系统其实是操作系统内核(Kernel),内核也就是专门用来管理进程、文件、内存、线程、驱动等操作的一个系统。但是这个我们在初步认识Shell的时候就讲过,用户是不允许直接接触内核的。一方面是内核的操作河很难,对使用者要求高。另一方面也是为了保护内核,防止受到恶意攻击。

而且内核的一些操作对于用户来说是很难使用的。就比如简单的printf函数,里面涉及到了很多内容:缓冲区、IO输入输出、还要懂一些硬件方面的知识(输入到显示器,输出到显示器)。所以直接用内核是很难的。基于此,其实真正要使用操作系统是需要加一层”外壳“程序的。

比如Android系统,我们都知道是基于Linux内核开发的。但是Android系统在Linux内核上套了一层,做了优化。然后此时就又有了基于Android的开发,比如以往各个厂商手机的OS,都是在Android的基础上再套一层,做一些优化的。

所以广义和狭义操作系统的关系如下所示:
在这里插入图片描述
比如我们见到的Windows GUI,其实并不是直接使用Windows内核的。而是经过一些封装优化后,再用图形化界面封装的一个外壳。本质上我们的操作,背后都是要交到内核处理的。

这里统一一下说辞,后序说到的”操作系统“都是内核,即狭义上的操作系统。

设计OS的目的

我们先来看软硬件体系结构:
在这里插入图片描述
上图就是计算机的软硬件体系结构。
我们会发现,这个体系结构是层状的,而且操作系统就处在中间层,承上启下。

操作系统,对上需要对用户提供良好的程序执行环境。对下与硬件交互,管理软硬件资源。
由上面的软硬件体系结构可以知道:
1.软硬件体系结构为层状,操作系统(内核)。
2.如果需要访问硬件,必然是贯穿了整个结构。
3.用户不能直接访问操作系统和底层硬件,需要通过系统调用层提供的接口访问。
4.上层的库可能是封装了系统调用的。

同时我们会发现,这个结构有一个特点,即“高内聚,低耦合”。
意思就是,功能类似的代码和接口会放在一起,这个叫高内聚。但是不同层之间的功能差别是很大的,不能直接相互访问,必须通过提供的特定接口进行访问,这是低耦合。

这个就好比我们以往写c++代码,一开始是把所有功能写在main函数内。但是这样子并不是一个很好的习惯,一旦修改一个地方很多地方需要一起修改,而且代码可读性很差,而且不利于重复使用。后面就学习了使用函数把相同的代码用函数封装、或者是后面又学到的继承、多态等进行进一步封装。这样子就只需要根据特定的功能进行修改就可以了。

高内聚,低耦合的思想是非常重要的。可以说是工程中最重要之一。哪怕是放到硬件层面上也是如此。比如组装台式电脑,各个配件都是不同的厂商之间生产的。但是却可以拼在一起使用,也可以在不影响其他配件的情况下更换一个配件。这不就是高内聚,低耦合嘛。

所以,设计OS的目的本质就是为了更好的服务于用户和管理底层的一些软硬件。

如何理解管理

管理的本质:管理 = 决策 + 执行 + 执行对象。
就好比我们在学校,校长是管理者,他是需要做出决策的。辅导员或者下面的一些职工就是听从校长安排的,做执行工作。学生就是被执行的对象(管理学生)。

这里我们可以知道的是:
1.管理者并不需要和被管理者直接接触。比如校长管学生不需要见学生,发布通告即可。
2.管理者所谓的管理,其实就是管理”数据“。
3.数据是从中间层拿来的。

上述的三者就好比上面的软硬件体系结构。校长是用户,需要管理计算机上的一些资源。但是他不需要直接和学生(底层软硬件)直接接触,只需要告诉辅导员做什么(操作系统内核),然后辅导员就会根据相关要求做一些安排。这个原理和操作系统的原理是差不多的。


假设有个校长需要做管理工作,他并不需要直接基础学生。只需要管理学生的一些相关数据即可。这些数据可以从中间层的辅导员获取。

在学生不多的情况下,校长可以通过表格的形式,把每个学生的相关信息记录在表格内。然后根据表格内的信息来进行学生管理(处分、开除、嘉奖、推荐参加比赛)等工作。这固然可以。如果用户管理的计算机中底层软硬件不多,确实可以这么管理。

但是这样子非常麻烦,而且数据量特别大的情况下根本行不通。
这个时候就采用一种思想“先描述,后组织”来进行数据管理。

比如管理大量学生,就是管理学生数据。刚好我们知道,c中的结构体或者c++中的类就是可以一次性地将一些信息记录在一个变量内。所以此时就有了大量学生信息的变量。但是这些变量都是单独的,不好管理。所以可以尝试使用像链表等数据结构进行管理数据。这样子就很方便对这些数据进行管理了。
这样子,就可以将管理学生轻松的转向管理学生的相关数据,在转到管理数据结构了。这就是先描述,后组织的思想,世界上很多事情都是这样子的。包括操作系统。

本质上,用户在管理一台计算机的时候,不需要直接接触底层的软硬件,这些工作交给操作系统做就可以了。而操作系统的底层软硬件也是有很多信息的,它们也可以依照某种方式组成一个结构,操作系统只需要根据这个数据结构进行相应的管理即可,这是十分方便的。

这也就是c++为什么要面向对象的原因。而且后来的很多语言都是面向对象。因为更多时候,我们并不关心过程。而是需要针对于对象做出一些操作。而这些操作我是不关心的,只需要会使用对应的方法即可。这个世界上万物都可以被抽象成对应的方法,我们只需要根据各个方法的组合进行操作即可。
也就是说,我们不需要自己造轮子。这些对应的轮子早已经被包含在库里面,我们只需要会用就可以。这也就是为什么会有STL库的原因。

系统调用和库函数

这里再来谈谈什么是系统调用和库函数。我们前面讲过,有些库其实也是封装了系统调用的。

操作系统(内核)是不允许用户直接访问的。但是又需要提供服务给用户。这个就好比我们去银行取钱,银行是得拿钱给存户。但是又不能相信客户直接让他去钱库里面拿钱。所以这个时候就需要设置一些窗口,为客户提供一些相关的业务。
系统层面也是一样,所以会有一些专门的接口,用户想通过操作系统干一些事情必须按照对应的接口进行操作。

市面上常见的系统如Linux、Windows、MacOs,其实本质上也都是有内核的。但是又不能直接让用户访问,所以早期在开发的时候可能会用一些c语言写的接口或者库来让用户进行操作。最典型的就是c语言的scanf和printf。

对于库函数printf和scanf而言,我们知道是在显示器上输入和输出。这是直接访问到硬件了。所以使用这两个函数的流程必然是贯穿了整个软硬件的体系结构。但是我们在运行c代码的时候却不需要去写系统调用相关的接口就可以打印。这是因为这两个库函数内部的实现早已经帮我们做完了这件事情了。只是我们一直没有关注过而已。


其实库、外壳、指令这些都是用户操作接口层面的东西,他们是我们能够更方便与底层交互的一些接口。比如有了库函数printf,我们就不需要自己实现printf函数,因为这个函数涉及到很多内容,又经常用。比如指令,我们在Linux系统内,只需要通过一些短指令就可以操作很多事情。又或是shell程序,也是和前面一样的意义。
只不过说对于用户而言,是不能直接接触操作系统内核的。所以我们需要通过系统调用来操作整个系统做管理工作。但是直接使用系统调用的接口对用户来说又太难了,很可能连打印函数都写不出来,而且影响开发效率。所以基于此,又有工程师开发出相应的库,忽略调用过程,重视方法的结果,内部其实就是原本系统调用的接口而已,只不过做了一层封装。

所以这里为什么后来的语言都会有很多的库,语言都是面向对象语言。c语言就是典型的面向过程语言,很多操作必须要自行实现。但是在后面的语言发展中,都选择面向对象。把过程抽象化了,在意的是完成一件事的主要逻辑。所以我们可以看到很多面向对象语言的代码都是使用了很多库,调用内部的接口进行操作的(如c++STL库)。

相关文章:

  • 工作号做文案素材的网站小学生简短小新闻十条
  • 阿里云 网站部署百度下载官网
  • 购物网站哪个好病毒式营销的案例
  • 网站建设图库北京网站优化怎么样
  • 对软件开发的理解和认识百度网站快速优化
  • lamp网站开发项目文档经典网络营销案例
  • CSS 背景属性用于定义HTML元素的背景
  • GEO生成式引擎优化发展迅猛:热点数智化传播是GEO最佳路径
  • 3步精简Android11预装!瑞芯微开发板系统瘦身实战
  • BUUCTF在线评测-练习场-WebCTF习题[RoarCTF 2019]Easy Calc1-flag获取、解析
  • 部署网站需求全满足:Websoft9 多应用托管一站式方案解析
  • 本地开发Anchor智能合约:效率翻倍的秘密
  • AAAI 2025论文分享│面向生物医学的具有像素级洞察力的多模态大语言模型
  • 精品方案 | GCKontrolGCAir在汽车ECU协同开发中的应用
  • 小程序入门:跳过域名校验、跨域与 Ajax 问题解析
  • WPF中Converter基础用法
  • 众趣科技与中原地产达成VR看房技术合作,赋能房产经纪数字化转型
  • C++ 快速回顾(二)
  • heygem报错Error: Error invoking remote method ‘model/addModel‘:
  • 16.1 Python应用容器化终极指南:Dockerfile多阶段构建与安全优化实战
  • 适合初学者(kubernetes)k8s脚本安装
  • .NET测试工具Parasoft dotTEST内置安全标准,编码合规更高效
  • 基于 SpringBoot+JSP+ElementUI+jQuery 助农生鲜销售系统设计与实现
  • 使用ASIO的协程实现高并发服务器
  • 数据结构-第三节-树与二叉树
  • 《汇编语言:基于X86处理器》第5章 过程(1)