【Linux】冯诺依曼体系结构和操作系统的理解

目录

  • 冯·诺依曼体系结构
    • 一个例子来深入理解
  • 初识操作系统
    • 操作系统的作用
    • 设计操作系统的目的
    • 操作系统之上和之下分别有啥
  • 管理的精髓,先描述,再组织

冯·诺依曼体系结构

在这里插入图片描述
我们知道,计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想把问题交给计算机处理,我们就需要一个输入设备把我们问题所需要的数据和信息交给计算机,然后我们需要计算机给出我们处理的结果,就需要一个叫做输出设备的东西来让计算机把结果显示出来(比如显示器)在这里插入图片描述

  • 而我们后人就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器,简称CPU。
  • CPU的处理数据的速度非常快,可以这么说如果我们想要打游戏和刷视频如此的流畅,一块好的CPU是不可或缺的。
  • 但是我们早期的计算机遇到了一个问题就是,CPU确实处理数据非常快,但是输入设备和输出设备他两的处理数据的能力不快呀。这个时候CPU1微秒处理完数据,对输入设备说,输入设备我把你刚刚交给我的数据处理完了,你还有数据交给我们吗?输入设备这个时候说,请你等一下CPU我正在处理呢。 这个时候CPU又对输出设备说,输出设备我这里有一批刚刚处理完的数据要交给你,你现在有空处理吗?这个时候输出设备又说:等一下CPU,我这里的数据也还没处理完呢。
  • 这个时候CPU就只能翘着二郎腿在这里闲着等他们了,这个时候我们就浪费了大量的空闲时间。

在这里插入图片描述

  • 这也是木桶原理的现象。
  • 这个时候我们的诺依曼大佬也发现这个问题,就让一个叫内存的东西作为桥梁介于CPU和输入/输出设备之间,内存的工作速度只是比CPU慢一点,如果说CPU处理完了数据,需要得到新的数据继续工作,这个时候内存也刚好把输入设备的数据拿到,这个时候内存就可以尽快的把数据拿给CPU处理,对于输出设备的对接也是如此。
  • 现在该体系的运行流程就是:用户输入的数据先放到内存当中,CPU读取数据的时候就直接从内存当中读取,CPU处理完数据后又写回内存当中,然后内存再将数据输出到输出设备当中,最后由输出设备进行输出显示。
  • 于是就形成了最终的冯诺依曼体系结构。

在这里插入图片描述

一个例子来深入理解

  • 今天你要使用qq对你的朋友发送一句你好的信息
  • 要使用qq就需要联网,你和你的朋友的电脑都是冯·诺依曼的体系结构:你的输入设备是:键盘,输出设备是:显示器和网卡, 你朋友的输入设备是:网卡,输出设备是:显示器
    在这里插入图片描述
  • 刚开始你在你的键盘中输入了你好这个数据,那么键盘这个输入设备就把数据交给内存,内存拿到了又交给CPU处理,CPU处理好后交给内存,内存又对显示器和网卡两个输出设备各个发送一份,那么你的显示器就得到了你好这个数据,这个时候你的显示器上就显示了你发送你好的信息,那么网卡的信息就开始交给网络流,流到了朋友电脑的网卡这个输入设备这里,被朋友电脑的网卡获取到,这个时候网卡又把这个数据交给内存,内存交给CPU,CPU处理完后又交给内存,内存拿到后,交给你你朋友电脑的显示器这个输出设备,这个时候你朋友的显示器上就出现了你好。

总结一下:

  • CPU只和内存打交道

初识操作系统

操作系统的作用

简单来说就是用来管理软件和硬件的一款系统软件

设计操作系统的目的

  • 与硬件进行交互,管理所有的软硬件资源。
  • 为用户程序(应用程序)提供一个良好的执行环境。

例如:如果用户现在像在显示器上看一个东西,就需要显示器的驱动程序来启动显示器这个硬件,操作系统就是需要来管理驱动程序这一操作,来满足用户的需求。

操作系统之上和之下分别有啥

  • 首先就是我们肉眼可见的计算机硬件,这些硬件的结构也是遵从我们的冯·诺依曼体系结构的。
    在这里插入图片描述
  • 但是如果只是有这些硬件是不行的,还要有一个的东西来对硬件进行管理。例如:内存什么时候从从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?是按行刷新还是全刷新?这些都是由软件进行管理的,而这个软件就是操作系统(Operator System)。

