前言
在计算机领域,冯・诺依曼体系结构是硬件的基石,操作系统是软件的枢纽。本文将以 Linux 为视角,带你厘清冯・诺依曼体系结构的核心逻辑,剖析操作系统在该架构上的运行机制,为你理解计算机系统的底层运转打开一扇门。
📚 Linux 入门篇
🔧 Linux 工具篇
目录
一、冯诺依曼体系结构
二、冯诺依曼体系结构设计意义
1、为什么不让IO设备直接和cpu进行数据传输?
2、内存和IO设备之间的速度差是如何解决的呢?
3、内存和cpu之间的速度差是如何解决的呢?
三、冯诺依曼体系结构的数据流
1、如何解释QQ聊天的数据流动?
2、思考:传输文件和传输文字有啥区别?
【小彩蛋】
四、操作系统是什么?
五、为什么要有操作系统?
六、操作系统是如何管理软硬件的呢?
七、驱动层是做什么的呢?
八、系统调用和库函数
冯诺依曼体系(Von Neumann Architecture)是现代计算机的核心架构范式,由数学家约翰・冯・诺依曼于 1945 年提出,是全球计算机设计的理论根基。它明确计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成,核心思想是程序和数据以二进制形式统一存储在存储器中,计算机通过顺序读取并执行指令来完成复杂计算任务,从日常笔记本到大型服务器,绝大多数计算机都遵循这一架构逻辑。

【冯诺依曼体系结构五部分构成】:
【运算器】
【控制器】
【存储器】
【输入设备】
【 输出设备】
每个硬件都是独立的存在,想要建立硬件之间的关系必须借助“总线”将其链接起来,总线分为系统总线、IO总线
【关于冯诺依曼,必须强调几点】:undefined
以下是计算机存储的金字塔存储结构:离CPU越近的一些存储设备或者存储的小的单元,效率高,造价越贵

由于 I/O 设备的传输速度远低于 CPU 的处理速度,这就像木桶效应中最短的木板一样,制约了整个系统的性能上限,导致 CPU 频繁等待 I/O 操作,使系统效率受限于 I/O 设备的低速瓶颈。 因此引入了内存作为 “缓冲层”:
简言之,内存的引入既通过高速缓冲打破了 I/O 设备的速度瓶颈,又通过并行机制充分释放了 CPU 的处理能力,让系统性能不再被低速 I/O 所束缚。
简言之,I/O 设备直接给内存传输是少量多批次传递,而给缓冲区传是大量少批次传递。以传输 10 个字节数据为例:
进一步补充:由于缓冲区属于内存的一部分,其传输速度与内存一致。这意味着,当数据从缓冲区向内存其他区域同步时,是高速无延迟的;而 I/O 设备向缓冲区传输的 “慢”,仅源于 I/O 设备自身的物理限制,缓冲区的存在让这种 “慢” 被集中控制,不再频繁打断内存的高效工作,最终实现了内存与 I/O 设备速度差的高效适配。
这个时候又有疑问了,内存和cpu的处理速度也不一样啊,他们直接是否也有类似的优化设备呢?
有,CPU 缓存(如 L1、L2、L3 缓存)就是这类优化设备。
【总结】:
通过内存缓冲区(主动预加载 + 大粒度低频次传输 —— 因 IO 设备吞吐延迟高,若采用小粒度传输,CPU 完成当前数据处理后,将长期阻塞等待新数据)、CPU 缓存(主动预加载 + 小粒度高频次传输 —— 因 CPU 数据访问频率极高,需以短周期批量补充数据)等中间介质的分层存储架构,实现不同速率设备间的并行数据调度,有效弥合硬件间的速度差异,最终显著提升整机的运行效率。

传输文件和传输文字的区别主要体现在最终存储与呈现的环节:
一个程序要运行,必须得先加载到内存中运行,为什么? 回答:一个程序要运行,必须得先加载到内存中运行,原因是冯诺依曼体系结构规定了 “程序和数据需以二进制形式统一存储在存储器(内存)中,CPU 只能直接从内存读取指令和数据来执行”。
操作系统是一款进行管理软硬件资源的软件 操作系统包括(广义上指的是下述全部,狭义上只指的是内核):undefined
进程管理(负责调度和管理计算机中运行的程序进程)
内存管理(对计算机的内存资源进行分配与回收等操作)
文件管理(管理存储设备上的文件,如:创建、删除、读写文件等)
驱动管理(为计算机硬件设备提供驱动支持,使硬件能与操作系统正常交互)
函数库(为应用程序提供可调用的函数,助力程序实现各类功能)
shell 程序(为用户提供与操作系统内核交互的命令行界面,方便用户输入指令操作计算机)
操作系统是软件层的核心,它和其上层的所有软件(系统软件、应用软件)共同构成了完整的软件层 可以拆解为三层逻辑:
【总结】:
操作系统通过管理好底层的软硬件资源(手段),为用户提供一个良好的执行环境(目的)
“操作系统就像银行 —— 它需要为用户提供软件运行、资源访问的服务,但从安全角度出发,它不会完全信任任何用户或程序。就像银行会通过柜台窗口来隔离储户与核心业务区域,既提供存取款服务,又避免储户直接接触银行内部系统引发风险;操作系统也通过一系列机制,在为用户和软件提供服务的同时,有效规避异常行为,保障自身的安全运行。那么,操作系统是如何实现这种‘服务与安全的平衡’的呢?”

为保障自身数据安全并能为用户提供服务,操作系统以系统调用(由 C 语言实现的内部函数调用接口)作为唯一入口,用户及上层软件需通过该接口才能访问操作系统内部数据,以此实现服务提供与安全防护的平衡。好比我们平时使用计算机有时会弹出需要管理员权限才能做该操作,这也是对操作系统的一种保护。
操作系统作为管理者,无需与被管理的软硬件直接 “见面”,而是通过数据间接管控—— 先将软硬件属性抽象为数据(描述),再用数据结构组织这些数据(组织),最终把对软硬件的管理转化为对数据结构的 “增删查改”。
由于操作系统底层是由 C 语言实现的,因此会为每类被管理对象(进程、硬件、内存等)定义结构体,将其核心属性 “打包” 成可操作的数据结构,完成 “物理实体→逻辑数据” 的抽象。
task_struct(如 Linux 的进程控制块),包含 PID、优先级、内存占用等属性,让 “进程” 成为可存储的 “数据对象”。用链表、数组、哈希表等数据结构,将同类对象的 “结构体实例” 串联成 “对象集合”,实现批量管理。
task_struct用链表串联(如 Linux 进程链表),调度时只需遍历链表即可决策。所有软硬件管理工作,最终转化为对结构体和数据结构的 “增、删、查、改”:
task_struct到链表,分配内存时拆分空闲块。task_struct,释放内存时回收空闲块。task_struct的 “状态” 字段,内存块占用时修改其 “占用大小” 属性。操作系统对软硬件的管理本质是建模:计算机无法直接理解 “进程”“内存块” 等抽象概念,因此操作系统通过 **“结构体建模资源属性、数据结构建模资源关系”** 的方式,将物理软硬件转化为可被内核解析、操作的 “逻辑模型”,最终通过对模型化数据结构的增删查改实现高效管控。
系统分为操作系统层、驱动程序层、底层硬件层,层级间通过 “请求 - 响应” 机制传递指令:
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

【总结】:
printf)通过封装系统调用接口实现功能,是开发者可直接调用的 “上层工具”;系统调用接口则是内核提供的 “底层入口”,负责衔接硬件执行实际操作。