从冯诺依曼到操作系统——理解“操作系统到底在干什么”
开始学习 Linux 系统编程之后,我发现真正想理解操作系统,不能一上来就只背各种 Linux 命令。
很多我们平时习以为常的事情,比如打开一个程序、运行一段代码、读取一个文件,背后其实都离不开操作系统。
所以这一天的学习,我主要从两个基础概念开始:
冯诺依曼体系结构和操作系统。
一、什么是冯诺依曼体系结构?

我们平时使用的电脑、服务器,本质上都属于计算机系统。
从硬件角度来看,一台计算机主要由几个部分组成:
- 输入设备
- CPU
- 内存
- 输出设备
比如键盘、鼠标属于输入设备,显示器属于输出设备,CPU 负责计算和控制,而内存负责保存程序运行过程中需要的数据。
冯诺依曼体系中有一个非常重要的思想:
CPU 主要和内存进行数据交互,外设的数据也需要通过内存与 CPU 或其他部分发生联系。
所有设备都只能直接和内存打交道。
二、不要只把冯诺依曼理解成一张图
以前学习计算机组成原理时,我觉得冯诺依曼体系就是背下来几块硬件。
但是这次学习让我意识到,它更重要的是理解:
数据到底是怎么流动的?
例如我们登录聊天软件,给朋友发送一条消息。
表面上看只是:
输入文字
↓
点击发送
↓
朋友收到消息
但从系统角度来看,实际上涉及:
键盘
↓
输入数据
↓
内存
↓
CPU处理
↓
网络相关模块
↓
发送数据
↓
对方设备
↓
内存
↓
CPU
↓
显示设备
学习操作系统时,不能只关注“程序代码写了什么”,还要关注:
数据在整个计算机系统中是怎么流动的。
三、什么是操作系统?
计算机系统都包含一个基本的程序集合,这个程序集合就是操作系统。
简单来说,操作系统主要包括:
操作系统
├── 内核
│ ├── 进程管理
│ ├── 内存管理
│ ├── 文件管理
│ └── 驱动管理
│
└── 其他程序
├── Shell
├── 函数库
└── 其他工具
命令行只是我们接触操作系统的一种方式,真正核心的是内核。
四、操作系统为什么存在?
操作系统其实承担着两个方向的工作。
对下
面对硬件:
CPU
内存
磁盘
网卡
各种外设
操作系统负责统一管理这些资源。
对上
面对用户程序:
C/C++程序
Shell程序
各种应用程序
操作系统需要给它们提供一个比较方便的运行环境。
操作系统的设计目的为:
向下管理软硬件资源,向上为应用程序提供良好的执行环境。
五、操作系统最核心的定位:管理
这里有一个我觉得非常重要的概念:
操作系统是一款“搞管理”的软件。
一个比较容易理解的例子:
学生
↓
辅导员
↓
校长
管理一个群体之前,首先要做两件事情:
第一,描述对象。
第二,组织对象。
把这个思想放到计算机里也是一样的。
比如操作系统要管理很多进程:
先描述进程
↓
再组织进程
↓
最后进行管理
六、操作系统怎么管理硬件?
先描述:
struct结构体
再组织:
链表或其他高效数据结构
也就是说,操作系统真正管理的并不是一个抽象的“硬件”。
而是先把硬件或者系统对象的信息保存下来,再通过数据结构组织这些信息。
这也是为什么 Linux 内核代码,经常能看到各种 struct。
七、系统调用是什么?
应用程序并不能随意操作操作系统内部的数据和硬件。
操作系统会向上暴露一部分接口。
这些由操作系统提供给用户程序使用的接口,就是:
系统调用。
例如:
fork();
getpid();
getppid();
这些都是程序和操作系统发生联系的重要方式。
操作系统对外表现为一个整体,但会向上提供部分接口,而这些接口就是系统调用。
八、为什么还需要库函数?
系统调用虽然功能强大,但是使用起来相对底层。
因此开发者可以在系统调用之上进行封装。
形成:
应用程序
↓
库函数
↓
系统调用
↓
操作系统内核
↓
硬件
这样一来,普通开发者就不需要直接面对所有底层细节。
九、今天最大的收获
今天没有写很多代码,但我反而觉得这是非常重要的一天。
因为以前学习 C/C++ 时,我关注的是:
变量
函数
指针
数组
现在开始把视野往下面延伸:
应用程序
↓
库函数
↓
系统调用
↓
操作系统
↓
硬件
同时又从冯诺依曼体系的角度开始理解:
输入
↓
内存
↓
CPU
↓
内存
↓
输出
我开始意识到:
程序并不是孤立运行的。
程序之所以能够运行,是因为操作系统在背后帮我们管理 CPU、内存、文件以及各种硬件资源。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)