【Linux】冯诺依曼体系结构与操作系统概述

/------------Linux入门篇------------/

《 Linux 历史溯源与指令入门 》

《 Linux 指令进阶 》

《 Linux 权限管理 》

/------------Linux工具篇------------/

《 Linux工具:yum 与 vim 》

《 Linux工具:sudo 白名单配置 + GCC/G++ 编译器》

《 Linux自动化构建工具:make/Makefile 》

《 Linux第一个程序:进度条 》

《 Linux工具:Git 与 GDB 调试器 》
在计算机领域,冯・诺依曼体系结构是硬件的基石,操作系统是软件的枢纽。本文将以 Linux 为视角,带你厘清冯・诺依曼体系结构的核心逻辑,剖析操作系统在该架构上的运行机制,为你理解计算机系统的底层运转打开一扇门。

🚀 个人主页< 脏脏a-CSDN博客 >

📊 文章专栏:<Linux>

📋 其他专栏:< C++ > 、<数据结构 > 、<优选算法>

目录

一、冯诺依曼体系结构

二、冯诺依曼体系结构设计意义

1、为什么不让IO设备直接和cpu进行数据传输?

2、内存和IO设备之间的速度差是如何解决的呢?

3、内存和cpu之间的速度差是如何解决的呢?

三、冯诺依曼体系结构的数据流

1、如何解释QQ聊天的数据流动?

2、思考:传输文件和传输文字有啥区别?

【小彩蛋】

四、操作系统是什么?

五、为什么要有操作系统?

六、操作系统是如何管理软硬件的呢?