在这里插入图片描述

  • 那这个时候有一个问题。我们是不是可以理解为,操作系统直接来管理硬件?
  • 举个例子,如果操作系统自己来完成键盘的读取操作,那么只要你的键盘读取方式进行了改变,那么操作系统的内核源代码就需要进行重新编译,这对操作系统来说维护成本太高了。
  • 于是我们早操作系统和硬件之间也加了一个驱动层,这个驱动层的主要作用就是去直接控制底层硬件的。例如,键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。驱动简单来说就是去访问某个硬件的读,和硬件状态驱动层就是直接和硬件打交道的。此时操作系统就只需关心何时读取数据,而不用关心数据是如何读取的了,也就是完成了操作系统与硬件之间的解耦。
    在这里插入图片描述
  • 这个时候大家可能对解耦这个名词有点陌生,我这里讲一下什么是高内聚和低耦合

补充知识:高内聚和低耦合

  • 什么是高内聚?例如台式电脑把显卡和显示器这样主要用来显示的功能放在一起叫做高内聚,把具有类似功能的函数封装在一个类也是高内聚。
  • 什么是低耦合,我的台式电脑感觉用着非常卡顿,系统反应迟钝,我现在把CPU换一个更高效的但是换了CPU并不会造成很大影响其他显卡和内存的功能。或者我把一个函数的代码改了并不会造成很大影响(不是没有影响哈)另一个函数的功能,叫做低耦合

那操作系统究竟管理些什么呢?操作系统主要进行以下四项管理:

  1. 内存管理:内存分配、内存共享、内存保护以及内存扩张等等。
  2. 驱动管理:对计算机设备驱动驱动程序的分类、更新、删除等操作。
  3. 文件管理:文件存储空间的管理、目录管理、文件操作管理以及文件保护等等。
  4. 进程管理:其工作主要是进程的调度。
  • 而操作系统再往上就是我们所处的位置,在这里我们就可以用命令行或是图形化界面进行各种操作,这一层被称为用户层。(如Windows的图形界面操作,Linux的命令行指令操作)

在这里插入图片描述

  • 但操作系统为了保护自己,对上只暴露了一些接口,而不会让用户直接访问操作系统,这一系列接口被称为系统调用接口(其实就是函数)。
  • 例如:如果我们的程序要访问硬件,必须通过系统调用访问操作系统,让操作系统去让硬件执行相应的操作。(只有操作系统可以管理软件和硬件)

在这里插入图片描述

  • 但是系统调用接口的方式来访问操作系统,对于不熟悉操作系统的人操作成本还是太高了,我们因为要使用系统调用前提条件是你得对系统有一定了解。所以在系统调用接口之上又构建出了一批库,例如libc和libc++。实际上在语言级别上使用的各种库,就是封装了系统调用接口的,我们就是通过调用这些库当中的各种函数(例如printf和scanf)进行各种程序的编写。
  • 例如我们的Printf函数要把数字打印到显示器,就要访问硬件,访问硬件去需要调用系统调用让操作系统去给显示器说我们的需求
    在这里插入图片描述

管理的精髓,先描述,再组织

  • 要想学好操作系统,那么就必须正确理解到底什么是管理。
  • 这里我们举一个实际的例子来谈谈管理,现在给出三个角色:学生、辅导员和校长。很明显,校长在这三个人当中是管理者,学生是被管理者,那么辅导员充当什么角色呢?
    在这里插入图片描述
  • 仔细想想,实际上完成任何一件事都要经过两个过程,首先是决定要不要做这件事或是如何做这件事(决策),然后就是去做这件事情(执行)。校长作为管理者来管理学生,校长实际上就是那个做决策的人,但是校长作出决策后并不需要自己来执行,而是让辅导员去执行,所以辅导员的主要任务就是执行管理者的决策,我们通常将其称为执行者。
    在这里插入图片描述
  • 虽然说校长是管理学生的,但是我们在学校一般情况下是看不到校长本人的,那么校长是如何做到在不看到我们的情况下对我们进行管理的呢?

