Linux ----冯诺依曼体系结构与操作系统

目录

前言

一、冯诺依曼体系结构

二、为什么选择冯诺依曼体系结构?

三、使用冯诺依曼结构解释问题

问题1:

问题2:

四、操作系统

1.操作系统是什么

2.为什么需要操作系统

3.操作系统怎样管理的

4.如何给用户提供良好环境

五、我们是怎样调用系统接口的

六、总结 


前言

了解冯诺依曼体系结构与操作系统,可以建立好计算机知识体系,至少在后面学习进程时,可以逻辑自洽。

一、冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

我们当前的计算机主要由五部分组成:输入单元,输出单元,存储器,运算器和控制器。如下

二、为什么选择冯诺依曼体系结构?

为什么现在的计算机基本都选择了冯诺依曼体系结构?

这是因为我们要进行存储分级,计算机里几乎所有的设备都有数据能力,如CPU存储速度最快,内存其次,磁盘再次之。

如果不会存储速度进行分级,全部都是用最快的存储器,会造成价格极具昂贵的现象,我们这种普通老百姓根本承担不起。如三星、西数的硬盘,英伟达60系列显卡、intel i5家族才是主流用户的选择。

冯诺依曼体系结构中,CPU并不会和外设直接打交道,这是因为外设的存储效率太慢,直接交互会让计算机速度变很低,因为木桶效应。在数据层面上,CPU优先要和内存直接打交道。

我们读取磁盘中的数据进入内存,再让CPU与内存进行直接访问,这样在保证计算机效率的同时,也让成本尽可能的降低。这也是使用冯诺依曼体系结构的本质:用较少的钱,做出来效率不错的计算机。

如下是存储分级图。 

三、使用冯诺依曼结构解释问题

问题1:

在我们学C/C++语言时,总听说过一句话,程序要运行之前,必须要加载到内存?这是为什么呢?

这是因为程序=代码+数据,程序最终都需要CPU来执行,CPU在处理前需要先读取到这些代码和数据,我们刚刚了解到,CPU只和内存直接进行数据交互,因此需要先将数据加载到内存中,再让CPU进行相关数据的处理。

问题2:

你和你的朋友,在QQ上聊天,你发送了一个“在吗”,在硬件层面上,“在吗”这个在设备上的数据流动是怎样的?

数据从你的电脑中键盘输入,转到内存中,有CPU进行相应的打包处理,再通过网卡传输到你的朋友的电脑网卡端,你朋友的电脑接受到也会先加载到内存,再CPU进行相应的解包处理,最后再显示器上显示出来。

以上案例只是为了让大家理解冯诺依曼体系结构,具体流程肯定不仅仅只有网卡键盘显示器参与,还有其他硬件共同参与。 

四、操作系统

1.操作系统是什么

操作系统是一款软件,是可以进行软硬件资源管理的软件,也是第一个加载到内存里面的软件。

2.为什么需要操作系统

操作系统将软硬件资源管理好,并且给用户提供稳定、高效、安全的使用环境。(后面两点围绕这个展开)

3.操作系统怎样管理的

先回答上面第2点的第一句话:操作系统如何将软硬件资源管理好

操作系统管理的的核心是:进程管理、内存管理、文件/IO管理、驱动管理。如下图

他是如何管理好这些的呢? 我们举例子来理解。

比如在一个大学,校长是管理者,会做决策,辅导员或者老师做执行,学生是被动接受管理。那么校长是如何做决策的呢?

他总不能是跟小阿giao一样拍拍脑袋,随便管理决策的吧。他肯定是掌握了辅导员/老师提供的数据(姓名/成绩/班级/奖项等等),根据这些数据来进行管理,比如张三喜欢打架,成绩也不好,那我们就不要给张三奖学金,或者直接将张三开除了。再比如李四成绩好,品学兼优、辅导员和同学对他评价很高,那么就颁给李四一个三好学生。这也是为什么我们都见不到校长,但确确实实是校长在间接或直接管理着我们。

通过这个故事,我们可以看到管理的本质并不是管人,而是管理数据 !!!通过数据下发指令进行管理。

那么既然管理者管理的是数据,那么我将数据用 结构体/类 来描述很合理吧,比如上面的学生数据,我定义一个struct或者class,里面有名字、性别、身高、体重、成绩等等信息来描述。我们再使用链表或者红黑树等其他数据结构,将学生类都串起来,方便我们进行增删改查等处理。

对应到计算机中,对应的操作系统就是管理者代表校长,驱动程序代表辅导员/老师,硬件被管理者学生。

计算机将你要管理的内存、进程等分别使用结构体或者类来描述清楚,再使用容器进行组织起来。

总以经结一句话:先描述、再组织。   任何管理工作都可过这六个字进行计算机建模。

