冯・诺依曼体系


在文章开始之前,我们先来了解一下CPU和操作系统

  1. CPU(中央处理器) 就是电脑的“干活工人”,所有计算、程序的执行全靠它。简单来说,你打开QQ、运行代码、玩游戏,这些操作最终都会变成一条条指令,交给CPU去执行、去计算
  2. 操作系统(OS) 就是电脑的“大管家”,CPU、所有硬件(内存、硬盘、键盘)和软件(QQ、浏览器)等等都归操作系统管理。它的核心工作 就是分配任务——给每个软件分专属的内存空间,让CPU轮流给各个软件干活,不让它们相互影响。如果没有操作系统,CPU就是个“没人管的工人”,啥也干不了,硬件也都是“一堆废零件”。所以电脑开机的第一件事就是启动操作系统

一、 冯・诺依曼体系

计算机要解决问题,流程其实特别简单 :输入数据 → 计算处理 → 输出结果计算处理都是由cpu负责
但直接这么做有个致命问题:CPU 极快,输入输出设备极慢
如果让 CPU 直接跟键盘、硬盘、网卡打交道,CPU 会一直等外设,整机速度被拖死
于是冯・诺依曼提出一套结构,解决了速度不匹配的问题
在这里插入图片描述

  • 输入设备: 键盘、鼠标、网卡、硬盘等,负责把数据送进来
  • 存储器(内存):中间缓冲层,比外设快得多,比 CPU 慢一点
  • 输出设备:显示器、网卡、音响、打印机等,负责把结果展示出去
  • 运算器:做算术运算、逻辑运算
  • 控制器:指挥各个硬件什么时候做事,比如什么时候从输入设备获取数据、什么时候向内存写数据、什么时候让CPU执行运算

CPU=运算器+控制器,乍一看控制器干的活怎么这么像操作系统。其实控制器只是CPU内部的小机器,它只管CPU内部读取指令、指挥CPU干活,范围特别小。而操作系统是电脑的全局大管家,它管理整个电脑,管硬件、软件、内存、进程、分配CPU时间等等

值得注意的是存储器指的是内存,不包括硬盘等外存

最终形成一条铁律:CPU 只和内存打交道,外设也只和内存打交道

这就是为什么:程序要运行,必须先加载到内存
因为可执行程序(比如QQ.exe)是存在硬盘(外存)上的而CPU不认硬盘,只认内存,这也是“为什么打开软件要等一会”的原因——本质是程序从硬盘加载到内存的过程

二、 内存到底在干啥?

内存提升效率的核心是缓存局部性原理

1、 缓存

  1. 外设慢,CPU快,内存就充当中转站。数据先丢进内存,CPU直接从内存取;CPU处理完数据后,也先写回内存,等输出设备需要时,再从内存中获取。
  2. 这也就是我们平时说的 “缓冲区” 概念——比如缓冲区满了才会把数据打印到屏幕上,用fllush函数可以直接输出缓冲区数据,本质都是内存作为缓冲的作用
    (我们之前用C语言写printf函数时,都会在结尾加上“\n”,\n不仅能换行,还可以刷新缓冲区数据,所以我们不需要等缓冲区满了,可以直接打印)
    在这里插入图片描述

2、 局部性原理

可是从外设到内存,内存到外设,不也是需要时间吗,又能快多少呢。
根据统计学规律,当一个数据正在被访问时,下一次有很大可能会访问其周围的数据。 所以当CPU需要获取某一行数据时,内存会将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下一次CPU就可以直接从内存中获取数据,不用再去硬盘读取,大大提升效率

三、 操作系统

正式来说,操作系统是一款负责管理计算机所有软硬件资源,并为用户程序提供执行环境的系统软件
它夹在计算机硬件和用户应用程序之间,承上启下:对下对接硬件、管理资源,对上为软件提供服务, 是计算机正常运行的“核心枢纽”,没有操作系统,硬件只是一堆无法协同工作的散件,用户也无法打开任何软件

1、 狭义、广义操作系统

  1. 狭义操作系统仅指内核(Kernel)。内核是操作系统最核心、最底层的部分,直接和硬件交互,承担所有核心管理工作。我们以后的文章中说的操作系统大多数指的是内核
  2. 广义操作系统指的是内核+外围辅助软件。我们平时用的Windows、Linux、macOS,都属于广义操作系统——它以内核为核心,还包含了一系列预装的系统级软件、库函数(比如glibc)、驱动程序、桌面环境等。
    比如我们打开电脑看到的桌面、文件管理器、命令行工具,还有系统自带的计算器、记事本,以及glibc这样的标准库,都属于广义操作系统的一部分,它们依托内核运行,帮用户更方便地使用电脑。
    在这里插入图片描述

补充:glibc(GNU C Library)是Linux系统中最核心的库函数集合,它封装了系统调用,为用户程序提供了更简单、更易调用的接口,能够以以最简单的方式操作硬件内存

2、 内核能干啥?

内核能管理所有资源,核心作用有4点

  1. 硬件管理
    通过驱动程序,直接与CPU、内存、硬盘、键盘、网卡等硬件交互,控制硬件的运行(比如指挥键盘接收输入、硬盘读写数据)

  2. 内存管理
    划分内存空间,给每个程序分配独立的内存,防止程序之间互相干扰、占用对方内存

  3. 进程管理
    创建、调度、终止进程,决定哪个进程优先使用CPU,协调多个进程同时运行(比如同时打开QQ和浏览器,内核调度CPU轮流为它们服务)

  4. 资源分配
    统一分配计算机的所有资源(CPU时间、内存空间、硬盘容量),确保资源高效、合理利用,避免浪费