举个例子,现在校长要求辅导员将计算机成绩排名前十的学生的各科资料以及平时表现记录拿过来,他将从这十名同学之中选出三名学生参加本次的编程大赛,当辅导员将资料拿来后校长选出三名学生说:“就这三个了,你找个老师对这三名学生进行一下强化训练,然后参加本次的编程大赛。”然后校长就什么也不管了。

  • 在这个过程中,校长根本没有见过这三名同学,就对其进行了管理,他根据的是什么?没错,他根据的是数据。
  • 实际上,学校将我们每个学生的各种信息都进行了管理,基本信息、成绩信息以及健康信息等等。
    在这里插入图片描述
  • 每一种信息就描述了这个学生的情况,我们的学长就可以只根据这些关于这个学生的信息就可以把学生管理起来。这么一套信息在C语言当中我们称之为抽象结构体,而在C++当中又叫做类。
  • 当学生的数量多起来了,校长就可以将全部学生的信息组织起来,当然组织的方式有很多种(链表、顺序表、树),而每种组织方式都有其自己的优势,于是就有了一门课程专门教我们管理数据的方式,那就是数据结构。这里我们假设校长以双链表的形式将学生的信息组织起来。
    在这里插入图片描述
  • 此时校长对这些学生的管理,其实就是对双链表这个数据结构的增删查改。例如:我如果要年级最后三名开除学籍,那么我们就可以在学籍系统中,删掉这三名学生的信息。
  • 那么操作系统是不是也可以这样管理硬件?把网卡,显卡,键盘,定义一个类,描述他们的属性,然后数据结构组织起来,对他们进行增删查改

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

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

相关文章

kotlin @JvmStatic注解的作用和使用场景

1. JvmStatic 的作用 JvmStatic 是 Kotlin 提供的一个注解,用于在 JVM 上将伴生对象(companion object)中的方法或属性暴露为 Java 静态方法或字段。 作用对象:只能用在 companion object 中的函数或属性。效果: 在 …

Redis实现-优惠卷秒杀(基础版本)

(一)全局唯一ID 一、全局ID生成器 可以看到在优惠卷订单表中的主键id并没有设置Auto increment自增长 假如未来订单量达到数亿单,单表无法保存如此多数据,就需要对其进行分表存储(分布式)。假如每张表都采用自增长,各自从1开始自增&#xf…

c++STL——哈希表封装:实现高效unordered_map与unordered_set

文章目录 用哈希表封装unordered_map和unordered_set改进底层框架迭代器实现实现思路迭代器框架迭代器重载operator哈希表中获取迭代器位置 哈希表的默认成员函数修改后的哈希表的代码封装至上层容器 用哈希表封装unordered_map和unordered_set 在前面我们已经学过如何实现哈希…

虹科应用 | 探索PCAN卡与医疗机器人的革命性结合

随着医疗技术的不断进步,医疗机器人在提高手术精度、减少感染风险以及提升患者护理质量方面发挥着越来越重要的作用。医疗机器人的精确操作依赖于稳定且高效的数据通信系统,虹科提供的PCAN四通道mini PCIe转CAN FD卡,正是为了满足这一需求而设…

Yolov8的详解与实战-深度学习目标检测

Yolov8的详解与实战- 文章目录 摘要 模型详解 C2F模块 Loss head部分 模型实战 训练COCO数据集 下载数据集 COCO转yolo格式数据集(适用V4,V5,V6,V7,V8) 配置yolov8环境 训练 测试 训练自定义数据集 Labelme…

scons user 3.1.2

前言 感谢您抽出时间阅读有关 SCons 的内容。SCons 是一款下一代软件构建工具,或者称为 make 工具,即一种用于构建软件(或其他文件)并在底层输入文件发生更改时使已构建的软件保持最新状态的软件实用程序。 SCons 最显著的特点是…

Java的多线程笔记

创建一个线程的方法有多种,比如可以继承Thread类或者实现Runnable接口,结论是实现Runnable接口比前者更加优越。 二者代码对比 Java 不支持多继承,如果你继承了 Thread 类,就不能再继承其他类,实现 Runnable 接口后&am…

