Linux---冯诺伊曼体系结构,操作系统概况

冯诺依曼体系结构

对于大部分计算机来说,不管是我们见过的还是没见过的,基本都是遵循冯诺依曼体系结构,对于一个计算机来说,最重要的功能就是输入->计算->输出。常见的输入输出设备这里就不再赘述了,明确一点,一个设备,它有可能既是输入设备也是输出设备的,比如磁盘(也叫外存),也可以纯输入/纯输出。输入输出设备统称为外设(外围设备),这是相对于存储器以及CPU来说的。

冯诺依曼体系里的存储器指的是内存,那为什么要有内存呢?

1.存储分级问题 :计算机里能用来存储数据的设备太多了,其实很简单一句话总结,越靠近CPU的"存储设备"的体积越小,价格越高,速度越快,越远离计算机的"存储设备就相反"。

2.体系结构效率问题:为什么不是输入设备输入的数据经过CPU处理之后直接通过输出设备输出呢?大家都知道木桶原理,外设相较于CPU来说,速度特别慢,大概是ms级别,而CPU是nm级别,中间差了10^6,这样一来,外设就会大大拖慢计算机的速度。

有了上边的两个认知之后,我们就知道内存的出现就是为了解决效率的问题,内存相当于是一个中介,在数据层面,CPU不和外设直接打交道,CPU读写数据只会和内存打交道。这时候肯定有人又有疑惑说那根据木桶效应,外设把数据交给存储器,存储器再把数据交给CPU,那最终的速度不还是由外设决定,道理是这个道理,但是你别忘了这只是硬件层面,还有操作系统层面,操作系统可以将输入设备输入的数据预加载到存储器里,第一次慢一点,接下来就不用加载了,直接由存储器和CPU打交道,速度就快了。因此就有结论得出,数据可以提前加载,大部分情况下,处理数据的时候就可以转化为CPU和内存的交互,所以整个计算机体系结构的速度就由内存为主。这个也跟局部性原理有关,局部性原理的意思就是,当你访问一段数据的时候,你下一次访问的数据大概率在上一次访问数据的附近。所以为什么想到让数据提前加载,就跟局部性原理有关。

内存的出现是划时代的,我们不可能将速度极快的寄存器或者高速缓存造成1TB这样的大小,理论上是可以做到的,但是普通人肯定是买不起的,所以为什么要有内存?让普通人以相对较低的价格获得效率不错的计算机,冯诺伊曼为电脑提供性价比,让电脑被人们广泛接受,才可能造成全球范围内的网民数量,才可能孵化出互联网。

子问题:为什么程序(二进制可执行程序)要运行,必须先加载到内存?

对于C语言来说,一段C语言代码要运行就必须先编译链接成可执行程序,而二进制可执行程序是一个文件,在磁盘上存着,程序的本质就是逻辑+数据,它由一串串的二进制序列组成,是一个二进制文件,因此程序就是"数据",先加载到内存是计算机体系结构规定,在数据层面,CPU不直接和外设打交道。

了解了上述两个问题之后再回到体系结构的话题,我们口中的输入输出,是站在谁的角度考虑问题的?答:是站在内存的角度(硬件角度),也可以说是站在加载到内存中的程序的角度,写C代码的时候的那个<stdio.h>和C++的<iostream>里的io指的就是input和output,就是IO,程序运行的时候需要先加载到内存里,所以站在内存的角度跟站在加载到内存中的程序的角度是一样的。

重谈效率问题:计算机的数据流动过程,本质就是拷贝。管他什么所谓的数据要提前从输入设备加载到内存,什么内存的数据输出到输出设备,什么CPU跟内存交互数据,数据从一个硬件到另一个硬件的流动过程就是拷贝的过程,计算机的效率问题,由设备的拷贝效率决定。上文说的存储设备的分级问题,说不同存储器的效率不同,这个效率指的就是拷贝的效率。

实践:

现在x和l两个人在用QQ聊天,假设x给l发了一条消息x,x是怎么从x的电脑到l的电脑从而被l看到的呢?不用管其他的,就从计算机体系结构(冯诺伊曼体系结构)来说,QQ是一个软件,本质上就是存在磁盘上的一个二进制可执行程序文件,打开QQ的过程就是它加载到内存的过程,接着你从键盘输入x到内存里,内存把数据给CPU处理之后CPU再返还给内存,内存就将数据拷贝给网卡(输出设备),在网络的作用下数据通过l的电脑的网卡(输入设备)到了l电脑的内存里,再内存到CPU,CPU到内存,之后内存将数据拷贝给显示器(输出设备),l就看到了。不止是这个过程,其他传图片,传文件,传....都是这样的过程。还有一个点上文也说过,硬件之间流动数据的过程就是拷贝的过程,因此数据发送过去的意思就是拷贝过去,所以你也终于理解了为什么在你QQ上删除聊天记录之后,对方的QQ上的聊天记录还在。数据的流动过程跟软件是没关系的,底层的硬件都固定好了,上层的软件再复杂底层也是按照这样的体系结构走的。

操作系统

是什么?

操作系统分为广义和狭义的,广义上的操作系统由内核+shell外壳+预装软件等等构成,这个广义操作系统是站在小白视角,而我们现在将要谈的操作系统是狭义的,指的是操作系统内核。