3、 操作系统的目的

  1. 对下与硬件交互,管理所有硬件资源,也就是前面说的4点作用
  2. 对上为用户提供一个良好的执行环境。用户程序不用关心硬件怎么工作,只需调用操作系统提供的接口,就能实现各种功能(比如读取键盘输入、显示内容到屏幕),不用处理复杂的硬件交互细节
  3. 操作系统管理着最底层的核心数据,但是这些数据并不直接对用户公开,而是提供一小部分接口,很大的原因是为了安全性。打个比方,你去银行取钱,银行不可能直接带你去金库让你自己拿,而是提供柜台服务,你和工作人员说要取多少钱他们来帮你处理。操作系统也一样,如果放任用户去修改底层,很可能导致系统崩盘。所以才有了“系统调用”只提供一部分安全的接口。
  4. 库函数是对系统调用的“封装和简化”
    库函数把复杂的系统调用包装成简单、易使用的接口,用户不用记住复杂的系统调用格式,只需调用库函数,就能实现对应的功能。比如我们用C语言中的printf()函数打印内容,printf()本质上就是封装了write()系统调用,帮我们完成“向屏幕输出数据”的操作,不用我们直接调用系统调用

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

通俗来说,就是先给管理对象建档案,再把档案整理好方便管理

  1. 先描述
    用C语言中的结构体(struct),记录每个管理对象(进程、文件、硬件)的所有信息,相当于给每个对象建一张“身份证+档案”。 比如管理进程时,用task_struct描述进程的信息;管理文件时,用结构体描述文件的名称、大小、存储位置、读写权限等

  2. 再组织
    用数据结构(链表、队列、树),把这些描述对象的结构体“串起来”,方便内核快速查找、增删、调度。比如把所有进程的task_struct用链表串起来,内核想调度进程时,只需遍历链表,就能找到对应的进程档案,不用逐个查找所有硬件和软件

相关进程话题这里就不再展开了,下一篇博客我们再来好好谈谈进程

操作系统(内核)不用直接控制硬件或软件,它只需要管理这些“描述信息”(结构体),就能间接控制所有对象,这也是操作系统高效管理的核心秘诀

四、用 QQ 聊天走一遍流程:数据到底怎么流?

讲到这里大家可能还有点晕晕乎乎的,让我们用真实的例子来理清冯诺依曼体系和操作系统之间的关系

知识补充:

  • 寄存器
    每个硬件(键盘、CPU、硬盘)里都有一块超小的空间,用来临时存一下当下要处理的一小段数据, 容量极小,用完就清空
  • 网卡
    负责接收外面的网络信号,还有把你电脑的数据打包发到网上,是一个硬件
  • 系统总线
    CPU和内存之间的“高速通道”,COU想要读写内存,必须走这条线
  • IO总线
    所有外部硬件和内存之间的“公共通道”,硬盘鼠标键盘网卡屏幕等等,所有外部硬件要传数据到内存,全部走IO总线

你的电脑

  1. 你在键盘敲字 → 键盘先将文字存储在自身的寄存器中,再通过IO总线把数据写入内存(缓冲区)。
  2. 屏幕从内存的缓冲区读到文字 → 你看到自己发的消息,这就是缓冲区的实际应用。
  3. CPU 从内存取消息 → 通过系统总线读取,然后对消息进行各种封装(比如加上QQ协议头、TCP/IP协议头),处理完再写回内存。
  4. 网卡从内存取封装好的数据包 → 通过IO总线读取,再通过网络发送出去(此时网卡是输出设备)。

朋友的电脑

  1. 网卡收到数据 → 通过IO总线写入内存(此时网卡是输入设备)。
  2. CPU 从内存取包 → 解包、还原文字,处理完再写回内存。
  3. 屏幕从内存读文字 → 朋友看到消息,整个流程结束。

电脑里所有硬件都不会直接和 CPU 交流,所有数据都会先经过内存,CPU 只负责读取和处理内存中的内容。
硬件调度、数据传输、程序运行管理等复杂操作,全部由操作系统内核在后台自动完成,我们日常使用时完全不需要手动干预

五、 电脑开机步骤(了解)

  1. 通电 → BIOS/UEFI 自检,检查硬件(CPU、内存、硬盘等)是否正常,这是硬件启动的第一步。
  2. 把操作系统内核从硬盘加载到内存(内核空间),这一步遵循冯・诺依曼体系“程序必须加载到内存才能运行”的原则,内核也是程序,所以必须先加载到内存。
  3. 内核初始化:管理内存(划分内核空间和用户空间)、驱动硬件(键盘、网卡等)、启动第一个进程(比如Linux的systemd),此时内核正式“上岗”,开始履行“管家”职责。
  4. 内核开始调度:你双击打开软件(比如QQ)→ 内核把QQ程序从硬盘加载到内存(用户空间)→ 创建PCB(进程控制块)→ QQ变成进程,CPU从内存读取QQ的代码和数据,开始执行。
  5. 所有程序都由内核统一管理,严格遵守冯・诺依曼规则(CPU只和内存打交道,外设只和内存打交道),整个电脑正常运行。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