目录
[1.1 冯·诺依曼体系结构的发展](#1.1 冯·诺依曼体系结构的发展)
[1.2 冯·诺依曼体系结构的五大部件](#1.2 冯·诺依曼体系结构的五大部件)
[1.2.1 输入和输出设备](#1.2.1 输入和输出设备)
[1.2.2 存储器](#1.2.2 存储器)
[1.2.3 中央处理器(CPU)](#1.2.3 中央处理器(CPU))
[1.3 冯·诺依曼体系结构重点知识](#1.3 冯·诺依曼体系结构重点知识)
[1.3.1 内存的重要性](#1.3.1 内存的重要性)
[1.3.2 为什么执行我们的程序要先加载到内存?](#1.3.2 为什么执行我们的程序要先加载到内存?)
[1.3.3 开机的时候为什么要加载操作系统呢?](#1.3.3 开机的时候为什么要加载操作系统呢?)
[3.1 操作系统的概念](#3.1 操作系统的概念)
[3.2 设计操作系统的目的](#3.2 设计操作系统的目的)
[3.3 操作系统的核心功能](#3.3 操作系统的核心功能)
[3.3.1 处理机管理(进程管理)](#3.3.1 处理机管理(进程管理))
[3.3.2 存储器管理(内存管理)](#3.3.2 存储器管理(内存管理))
[3.3.3 设备管理](#3.3.3 设备管理)
[3.3.4 文件管理](#3.3.4 文件管理)
[3.3.5 用户接口](#3.3.5 用户接口)
[3.4 如何理解管理](#3.4 如何理解管理)
[3.5 系统调用和库函数的概念](#3.5 系统调用和库函数的概念)
[3.5.1 系统调用(System Call)](#3.5.1 系统调用(System Call))
[3.5.2 库函数(Library Function)](#3.5.2 库函数(Library Function))
一、冯·诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
冯·诺依曼体系结构如下所示:

1.1 冯·诺依曼体系结构的发展
计算机的作用就是为了解决人的问题,而要解决问题,首先需要将数据或是问题输入到计算机当中,所以计算机必须要有输入设备。计算机解决完问题后还需要将计算结果输出显示出来,所以计算机必须要有输出设备。计算机通过输入设备得到数据,数据在计算机当中进行一系列的算术运算和逻辑运算后,通过输出设备进行输出,于是就得到了以下流程图。

但是计算机当中只有算术运算功能和逻辑运算功能是不够的,还需要有控制功能,控制何时从输入设备获取数据,何时输出数据到输出设备等。对应到C语言当中,算术运算就完成一系列的加减乘除,而逻辑运算就对应于一系列的逻辑与逻辑或等,控制功能就对应于C语言当中的判断、循环以及各个函数之间的跳转等等。

我们将就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器,简称CPU。
但是输入设备和输出设备相对于中央处理器来说是非常慢 的,于是在当前这个体系整体呈现出来的就是,输入设备和输出设备很慢,而CPU很快,根据木桶原理,那么最终整个体系所呈现出来的速度将会是很慢的。

所以当前这个体系结构显然是不合适的,于是我们就不让输入设备和输出设备直接与CPU进行交互,而在这中间加入了内存。
内存有个特点就是,比输入设备和输出设备要快很多,但是比CPU又要慢。现在内存就处于慢设备和快设备之间,是一个不快也不慢的设备,能够在该体系结构当中就起到一个缓冲的作用。
现在该体系的运行流程就是:用户输入的数据先放到内存当中,CPU读取数据的时候就直接从内存当中读取,CPU处理完数据后又写回内存当中,然后内存再将数据输出到输出设备当中,最后由输出设备进行输出显示。
于是就形成了最终的冯诺依曼体系结构。

1.2 冯·诺依曼体系结构的五大部件
在冯诺依曼体系结构主要由五种设备组成,分别是:输入设备、存储器、运算器、控制器和输出设备,它们各司其职,都做着它们各自的工作。

1.2.1 输入和输出设备
首先要来讲的就是我们能直接接触到的东西,也就是两个输入、输出设备
-
【输入设备】:向计算机输入数据和信息的设备,是计算机与用户或其他设备通信的桥梁,例:键盘、话筒、摄像头、网卡、磁盘
-
【输出设备】:是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作,例:显示器、声卡、网卡、磁盘
对于输入输入设备和输出设备,我们统称为外围设备,对于外围设备而言,都比较慢,就比如说【磁盘】,不过虽然它比较慢,但是它们都有一个优点就是:存储容量大、可以长久保存数据不丢失!
1.2.2 存储器
可以看到,对于上面所列举的输入和输出设备中,同时出现的就是网卡和磁盘这两样,我们主要来说说磁盘这个东西。因为我们要通过输入设备将输入都输入到计算机中,那计算机肯定要对这些数据去进行一些处理,此时这些数据肯定是要一直存放在计算机中的,所以肯定要有东西将我们输入到计算机中的数据都保存起来,这个时候就需要使用到一些存储器了,此时我们就要来讲讲存储器了,它分为内存和外存,不过一般我们都称之为内存
【内存】: 用于存放电脑运行中的原始数据、中间结果以及指示电脑工作的程序,断电后会丢失,容量小,速度快
【外存】:用来存放一些需要长期保存的程序或数据,断电后也不会丢失,容量比较大,但存取速度慢
注意: 这里存储器只是内存,不包括外存。
1.2.3 中央处理器(CPU)
既然可以存储我们输入进去的数据了,那要如何去处理这些数据呢?此时就需要使用到中央处理器(CPU)
运算器:计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算等等
当运算器运算完成之后,就会经过输出设备将处理后的结果交给内存,再由内存展现给用户,这就是用户与计算机之间的交互过程
不过上面这些从输入到存储到计算,再到输出的过程,计算机去如何去执行的呢?靠什么去控制这种种行为?此时就要使用到控制器了
控制器:控制器也是一个硬件,虽然外设和中央处理器在数据上没有交互,但并不代表它俩就没有交互。前面得知输入设备会把数据预装载到内存,从而和cpu进行交互,但是你怎么知道所有数据都被预装载了呢,针对没被预装载的数据,中央处理器就要和外设进行交互协商,而这个操作就是由控制器完成的,从而将数据尽可能加载到内存,或把数据从内存加载到外设。
对于上面的运算器和控制器,我们将其合称为【中央处理器】,即cpu。它是计算机的大脑、也是核心部分,很多控制信号都要经过CPU才能执行
1.3 冯·诺依曼体系结构重点知识
1.3.1 内存的重要性
经过我上面这一番讲解,相信读者对冯诺依曼的基本体系 有了一个概念了,不过一定会有同学提出这样的疑问:既然计算机只是从外界接收数据,然后处理我们输入的数据再把结果反馈给我们,那也可以不用存储器呀!

- 在上一小节中,我们讲到了输入设备和输出设备,它们统称为外围设备,对于像【磁盘】这种外围设备来说虽然它有着大容量的内存,但是读写速度却非常慢,机械硬盘读写速度平均60---80M每秒;固态硬盘不同品牌型号之间,平均大约在150---300M每秒
- 但是对CPU来说,也就我们上面说到过的运算器 + 控制器,它的运算速度读者可以自行去网上看看,那比磁盘不知道要快出多少倍了。那一个写入很慢,一个读入很快,真的可以兼容吗?
【木桶效应】:
- 什么叫木桶效应呢,也就是这个木桶的承水量不取决于木桶中最长的那块板,而取决于最短的那块板
- 对应我们上面所说磁盘与CPU:一个输入,一个读取;一个慢,一个快,虽然二者的维度不同,但计算机还是会按照慢的那个来执行,也就是说整体的效率就以外设为主了

那这一个快。一个慢,该怎么办呢?
此时就还是需要使用到冯诺依曼体系结构中的【存储器】,也就是我们俗称的内存,因为对于内存这个东西,它虽然比CPU来得慢一些,但是却比磁盘快多了,它们三者的速度大概可以像下面这样对比
- CPU ------ 纳秒(ns)
- 内存 ------ 微秒(us)
- 外设 ------ 毫秒(ms)
可以看到CPU是纳秒级别的速度,但外设却是毫秒级别的,所以就有了内存这个东西
那有了内存后则怎么使用呢?:
因为有了内存的存在,虽然它掉电易失,但还是局部短时间的存储,因此外设可以将数据暂存到内存中,此时,CPU后面想要去处理这些数据的话直接去内存中拿就可以了,无需再与外设进行交互造成不兼容的问题
CPU中不是有个叫寄存器的东西吗?也可以起到临时存储的功能,为什么不直接用它呢?
因为寄存器太贵了,只要是贵的东西就不会让我们广泛去使用。内存可以适配和外设之间的效率,既能够完成我们需要的功能,而且性能还不怎么差,它便宜。

【总结一下】:
CPU的速度是很快的,外设的速度是很慢的,因为有了内存,CPU以后在进行数据计算的时候,根本不需要访问外设了,而只要直接伸手向内存要就可以了。
1.3.2 为什么执行我们的程序要先加载到内存?
我们自己的代码和数据、编译好的指令,是要由CPU去执行的,在上一小节我们讲到CPU它只会伸手向内存要数据 ,而我们的可执行程序是一个文件,文件存放在磁盘中,所以这就解释通了为什么我们的程序要先加载到内存中,因为CPU只会去内存中读数据,体系结构决定了这一切!
1.3.3 开机的时候为什么要加载操作系统呢?
也是同样的道理,操作系统的底层也是各种指令和数据,这些都是需要CPU去解析的,它解析完了操作系统才能正常运行起来,但是CPU只能到内存中去拿数据,所以在开机的时候把操作系统率先加载进内存来CPU就方便很多了,不需要再和外设去进行交互。
二、使用冯·诺依曼体系结构理解数据在网络中流动
清楚了整个冯诺依曼体系结构,知道了大部分的计算机都是基于这种结构,那么现在我通过一个场景带你带你真实地体会一下这种体系结构在实际中的应用
现在你在上网,使用QQ向你的朋友发送了一句**"在吗"** ,那此时这个数据在网络中进行流动的呢?假设你们的电脑都是基于冯诺依曼体系结构,需要有这么一个输入、处理、输出这么一个流程

流程分析:
- 当你使用输入设备,比如:键盘,在QQ的聊天框中发送了一句"在吗"的时候,这条信息就被读取到了计算机内部,被暂时存放在了【内存】中,接着CPU就会到内存中去读取数据,解析里面的指令然后由【运算器】进行运算,接下去通过【控制器】将这些信息由【输出设备】,例如:网卡,转发到网络中进行传输,网络内是如何传输的这里就不细讲了,涉及要一些 网络协议 相关的内容
- 因为你朋友的电脑也是基于冯诺依曼体系的,所以也会存在【输入设备】,例如:网卡,将网络中传输过来的数据输入到它的计算机中,也是将其存放到内存中,然后一样CPU去内存中拿出这些数据再进行处理,转换成我们可以识别的样子,通过【输出设备】,例如:显示器,将消息打印在你朋友的屏幕。之后你的朋友再发送一句"在的",也是同理经过这样的传输,继而你们就实现了相互通信
以上就是有关冯诺依曼体系结构的叙述,大多以概念为主,配合图示进行理解,清楚五大部件各自的作用,它们之间是如何关联的。不过最重要的一点还是在于CPU是直接与内存进行交互的,因为任何数据都要通过输入设备先存放到内存中,而不是直接与CPU进行交互
三、操作系统
3.1 操作系统的概念
操作系统(OperatingSystem,OS)是一组控制和管理计算机软硬件资源、合理组织计算机工作流程、为用户和应用程序提供方便使用接口的系统软件。
分层视角理解计算机系统(自底向上)
硬件(裸机))→操作系统→系统软件(编译器、数据库等)→应用软件→用户
1.对硬件:操作系统是硬件的第一层扩充软件,裸机难以直接使用,操作系统对硬件封装,向上提供抽象服务;
2.对上层程序/用户:操作系统是资源管理者与服务提供者;
3.区分关键点:
- OS属于系统软件,不是硬件;
- 应用软件(微信、浏览器)运行在操作系统之上;
- 没有操作系统的计算机称为裸机,只能识别机器语言,使用难度极高。
通俗定义:操作系统充当硬件与上层软件之间的中间层。

3.2 设计操作系统的目的
- 方便用户使用计算机(用户角度):屏蔽底层硬件复杂细节,提供命令行、图形界面等交互手段,用户无需学习硬件指令即可操作计算机。
- 管理软硬件资源(资源管理角度):计算机CPU、内存、磁盘、外设等资源有限,OS负责分配、调度、回收资源,防止程序争抢冲突。
- 提高系统资源利用率(性能角度):通过多道程序、并发调度,让CPU、IV/O设备尽可能并行工作,减少硬件空闲时间,提升整机吞吐率。
- 扩充机器功能(虚拟机角度):在裸机之上提供各种服务(文件管理、内存管理等),将难以使用的裸机改造为功能更强、易于使用的虚拟机(抽象计算机)。
- 保证系统安全、稳定运行:提供权限隔离、故障隔离机制,避免单个程序异常导致整个系统崩溃

3.3 操作系统的核心功能
统一划分五大管理功能:处理机管理、存储器管理、设备管理、文件管理、用户接口
3.3.1 处理机管理(进程管理)
CPU是核心运算资源。
- 核心对象:进程/线程;
- 主要工作:进程创建、撤销、进程调度、进程同步、进程通信、死锁处理;
- 目标:实现并发执行,合理分配CPU时间。
3.3.2 存储器管理(内存管理)
管理主存(内存)空间。
功能:
- 内存分配与回收;
- 地址映射(逻辑地址一物理地址);
- 内存保护(进程之间地址空间隔离,不能随意篡改别人数据);
- 内存扩充(虚拟内存,利用磁盘逻辑上扩大内存容量)。
3.3.3 设备管理
管理所有外部设备(键盘、显示器、硬盘、网卡、打印机等)
- 屏蔽设备硬件差异,提供统一访问接口;
- 设备分配与回收;
- I/O缓冲管理,缓解CPU与外设速度差距;
- 实现设备独立性。
3.3.4 文件管理
外存上的数据以文件形式保存。
功能:
- 文件存储空间管理;
- 文件目录管理(文件夹、索引);
- 文件读写、共享、保护;
- 将杂乱磁盘扇区抽象成"文件、目录",用户按名字访问数据,不用关心磁盘扇区位置。
3.3.5 用户接口
操作系统向外提供三类接口,供人/程序使用系统服务:
- 命令接口:图形GUI、命令行Shell(面向普通用户);
- 程序接口(系统调用):供应用程序编程使用(重点,3.5展开);
- 图形接口GUI,现在普遍单独归类。
3.4 如何理解管理
很多初学者误解:OS 不是拥有资源,而是 "管理员",资源所有权属于硬件。 可以从 4 个维度理解 "资源管理":
- 分配:当进程申请资源(内存、CPU、磁盘空间),OS 按照策略分配资源;
- 调度:多个进程竞争同一资源时,制定算法决定谁优先使用(如进程调度、磁盘调度);
- 控制与保护:限制程序越权访问资源。例如进程不能访问其他进程内存;禁止用户程序直接操作硬件;
- 回收:进程结束 / 不再需要资源时,OS 收回资源,供其他进程复用。
两个关键管理思想
- 抽象:把复杂硬件细节封装,向上提供简单模型(磁盘扇区 → 文件;物理内存 → 逻辑地址空间);
- 多路复用(虚拟化)
- 时分复用:CPU,多个进程轮流使用 CPU;
- 空分复用:内存,多个进程同时占用内存不同区域。
总结:管理 ≠ 占有资源,而是仲裁、分配、保护、回收资源,向上提供资源抽象
3.5 系统调用和库函数的概念
3.5.1 系统调用(System Call)
定义:系统调用是操作系统提供给应用程序使用内核功能的唯一接口,属于操作系统程序接口。
- 操作系统分为内核态(管态) 和用户态(目态);
- 用户进程运行在用户态 ,不能直接访问硬件、不能操作内核数据;
- 如果程序想要执行特权操作(读写文件、创建进程、申请内存、网络收发),必须通过系统调用主动陷入内核,由内核代码完成操作。
特点:
- 系统调用属于内核提供的函数,运行在内核态;
- 触发方式:产生中断 / 异常(trap 指令),完成用户态→内核态切换;
- 是用户程序访问操作系统内核服务唯一合法通道;
- 常见例子:
read()、write()、open()、fork()、mmap()(Linux)
系统调用执行流程
应用程序 → 触发陷入指令 → CPU 切换内核态 → OS 内核执行对应服务程序 → 结果返回 → 切回用户态
3.5.2 库函数(Library Function)
定义:库函数是编程语言标准库(C 标准库、C++ 标准库等)提供的用户空间函数 ,代码运行在用户态 。 例如 C 语言:fopen()、fread()、printf()
库函数两种情况:
- 封装了系统调用(绝大多数 IO、文件函数)
printf底层调用write系统调用;fopen底层调用open系统调用; 库函数做缓冲区、参数格式化等封装,简化程序员开发。 - 纯用户态计算,不调用系统调用 例如
strlen()、sqrt()字符串、数学运算,完全在用户空间执行,不需要进入内核。
3.5.3 系统调用 VS 库函数 核心对比
| 对比项 | 系统调用 | 库函数 |
|---|---|---|
| 提供者 | 操作系统内核 | 编程语言标准库(libc 等) |
| 运行状态 | 内核态 | 默认用户态 |
| 切换开销 | 需要用户态↔内核态切换,开销较大 | 若无系统调用则无状态切换 |
| 是否依赖 OS | 不同操作系统系统调用编号、接口不同,可移植性差 | 标准库尽量屏蔽 OS 差异,可移植性更好 |
| 关系 | 库函数经常封装系统调用;系统调用不依赖库函数 |
关键易错考点
- 系统调用 ≠ 库函数;
- 有系统调用不一定有对应的库函数,有库函数不一定包含系统调用;
- 用户程序不能直接调用内核函数,只能通过系统调用;
- 命令解释器(Shell)、应用程序都会间接 / 直接使用系统调用。