PDF Base64格式字符串转换为PDF文件临时文件

需求描述: 在对接电子病历系统与河北CA,进行免密文件签章的时候,两者系统入参不同,前者是pdf文件,base64格式;后者要求File类型的PDF文件。 在业务中间层开发时,则需要接收EMR侧提供的base64格式…

代码随想录训练营第二十三天| 572.另一颗树的子树 104.二叉树的最大深度 559.N叉树的最大深度 111.二叉树的最小深度

572.另一颗树的子树: 状态:已做出 思路: 这道题目当时第一时间不是想到利用100.相同的树思路来解决,而是先想到了使用kmp,不过这个题目官方题解确实是有kmp解法的,我使用的暴力解法,kmp的大致思…

【RabbitMq C++】消息队列组件

RabbitMq 消息队列组件 1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C客户端库4. AMQP-CPP 库的简单使用4.1 使用4.1.1 TCP 模式4.1.2 扩展模式 4.2 常用类与接口介绍4.2.1 Channel4.3.2 ev 5. RabbitMQ样例编写5.1 发布消息5.2 订阅消息 1. RabbitMq介绍 RabbitMq - …

鸿蒙NEXT开发动画案例8

1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: /*** SpinKit动画组件 (重构版)* author: CSDN-鸿蒙布道师* since: 2025/05/14*/interface AnimationGroup {indexes: number[];delay: number; }ComponentV2 export struct SpinEight {Re…

MySQL全局优化

目录 1 硬件层面优化 1.1 CPU优化 1.2 内存优化 1.3 存储优化 1.4 网络优化 2 系统配置优化 2.1 操作系统配置 2.2 MySQL服务配置 3 库表结构优化 4 SQL及索引优化 mysql可以从四个层面考虑优化,分别是 硬件系统配置库表结构SQL及索引 从成本和优化效果来看&#xf…

vue和springboot交互数据,使用axios【跨域问题】

vue和springboot交互数据,使用axios【跨域问题】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】&…

FFMPEG 与 mp4

1. FFmpeg 中的 start_time 与 time_base start_time 流的起始时间戳(单位:time_base),表示第一帧的呈现时间(Presentation Time)。通常用于同步多个流(如音频和视频)。 time_base …

AI世界的崩塌:当人类思考枯竭引发数据生态链断裂

AI世界的崩塌:当人类思考枯竭引发数据生态链断裂 ——论过度依赖AI创作对技术进化的反噬 一、数据生态的恶性循环:AI的“自噬危机” 当前AI模型的训练依赖于人类创造的原始数据——书籍、论文、艺术作品、社交媒体动态等。据统计,2025年全球…

C++【STL】(2)string

C【STL】string用法扩展 1. assign:为字符串赋新值 用于替换字符串内容,支持多种参数形式。 常用形式: // 用另一个字符串赋值 str.assign("Hello World");// 用另一个字符串的子串(从第6个字符开始,取5…

树莓派4基于Debian GNU/Linux 12 (Bookworm)开启VNC,使用MobaXterm连接VNC出现黑屏/灰屏问题

1. 开启树莓派的VNC服务 启用VNC服务:通过raspi-config开启 # 1. 通过 raspi-config 工具开启 sudo raspi-config选择 Interface Options → VNC → Yes退出时会自动启动服务 检查服务状态: sudo systemctl status vncserver-x11-serviced正常输出应显示…

MongoDB使用x.509证书认证

文章目录 自定义证书生成CA证书生成服务器之间的证书生成集群证书生成用户证书 MongoDB配置java使用x.509证书连接MongoDBMongoShell使用证书连接 8.0版本的mongodb开启复制集,配置证书认证 自定义证书 生成CA证书 生成ca私钥: openssl genrsa -out ca…

Python爬虫实战:研究js混淆加密

一、引言 在当今数字化时代,数据已成为推动各行业发展的核心驱动力。网络爬虫作为一种高效的数据采集工具,能够从互联网上自动获取大量有价值的信息。然而,随着互联网技术的不断发展,许多网站为了保护自身数据安全和知识产权,采用了 JavaScript 混淆加密技术来防止数据被…

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository :数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中,层级结构(Layered Architecture&#xf…