内核有四大功能:驱动管理,内存管理,文件系统(管理),(这三者是跟体系结构里的硬件有关,分别对应外设,内存,磁盘),还有一个暂时理解为进程管理。任何一个计算机类的设备都需要这四大功能。

有了以上认知,也就理解了安卓等一系列广义操作系统,安卓的底层是基于Linux内核的,说白了就是内核的四大功能没动,搞的是外壳程序和一系列给别人用的图形化界面的接口,上层的人再基于安卓进行开发就有了小米等一系列手机品牌。外行人口中说的安卓操作系统就是上文说的广义操作系统。

为什么要有?

人是无法直接和硬件打交道的,操作系统对下把软硬件资源管理好(手段),对上给人提供一个良好的使用环境(目的),它必须要是稳定高效安全的,因此操作系统设计出来的原因就是以人为本,为人服务。

怎么办?(浅谈)

上文说了,操作系统是管理软硬件资源的,那它是怎么管理的呢?之后的博客会详细的从进程开始说,本篇文章先建立一个宏观的架构。

操作系统是一款软件,是一款进行软硬件资源管理的软件。OS管理的本质是先描述再组织,具体的意思简单一点说就是假设在学校里边,校长管理学生,但校长不会直接去和学生见面,当面去管理,而是从辅导员那里获取学生数据,比如说姓名年龄性别成绩.....这些数据去全方位的管理学生,放到计算机里边,比如说C语言,拿一个结构体描述一个学生,之后再用数据结构去将每一个学生的数据组织起来,方便去增删查改,这个简单的过程就是先描述再组织,说白了就是将现实问题转化为计算机问题这个建模的过程。

简单实践:知道了OS管理是先描述再组织之后,可以简单的理解一下OS是如何管理硬件的。如下图所示,底层硬件和操作系统之间还需要有个驱动程序,每个硬件都需要有个驱动程序,操作系统通过驱动程序让硬件完成相应的工作。操作系统(校长)管理底层的硬件得先描述,由于OS是拿C语言写的,因此里边一定会有一个结构体,将底层硬件(学生)的类型,状态,厂商....等等信息描述出来,再通过数据结构去组织起来,OS将这些数据结构用图形化界面的方式暴露给上层的人,人在用键盘鼠标的过程转化为数据结构的增删查改,再通过驱动转化为操控底层硬件,至于OS如何知道底层硬件的信息,就由驱动程序(辅导员)去告诉OS,因此程序加载的时候也要将驱动程序加载到内存里。综上,OS的核心东西就是数据结构。

所以C++为什么要有类和STL?类就是在描述,STL就是在组织,先描述再组织是这个世界的真相,任何事情都要先描述再组织,这样才能管理,语言的本质就是将现实问题进行计算机建模的核心规律。所以写代码都得先写类去描述再用数据结构去组织。

如何提供良好的服务环境?

上文说了,有OS的目的就是以人为本,为人提供服务环境的,那它到底是怎么提供服务环境的呢?来看下边一张图,刚才说的先描述后组织是操作系统管理的方式,最终OS还是要给人去用的,我们知道了OS里有大量的数据结构,描述信息....难道让人直接去跟它们打交道吗?肯定不是,OS不可能让所有人去直接操控数据结构,去触摸到底层的硬件,因为这并不是一个安全的行为,就像你去银行取钱的时候,不可能让你直接去银行的金库里取吧,银行里都是有一个个窗口的,你要完成什么行为,就要到对应的窗口去办理相应的业务。因此在用户和OS之间还有一个叫系统调用接口的东西,它本质就是一个个函数,用户通过调用它提供的接口间接的去操控OS里的数据结构....

为什么系统调用我们好像从来没见过?因为系统调用是操作系统提供的,本身使用起来是有一定门槛的,我们不会直接去跟它接触,就比如编写C/C++程序的时候我们想打开一个文件会去使用它们给我们提供的库函数,由库函数帮助我们去完成系统调用,(它们基本上全都是对系统调用的封装),接着系统调用再去操控操作系统,由操作系统通过驱动程序去完成我们上层想对底层硬件的操作。

相关推荐
I_am_Damon1 小时前
安全警告:该网站的安全证书存在问题
运维·服务器·安全
鹏大师运维1 小时前
不用装远程桌面!统信UOS通过SSH直接调用麒麟图形界面程序
linux·运维·网络·ssh·麒麟·x11·统信v25
Hexian25801 小时前
SpringAI MCP
java·spring·ai
苦逼的猿宝1 小时前
基于SpringBoot的旅游网站的设计与实现(源码+论文)
java·毕业设计·springboot·计算机毕业设计
Jason_zhao_MR1 小时前
RK3506工业网关:如何打通现场采集、无线传输与行业规约接入?
linux·嵌入式硬件·物联网·系统架构·嵌入式
helx821 小时前
Gemini镜像站驱动的运维事件自动复盘:从日志聚类到根因定位的全链路自动化
运维·自动化·聚类
_codemonster1 小时前
JSP 、Thymeleaf 、 JavaScript 和Vue
java·javascript·vue.js
lingx_gps1 小时前
领新北斗(TracSeek)车辆动态监控系统 - Linux(Ubuntu) 安装部署完整指南
linux·运维·ubuntu·jt808·车辆监控·jt1078·北斗定位
魔极客1 小时前
1panel面析中Ollama Docker配置错误解析与修复
运维·docker·容器