[1. 管理本质:通过 "数据管理" 实现 "对象管理"](#1. 管理本质:通过 “数据管理” 实现 “对象管理”)

[2. 描述过程 ---> 用 "结构体" 抽象软硬件属性](#2. 描述过程 —> 用 “结构体” 抽象软硬件属性)

[3. 组织过程 ---> 用 "数据结构" 串联所有对象](#3. 组织过程 —> 用 “数据结构” 串联所有对象)

[4. 最终操作:对数据结构的 "增删查改"](#4. 最终操作:对数据结构的 “增删查改”)

七、驱动层是做什么的呢?

[1. 层级结构:三层协同,驱动层是 "软硬件桥梁"](#1. 层级结构:三层协同,驱动层是 “软硬件桥梁”)

[2. 各层职责:驱动层解决 "硬件多样性" 与 "系统通用性" 的矛盾](#2. 各层职责:驱动层解决 “硬件多样性” 与 “系统通用性” 的矛盾)

[3. 驱动层的价值:保障系统的 "可扩展性" 与 "稳定性"](#3. 驱动层的价值:保障系统的 “可扩展性” 与 “稳定性”)

八、系统调用和库函数


一、冯诺依曼体系结构

冯诺依曼体系(Von Neumann Architecture)是现代计算机的核心架构范式,由数学家约翰・冯・诺依曼于 1945 年提出,是全球计算机设计的理论根基。它明确计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成,核心思想是程序和数据以二进制形式统一存储在存储器中,计算机通过顺序读取并执行指令来完成复杂计算任务,从日常笔记本到大型服务器,绝大多数计算机都遵循这一架构逻辑。

【冯诺依曼体系结构五部分构成】:

【运算器】

  • 定义 :是计算机中执行算术运算(如加、减、乘、除)和逻辑运算(如与、或、非)的部件。
  • 作用:是计算机的 "算术逻辑单元",负责对数据进行加工处理,为控制器提供运算结果,是数据处理的核心部件之一。

【控制器】

  • 定义 :是计算机的 "指挥中心",负责从存储器中取出指令,对指令进行分析、判断,并发出控制信号,协调计算机各部件按指令的要求工作。
  • 作用:控制计算机的指令执行顺序,保证计算机各部件协调一致地工作,是计算机的神经中枢。

【存储器】

  • 定义:是用来存储程序和数据的部件,指的是内存。
  • 作用:用于临时存储正在运行的程序和数据,速度快但容量相对较小,是计算机实现 "存储程序" 原理的关键部件。

【输入设备】

  • 定义:是向计算机输入数据和程序的设备。
  • 常见设备:键盘、磁盘、鼠标、网卡、话筒、摄像头等。
  • 作用:将用户的指令、数据等信息转换为计算机能识别的二进制代码,输入到计算机中。

【 输出设备】

  • 定义:是将计算机处理结果以用户可以识别的形式输出的设备。

  • 常见设备:显示器、磁盘、音箱、显卡等。

  • 作用 :将计算机内部的二进制信息转换为文字、图像、声音等形式,供用户查看或使用。
    每个硬件都是独立的存在,想要建立硬件之间的关系必须借助"总线"将其链接起来,总线分为系统总线、IO总线

  • 【系统总线】:连接 CPU、内存等核心部件,负责它们之间的高速数据、地址和控制信号传输。

  • 【IO 总线】:连接 CPU(或通过内存间接)与 I/O 设备(如硬盘、键盘等),负责外部设备和系统之间的输入输出数据传输。
    【关于冯诺依曼,必须强调几点】:

  • 这里的存储器指的是内存

  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)

  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

  • 一句话,所有设备都只能直接和内存打交道

二、冯诺依曼体系结构设计意义

以下是计算机存储的金字塔存储结构:离CPU越近的一些存储设备或者存储的小的单元,效率高,造价越贵

1、为什么不让IO设备直接和cpu进行数据传输?

由于 I/O 设备的传输速度远低于 CPU 的处理速度,这就像木桶效应中最短的木板一样,制约了整个系统的性能上限,导致 CPU 频繁等待 I/O 操作,使系统效率受限于 I/O 设备的低速瓶颈。

因此引入了内存作为 "缓冲层":

  • 利用内存作为缓冲:通过预先将大量数据加载到内存中,减少 CPU 直接等待输入输出设备的时间。内存的读取和写入速度远高于外设,能够更快地向 CPU 提供所需数据,加快数据传递速度,为 CPU 提供高效支持;
  • 分离操作,提升并行性:CPU 从内存中读取数据与外部设备向内存导入数据这两个过程可以同时进行。这种并行处理方式避免了串行执行所带来的效率低下,实现数据流动的并行化,大幅提升整体效率。

简言之,内存的引入既通过高速缓冲打破了 I/O 设备的速度瓶颈,又通过并行机制充分释放了 CPU 的处理能力,让系统性能不再被低速 I/O 所束缚。

2、内存和IO设备之间的速度差是如何解决的呢?

  • I/O 设备先将数据批量写入缓冲区(减少与内存的零散交互次数);
  • 同时,内存可与 CPU 并行处理其他任务(避免因 I/O 低速导致内存空转),最终通过 "批量缓冲 + 并行调度" 抹平速度差带来的效率损耗。

简言之,I/O 设备直接给内存传输是少量多批次传递 ,而给缓冲区传是大量少批次传递。以传输 10 个字节数据为例:

  • 直接给内存传:一次仅传 1 个字节,需传 10 次;且传输时内存需全程等待,无法执行其他任务。
  • 给缓冲区传:可一次性传输 10 个字节,仅需传 1 次;虽传输过程耗时(因 I/O 设备本身速度慢),但相比前者效率大幅提升。

进一步补充:由于缓冲区属于内存的一部分,其传输速度与内存一致。这意味着,当数据从缓冲区向内存其他区域同步时,是高速无延迟的;而 I/O 设备向缓冲区传输的 "慢",仅源于 I/O 设备自身的物理限制,缓冲区的存在让这种 "慢" 被集中控制,不再频繁打断内存的高效工作,最终实现了内存与 I/O 设备速度差的高效适配。

3、内存和cpu之间的速度差是如何解决的呢?

这个时候又有疑问了,内存和cpu的处理速度也不一样啊,他们直接是否也有类似的优化设备呢?

有,CPU 缓存(如 L1、L2、L3 缓存)就是这类优化设备。

  • 作用:它是介于 CPU 和内存之间的高速存储区域,速度接近 CPU。
  • 原理:CPU 优先从缓存读取数据,缓存中没有时才访问内存,以此弥补 CPU 与内存的速度差,提升数据访问效率。

【总结】:

经过上述操作,通过内存缓冲区(大量少批次 + 并行)、CPU 缓存(主动预加载 + 并行)等中间介质的分层存储设计,实现设备间并行工作以弥补速度差,最终大幅提升整机运行效率。

三、冯诺依曼体系结构的数据流

1、如何解释QQ聊天的数据流动?

2、思考:传输文件和传输文字有啥区别?

传输文件和传输文字的区别主要体现在最终存储与呈现的环节

  • 文字消息 :聊天的文字经网卡接收、CPU 解包后,会临时存储在内存 用于即时呈现(显示器显示);同时 QQ 会自动将其长期存储到硬盘的聊天记录文件夹,所以关闭窗口后,内存临时数据释放,但硬盘的长期存储数据仍在,再次登录可从硬盘读取查看。
  • 文件传输 :单次传输的文件经网卡接收后,必须先存储到硬盘(即 "下载" 过程),之后查看时才从硬盘读取到内存,经 CPU 处理后由显示器呈现。因为文件从始至终依赖硬盘长期存储,所以电脑关闭后重新打开,只要硬盘数据未删除,依旧能查看。

【小彩蛋】

一个程序要运行,必须得先加载到内存中运行,为什么?

回答:一个程序要运行,必须得先加载到内存中运行,原因是冯诺依曼体系结构规定了 "程序和数据需以二进制形式统一存储在存储器(内存)中,CPU 只能直接从内存读取指令和数据来执行"


四、操作系统是什么?

操作系统是一款进行管理软硬件资源的软件

操作系统包括(广义上指的是下述全部,狭义上只指的是内核):

  • 内核:它承担着核心的管理工作,具体包括:

进程管理(负责调度和管理计算机中运行的程序进程)
内存管理(对计算机的内存资源进行分配与回收等操作)
文件管理(管理存储设备上的文件,如:创建、删除、读写文件等)
驱动管理(为计算机硬件设备提供驱动支持,使硬件能与操作系统正常交互)

  • 其他程序:

函数库(为应用程序提供可调用的函数,助力程序实现各类功能)
shell 程序(为用户提供与操作系统内核交互的命令行界面,方便用户输入指令操作计算机)
操作系统是软件层的核心,它和其上层的所有软件(系统软件、应用软件)共同构成了完整的软件层

可以拆解为三层逻辑:

  • 底层:操作系统(系统软件的核心),负责管理硬件资源、提供系统调用接口,是软件层与硬件层的 "桥梁";
  • 中间层:其他系统软件(如 Shell、图形库、编译器等),基于操作系统的接口,进一步为上层提供更易用的工具或开发环境;
  • 上层:应用软件(如 QQ、浏览器、游戏等),直接面向用户需求,依赖操作系统和中间层系统软件提供的支撑来运行。

五、为什么要有操作系统?

  1. 操作系统帮助用户,管理好下面的软硬件资源!
  2. 为了给用户提供一个良好(稳定,高效,安全)的运行环境

【总结】:

操作系统通过管理好底层的软硬件资源(手段),为用户提供一个良好的执行环境(目的)

"操作系统就像银行 ------ 它需要为用户提供软件运行、资源访问的服务,但从安全角度出发,它不会完全信任任何用户或程序。就像银行会通过柜台窗口来隔离储户与核心业务区域,既提供存取款服务,又避免储户直接接触银行内部系统引发风险;操作系统也通过一系列机制,在为用户和软件提供服务的同时,有效规避异常行为,保障自身的安全运行。那么,操作系统是如何实现这种'服务与安全的平衡'的呢?"

为保障自身数据安全并能为用户提供服务,操作系统以系统调用(由 C 语言实现的内部函数调用接口)作为唯一入口,用户及上层软件需通过该接口才能访问操作系统内部数据,以此实现服务提供与安全防护的平衡。好比我们平时使用计算机有时会弹出需要管理员权限才能做该操作,这也是对操作系统的一种保护。

六、操作系统是如何管理软硬件的呢?

1. 管理本质:通过 "数据管理" 实现 "对象管理"

操作系统作为管理者,无需与被管理的软硬件直接 "见面",而是通过数据间接管控------ 先将软硬件属性抽象为数据(描述)再用数据结构组织这些数据(组织),最终把对软硬件的管理转化为对数据结构的 "增删查改"

  • 就好比 "学校管理":校长(操作系统)通过学生的 "学院、学号" 等数据(描述)和链表(组织)管理学生,无需直接面对每个学生。

2. 描述过程 ---> 用 "结构体" 抽象软硬件属性

由于操作系统底层是由 C 语言实现的,因此会为每类被管理对象(进程、硬件、内存等)定义结构体 ,将其核心属性 "打包" 成可操作的数据结构,完成 "物理实体→逻辑数据" 的抽象。

  • 例 1(进程管理):定义task_struct(如 Linux 的进程控制块),包含 PID、优先级、内存占用等属性,让 "进程" 成为可存储的 "数据对象"。
  • 例 2(硬件管理):为网卡、硬盘定义结构体,描述其型号、工作状态、驱动入口等属性,将硬件特性转化为操作系统可识别的数据。

3. 组织过程 ---> 用 "数据结构" 串联所有对象

链表、数组、哈希表 等数据结构,将同类对象的 "结构体实例" 串联成 "对象集合",实现批量管理。

  • 例 1(进程组织):将所有进程的task_struct链表串联(如 Linux 进程链表),调度时只需遍历链表即可决策。
  • 例 2(内存组织):将空闲内存块的结构体用链表组织(空闲内存链表),分配内存时通过链表 "查、改" 完成操作。

4. 最终操作:对数据结构的 "增删查改"

所有软硬件管理工作,最终转化为对结构体和数据结构的 "增、删、查、改"

  • 增:创建进程时插入task_struct到链表,分配内存时拆分空闲块。
  • 删:进程退出时从链表删除task_struct,释放内存时回收空闲块。
  • 查:调度时查询优先级最高的进程,驱动查询硬件结构体属性。
  • 改:进程状态变化时修改task_struct的 "状态" 字段,内存块占用时修改其 "占用大小" 属性。

操作系统对软硬件的管理本质是建模:计算机无法直接理解 "进程""内存块" 等抽象概念,因此操作系统通过 **"结构体建模资源属性、数据结构建模资源关系"** 的方式,将物理软硬件转化为可被内核解析、操作的 "逻辑模型",最终通过对模型化数据结构的增删查改实现高效管控。

七、驱动层是做什么的呢?

1. 层级结构:三层协同,驱动层是 "软硬件桥梁"

系统分为操作系统层、驱动程序层、底层硬件层,层级间通过 "请求 - 响应" 机制传递指令:

  • 操作系统层(系统软件):包含内存、进程、文件、驱动管理等模块,是上层与硬件的 "调度中心"。
  • 驱动程序层(硬件专属软件):为网卡、硬盘、其他设备提供专属驱动,是操作系统与硬件的 "翻译官"。
  • 底层硬件层(物理实体):网卡、硬盘等硬件设备,是指令的 "最终执行者"。

2. 各层职责:驱动层解决 "硬件多样性" 与 "系统通用性" 的矛盾

  • 操作系统层的局限:需统一管理硬件,但不同硬件原理、指令集差异大,直接对接会导致系统臃肿且难以适配新设备。
  • 驱动层的核心职责:
    • 提供标准化接口,让操作系统以统一方法操作硬件,无需关心硬件细节。
    • 适配硬件特性,将硬件个性化逻辑转化为操作系统可理解的通用指令。
  • 底层硬件层的角色:接收驱动指令执行操作(如网卡收发数据、硬盘读写),并反馈结果。

3. 驱动层的价值:保障系统的 "可扩展性" 与 "稳定性"

  • **适配新硬件:**新硬件只需厂商提供驱动,操作系统无需修改即可兼容,实现 "即插即用"。
  • **隔离风险:**硬件故障仅需更新驱动或更换硬件,不会直接崩溃系统;系统升级也无需强制换硬件,降低维护成本。

八、系统调用和库函数

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

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

【总结】:

  • 库函数与系统调用接口是 **"上层封装与底层支撑" 的调用关系 **:库函数(如 C 语言的printf)通过封装系统调用接口实现功能,是开发者可直接调用的 "上层工具";系统调用接口则是内核提供的 "底层入口",负责衔接硬件执行实际操作。
  • 由于计算机操作需 "自顶向下贯穿软硬件",而开发者无需了解底层硬件细节,因此所有对硬件的间接操作(如 I/O、内存管理)最终都建立在系统调用接口之上------ 库函数只是对系统调用的 "易用性封装",系统调用才是用户操作与硬件执行的 "核心桥梁"。
相关推荐
恪愚2 小时前
webRTC:流程和socket搭建信令服务器
运维·服务器·webrtc
wudl55662 小时前
Flink20 SQL 窗口函数概述
服务器·数据库·sql
拾忆,想起3 小时前
Dubbo异步调用实战指南:提升微服务并发性能
java·服务器·网络协议·微服务·云原生·架构·dubbo
adnyting3 小时前
【Linux日新月异(三)】CentOS 7软件管理深度指南:从YUM到源码编译
linux·运维·centos
知识分享小能手3 小时前
openEuler入门学习教程,从入门到精通,云计算与 Linux 操作系统概述(1)
linux·云计算·openeuler
励志成为编程高手3 小时前
在ubuntu中创建根文件系统
linux·ubuntu·rootfs
HIT_Weston3 小时前
31、【Ubuntu】【远程开发】内网穿透:反向隧道建立(三)
linux·运维·ubuntu
skywalk81634 小时前
在FreeBSD 14.3上部署轻量级Linux jail环境 仅仅占用10M内存
linux·运维·服务器·虚拟机·轻量化·freebsd·jail
知南x4 小时前
【STM32MP157 异核通信框架学习篇】(10)Linux下Remoteproc相关API (下)
linux·stm32·学习