如何理解先描述呢?

人是通过属性来认识世界上的任何事情/事物的。比如我描述一个物品,它是液体的,黑色的,外包装为红色,可以喝的,带气泡的,喝第一口非常好喝的,喝后面一般的,喝起来冲鼻的。大家很容易联想到可乐。这些内容都是该物品的属性。由此我们可以得出一个结论,重要属性的集合就代表这个人或者事物

既然先描述,再组织,那么操作系统内部,一定存在大量的数据对象。我们只要描述清楚对应的硬件,用数据结构将他们组织起来,那么我们对硬件的管理就可以转化为对数据结构的管理。这样就完成了对管理事物的建模过程。

比如,我们想知道,我们显卡是否在正常工作,那么操作系统就会去查看显卡的相关数据对象,查询后,再将结果返回给上层。 

4.如何给用户提供良好环境

回答上面第2点的第二句话,操作系统如何给用户提供稳定、高效、安全的使用环境

现在我们已经知道了操作系统很棒,可以将软硬件资源管理好,那他是如何给用户提供良好的使用环境的呢?

这里的用户,在广义上指所有人,狭义上指开发者,因为至少至少,操作系统得让开发者用起来舒服,让开发者能开发各种软件,如qq,微信等给所有人使用。

那么用户能直接通过操作系统去访问到底层硬件的数据对象,同时可以修改吗?

答案是不能,因为群众里面有坏人,你无法保证每个人都正常的对底层硬件进行访问修改,万一有坏人或者不小心修改了数据,我们后面查看到的结果与实际可能就不一样了。

就像银行一样,不相信我们,有保安和好几米厚的墙来防止坏人,但还是要设置窗口让业务员与我们沟通。同理,虽然操作系统不相信我们,但还是要给我们提供接口来为我们服务。我们要通过操作系统访问软硬件,也就需要调用操作系统给我们的接口。

五、我们是怎样调用系统接口的

一般一个用户要想访问非常底层的操作系统数据或者访问硬件,必须贯穿整个层状结构,这就意味着用户必定要调用系统调用接口。比如C语言中打印的printf,他一定是封装系统调用,不然不可能在屏幕中给我们进行显示。

但是系统调用,用起来会很麻烦。

站在用系统的人的角度,操作系统给我们提供了外壳程序(linux的shell,windows的图形化界面),我们可以通过外壳程序,来通过简单的操作进行系统调用

站在在系统上开发的人的调度,可以直接调用系统接口,但是开发的人也会有小白,如果将系统接口封装成为各种好用的函数,打包形成库!所有开发者,用很多功能的时候,不用再自己去写了,而是直接调用库函数即可。

现在我们再回过头来看一下这个图片,是不是容易理解了,用户通过shell外壳和库访问系统调用接口,通过接口对访问操作系统,再通过操作系统对硬件的管理进行访问硬件。

六、总结 

不要求了解很多,只需要知道冯诺依曼体系结构中的  “先描述再组织”。

计算机管理硬件

1. 描述起来,用struct结构体

2. 组织起来,用链表或其他高效的数据结构

还有系统调用和库函数概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

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

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

相关文章

Windows Copilot 更新及使用教程

要更新并使用 Windows Copilot,在 Windows 11 上,首先确保您的系统已经更新到最新版本。Windows Copilot 是随 Windows 11 23H2 更新一起发布的新 AI 助手功能。它可以回答您的问题,完成任务,导航 Windows,并提高您的工…

native2ascii命令详解

native2ascii命令详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同深入研究Java开发中常用的工具——"native2ascii"命令&a…

Github 2024-01-12Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-01-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Vue项目3 Apache Flink: 开源流处理框架 创建周期:3506 天开发语言:Java协…

安卓 onActivityResult 废弃,registerForActivityResult 使用详解

文章目录 onActivityResult 存在的问题registerForActivityResult 有哪些改进registerForActivityResult 实战registerForActivityResult 自定义使用registerForActivityResult 开箱即用StartActivityForResultGetContent 后记注意事项附录 安卓的兼容性是出了名的低&#xff0…

C语言中的位运算详解

在C语言中,位运算符用于对二进制位进行操作,包括左移、右移、按位与、按位或、按位异或和按位取反等操作。本文将详细介绍C语言中的位运算符,包括运算规则和具体的例子。 1. 位运算符概述 C语言提供了一些位运算符,用于直接操作…

iOS rootless无根越狱解决方案

据游戏工委数据统计,2023年国内游戏市场实际销售收入与用户规模双双创下新高,游戏普遍采用多端并发方式,成为收入增长的主因之一。 中国市场实际销售收入及增长率丨数据来源:游戏工委 多端互通既是机遇,也是挑战。从游…

python实例100第16例:使用datetime输出指定格式的日期

