揭秘计算机核心:冯诺依曼架构与操作系统底层原理
冯诺依曼体系架构以输入、输出、存储、运算器和控制器五大部件为核心,强调数据与指令存于内存,CPU仅访问内存。为提升效率,采用分级存储结构,缓存与内存协同工作。操作系统作为软硬件中介,通过进程、内存、文件、设备管理实现资源调度与抽象,向上提供系统调用接口,由库函数封装简化使用。系统调用是内核服务入口,保障安全与效率,体现“管理即数据结构”的核心思想。
目录
一、冯诺依曼体系架构
1.1 数据为什么要存在内存
1.2 CPU的核心地位
二、操作系统
2.1 操作系统的概念
2.2 为什么要有OS(下文OS都指狭义的OS)
2.3 OS的管理作用
2.4 系统调用与库函数:OS的对外接口
一、冯诺依曼体系架构
冯诺依曼体系由五大核心硬件组成,分别是输入设备,存储器,输出设备,运算器及控制器
- 输入设备:包括键盘,鼠标,扫描仪等
- 输出设备:如显示器,喇叭,网卡等
- 输出与输入设备统称为外设
- 运算器:有两种运算,算术运算以及逻辑运算
- 控制器:协调各个组件工作,控制指令执行顺序(和运算器共同组成CPU)
- 存储器:存储数据和指令,其实就是内存
需要注意的是:
- 磁盘是外存,是外设
- 不考虑缓存情况,这里的CPU只能对内存进行读写,不能访问外设
- 外设(输入或输出设备)要输入或者输出数据,也只能从内存中读取
1.1 数据为什么要存在内存
概括为一句话的话是:要存储的数据很多,比如照片等等,但是并不是每个照片或文件都是当下需要用到的,为了加快检索速度,将临时需要的数据和程序放在内存,而硬盘速度很慢,不能直接给 CPU 拿来计算。(其实是牺牲速度的容量法与牺牲容量的速度法)
数据在计算机内部流动,CPU不和外设打交道,CPU要数据只从内存中读取,写数据也只写入内存
存储是分级的,距离CPU越近越快容量越贵
1.2 CPU的核心地位
- 运算器和控制器共同组成CPU,是计算机的大脑
- 现代CPU会集成多级缓存(L1、L2、L3)
- 存储层次关系(从快到慢,成本从高到低):
CPU 寄存器 → 高速缓存 → 内存 → 本地磁盘 → 远程存储。
二、操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),笼统的理解,操作系统是一个进行软硬件资源管理的软件,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等)
2.1 操作系统的概念
操作系统的定义可以分为广义与狭义两种:
广义OS:操作系统 + 核心应用软件
狭义OS:操作系统内核,直接管理硬件、进程、内存、文件、设备,向上给应用提供系统调用,运行在最高特权级。
他们的关系可以用下面这张图来表示。
2.2 为什么要有OS(下文OS都指狭义的OS)
OS在计算机架构中处于中间的管理层的位置,起到对下管理硬件,对上服务应用的作用(通过驱动来起到管理的作用)
- 对硬件:封装复杂硬件细节,统一管理 CPU、内存、磁盘;
- 对程序:给应用提供简单接口,不用直接操作硬件;
- 对资源:调度分配资源,多程序并发运行、隔离保护;
- 对用户:提供易用的使用环境。
2.3 OS的管理作用
| 功能模块 | 核心职责 | 解决什么问题 | 主要对象 |
|---|---|---|---|
| 进程管理 | 进程的创建、撤销、调度、同步与通信 | 让多个程序能并发运行,公平分配 CPU 时间 | 进程、线程 |
| 内存管理 | 内存的分配与回收、地址映射、内存保护 | 多进程同时驻留内存且互不干扰,合理利用内存 | 物理内存、虚拟地址 |
| 文件管理 | 文件的创建 / 读写 / 删除、目录管理、磁盘空间分配 | 让用户和程序方便地持久存取数据 | 文件、目录、磁盘 |
| 设备管理 | 设备的驱动、分配、启动、I/O 控制、中断处理 | 屏蔽硬件差异,统一管理各种外设 | 键盘、显示器、磁盘等 I/O 设备 |
| 系统调用接口 | 向用户程序提供访问内核功能的统一入口 | 应用无需直接操作硬件,安全使用系统资源 | 应用程序 |
管理的本质是对数据做管理,被管理者身上的相关有效数据才是管理的核心。
OS管理硬件分为两步,
- 用struct结构体描述被管理的对象(因为操作系统是用C写的)
- 用链表或其他高效的数据结构组织结构体
而操作系统本身其实是数据结构的集合。
2.4 系统调用与库函数:OS的对外接口
如果直接让用户访问内核数据结构,会存在安全风险,因此给用户提供接口来规避这样的问题,用户如果想要访问系统,只能通过系统调用的方式。
OS通过两层接口向应用提供服务,降低使用门槛:
- 系统调用:内核直接提供底层接口(如fork创建进程,open打开文件),功能基础,权限高,但使用复杂
- 库函数:对系统调用的封装,简化使用,提供额外功能(如缓存,错误处理)
• 在开发角度,操作系统对外会表现为⼀个整体,但是会暴露自己的部分接口,供上层开发使用, 这部分由操作系统提供的接口,叫做系统调用。
• 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发
库函数与系统调用函数是上下层的关系
| 系统调用是内核提供的底层接口,运行在内核态;库函数是用户空间的函数,运行在用户态。 |
很多库函数封装了系统调用(例:fopen封装open、printf封装write)帮我们简化逻辑、增加缓存、错误处理。 |
不是所有库函数都包含系统调用:部分纯计算类库函数(strlen)全程在用户态执行,不会触发系统调用 |
| 系统调用是 OS 真正的服务入口,库函数只是上层包装,不是必须的,你也可以直接用系统调用编程 |
库函数存在的意义在于减少用户使用操作系统的成本!