题目:输出指定格式的日期。 程序分析:使用 datetime 模块。 #!/usr/bin/python # -*- coding: UTF-8 -*-import datetimeif __name__ __main__:# 输出今日日期,格式为 dd/mm/yyyy。更多选项可以查看 strftime() 方法print(datetime.date.t…

【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt

从这篇文章开始,我们就正式开始学习AI大模型应用开发的相关知识了。首先是提示词工程(Prompt Engineering)。 文章目录 0. 什么是提示词(Prompt)1. 为什么Prompt会起作用 - 大模型工作原理2. Prompt的典型构成、原则与…

【5】商密测评密码辅助工具

0X01 前言 最近在学了下商密测评,研究了下技术层面的测评,感觉找工具不方便,就顺手自己造了个辅助工具,都是自己遇到需要用的。 0x02 工具功能介绍 不爱打字,直接上图。后续根据技术测评层面需要继续完善和增加功能。…

基于VSG控制的MMC并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 根据传统同步发电机的运行特性设计了MMC-VSG功频控制器和励磁控制器, 实现了MMC-VSG逆变器对高压电网电压和频率的支撑。该模型包含MMC变流器模块,环流抑制模块,…

HackTheBox-Keeper

OpenVPN连接 连接上HackTheBox! 同时找到这个靶机,进行join!分配的靶机的地址位10.10.11.227! 信息收集 nmap -sT --min-rate 10000 -p- 10.10.11.227 开放端口为22和80端口 服务版本和操作系统信息探测: nmap -s…

Milvus Cloud与携程的向量探索大公开

【User Tech】2024 我们来啦! 今年,【User Tech】将更加专注于为社区用户提供技术功能解读、热点答疑,聚焦更丰富、更多样化的行业或使用场景的用户案例。我们期待通过分享更多关于 Milvus Cloud 的实战经验,为大家在 AI、大模型、…

ASM磁盘组配置共享存储:裸设备(60)_块设备(12)_(99)方式

--1.块设备方式配置共享存储 存储信息: 20个1TB的LUN,/dev/mapper/mpath1--mpath20 修改/etc/udev/rules.d/12-dm-permissions.rules添加内容 vi /etc/udev/rules.d/12-dm-permissions.rules ENV{DM_NAME}"mpath1", OWNER:"grid",…

YOLOv8算法改进【NO.98】改进损失函数为最新提出的Shape-IoU

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 第一…

1-08运算符和表达式

一、概述 在C语言中,表达式和语句是构成程序的基本元素。本节和下一章节我们就围绕它们展开讲一讲其中的C语言基础语法。 首先,让我们区分这两个概念: 语句(statement),语句是代码中的一个完整的,可以执行的步骤。 …

微信小程序内嵌h5 分享子页面点击进入后是主页面解决办法

<web-view src{{src}}></web-view>src: https://XXXXXX,/*** 生命周期函数--监听页面加载 */ onLoad(options) {this.srcFun(options) },srcFun(options){//当有子页面id时 更改内嵌页链接if (options.urlPathNew) { let urlhttps://XXX/caseOrder?classicId${opt…

李沐之经典卷积神经网络

目录 1. LeNet 2. 代码实现 1. LeNet 输入是32*32图片&#xff0c;放到一个5*5的卷积层里面&#xff0c;卷积层的输出通道数是6&#xff0c;高宽都是28&#xff08;32-5128&#xff09;。再经过2*2的池化层&#xff0c;把28*28变成14*14&#xff08;28-22&#xff09;/214&am…

《Vue2 进阶知识》动态挂载组件之Vue.extend + vm.$mount

前言 目前工作还是以 Vue2 为主&#xff0c;今早有人提问 如何动态挂载组件&#xff1f; 话说很久很久以前就实现过&#xff0c;今天再详细的整理一下此问题&#xff01; 开始 动态组件如下&#xff0c;是个简单的例子&#xff1a; 但请注意这里给了个 id"test2"…

vue 组件 import make sure to provide the “name“ option.

百度了好多结果&#xff0c;都过时了&#xff0c;例如&#xff1a; 模块引入是否加{} 再比如&#xff1a; 对于递归组件&#xff0c;请确保提供“name”选项。 出现该错误情况之一&#xff1a; 错误由未正确引入组件或子组件引起&#xff0c;如element-ui中form表单组件未引…

PostgreSQL之SEMI-JOIN半连接

什么是Semi-Join半连接 Semi-Join半连接&#xff0c;当外表在内表中找到匹配的记录之后&#xff0c;Semi-Join会返回外表中的记录。但即使在内表中找到多条匹配的记录&#xff0c;外表也只会返回已经存在于外表中的记录。而对于子查询&#xff0c;外表的每个符合条件的元组都要…