
◆ 博主名称: 晓此方-CSDN博客 大家好,欢迎来到晓此方的博客。
⭐️Linux系列个人专栏: 【主题曲】Linux
⭐️此方的GitHub: github_此方
⭐️ Re系列专栏:我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)

文章目录
- 概要&序論
- 一,操作系统万物之始:冯诺依曼体系结构
- [二、操作系统(Operating System)](#二、操作系统(Operating System))
- 三、操作系统的目的
- 四,操作系统的管理:"先描述再组织"
概要&序論
hello大家好,我是此方,终于,我们进入了整个Linux主题曲的第二部分,随着不断的深入,这段旋律也愈来愈走向它的高潮------ 。我们都知道------Linux的学习大致可以分为这么几个话题,现在我们正式要进入它的第一个话题:[进程 ]。好的,现在我们开始吧。

一,操作系统万物之始:冯诺依曼体系结构
1.1认识体系结构
我们常见的计算机,如你正在使用的笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系 。

截至目前,我们所认识的计算机,都是由一个个的硬件组件组成:
- 输入单元: 包括键盘,鼠标,扫描仪,写板,摄像头等
- 中央处理器(CPU): 含有运算器和控制器等
- 输出单元: 显示器,打印机等
- 存储器:有ROM和RAM
磁盘和网卡比较特殊。 我们后面讲,它即属于输出设备又属于输入设备。
1.1.1软件运行的先决条件
- 存储位置 :程序在运行之前,是以文件 的形式存储在磁盘上的。我们将磁盘称之为外存。
- 必须先加载 :软件在运行前,必须先加载到内存 中。内存就是体系结构中的存储器。
那么,我们为什么要将之加载到内存中呢?
- CPU 获取指令和写入数据,只能通过内存来进行。
- CPU 执行我们的代码并访问我们的数据,其直接交互对象是内存 而非磁盘。

这一切都是由冯·诺依曼体系结构 等计算机基础架构决定的。外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。一句话,所有设备都只能直接和内存打交道。
继续追问 ,为什么CPU 获取指令和写入数据,只能通过内存来进行呢?
- 决定因素 :体系结构的整体效率,很大程度上是由设备间的 "拷贝"效率 决定的。
- 关键点:内存作为磁盘与 CPU 之间的缓冲,其读写速度远高于磁盘,因此将程序加载至内存是提升运行效率的关键。
- 假设CPU的速度量级是纳秒级别,而外设的速度量级是毫秒级别,外设会拖累CPU,计算机内部也是一个木桶效应。为什么有缓冲区也是这个原因。

数据流动本质 :数据的流动实际上是从一个设备 "拷贝" 到另一个设备的过程(例如:从磁盘拷贝到内存,从内存拷贝到 CPU 寄存器)。
1.1.2计算机内部各个存储设备的读写速度
于是乎,我们引出了"读写速度"的概念,对于计算机内部不同的存储设别,一个金字塔形状可以表示。

所以说,现代计算机其实是一个非常有性价比的东西,如果从性能与价格上来讲。并不是所有的组件都是寄存器(太贵)。也并非全部都是磁盘(太慢)。
1.1.3数据的流动与体系结构
我们需要一个例子来解释这个问题,不错,正好有一个。
如下,当 Mr.Zc 通过键盘发送信息或从磁盘读取文件传给 Mr.List 时,数据必须先从键盘或磁盘这些外设拷贝到内存,由 CPU 处理后再拷贝到网卡通过网络发出,而接收端的 Mr.List 则是通过网卡接收数据到内存,再由 CPU 调度拷贝至显示器或磁盘。


这里的本质------就是两个体系结构的交互。
二、操作系统(Operating System)
2.1操作系统的概念
2.1.1操作系统到底是什么
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
或者,我们尝试换一个角度:广义上来讲,操作系统是内核+其他程序。但是也有些狭义上的观点认为------操作系统==内核。我们以下的讨论,默认是狭义概念

2.1.2Linux内核与安卓与各种手机操作系统的关系
Linux 内核、安卓与厂商系统是**"地基、毛坯房与精修房"的嵌套关系:图中红圈所示的 狭义操作系统即 Linux 内核,它作为最底层的地基负责管理内存与进程等硬核资源;
安卓则在内核之上封装了 shell 和各类原生库,形成蓝色大圈所代表的 广义操作系统**,提供了完整的开发环境;
而各大手机品牌则是基于安卓进行深度定制 ,通过更换不同的外壳程序和图形化界面,将底层技术包装成用户最终看到的手机系统。(比如我用的OPPO就是ColorOS操作系统,底层是安卓,最底层是Linux)
三、操作系统的目的
- 对下,与硬件交互,管理所有的软硬件资源
- 对上,为用户程序(应用程序)提供一个良好的执行环境(给我们提供可以访问硬件的能力)
你可以把上面的两个都当成目的,但是更好的理解方式是前者是最终目的,后者是实现目的手段。
3.1软硬件体系层状结构
3.1.1什么是软硬件体系层状结构
为了实现这个目的,一台计算机做了这样的处理:它构建了一个软硬件体系层状结构 ,这个东西实在是太艺术太伟大了。
这个层状结构是一个高内聚低耦合的。
- 高内聚:相似的功能放在一起。
- 低耦合:比如函数封装,类封装,继承层级关系。
这样的设计,还体现在这个硬件的可维护性,比如我这个磁盘坏了,换一个磁盘,内存条坏了,换一根内存条。修它,不用去影响其他的,就是这个意思。

3.1.1拆讲软硬件层状结构的细节
这个东西太大了,我一个一个跟你讲讲不了,直接用一个案例来把他们穿起来。
当我们在代码中调用来自 C 库的 printf 函数来访问硬件(显示器)时 ,这个printf底层封装了系统调用接口;随后,系统调用接口触发操作系统执行相应逻辑,由操作系统调用驱动程序,最终由驱动程序直接驱动硬件完成字符的输出显示。

好,看完你一定一头雾水,这啥跟啥呀。来解释一下这里面的每一个细节:
3.1.1.1系统调用
- 是什么 :操作系统内核留给上层应用程序的软件接口,是用户空间进入内核空间的唯一合法通道。
- 有哪些 :(了解一下,后面都会讲)
- 进程控制 :
fork(创建进程)、exit(终止进程)。 - 文件操作 :
open(打开)、read(读取)、write(写入)、close(关闭)。 - 设备管理 :
ioctl(设备控制)、read/write。 - 内存管理 :
brk(分配内存)、mmap(内存映射)。
- 进程控制 :
为什么会有系统调用?先说结论:降低耦合度、安全、与服务提供 我这里有一个很好的例子:把 操作系统 想象成一家 银行。
我不信任你但是我要为你服务

-
操作系统不相信任何人 :
银行里存放着大量的现金(系统资源:内存、硬件访问权等)。如果银行允许任何客户(用户程序)随意走进金库自己拿钱,那整个金融系统(操作系统)瞬间就会崩溃。
-
安全与秩序的边界 :
因此,银行建立了一个厚厚的"防弹玻璃窗口"。客户只能站在玻璃外,通过这个窗口(系统调用接口)向柜员(操作系统内核)提交业务申请(参数传递)。
-
受控的服务过程 :
柜员会检查你的身份证(权限校验),确认无误后,由柜员亲自进入金库取钱,再从窗口递给你(返回值)。在这个过程中,客户始终无法直接接触到金库。
在实际开发中,我们很少直接写系统调用,而是使用
printf或scanf这种库函数。
- 库函数(如 C 库):就像是银行提供的"自助填单机"或者"自动取款机"。
- 底层逻辑 :你调用
printf向屏幕打印文字,底层其实是printf帮你调用了操作系统的write系统调用。(只要这个库函数和硬件有关系,那么底层极大概率就封装了系统调用)
操作系统为了保护自己,必须深居幕后,只通过 系统调用 这一扇窗户与外界交互。这种设计保证了系统的安全性 (防止用户程序乱搞硬件)和稳定性(屏蔽硬件细节)。
3.1.1.2驱动程序
- 是什么 :介于硬件与操作系统之间的翻译官,通过软件代码屏蔽硬件差异。驱动程序有很多,因为每一个硬件都要有自己的个性化驱动。
- 有哪些 :
- 网络设备驱动:网卡驱动。
- 存储设备驱动:磁盘控制器驱动、NVMe 驱动。
- 输入输出驱动:显卡驱动、键盘鼠标驱动、打印机驱动。
- 总线驱动:USB 驱动、PCIe 驱动。
3.1.2总结软硬件体系结构层状结构
ok,所以回过头来。我们总结一下:
- 库可能在底层封装了系统调用。
- 访问操作系统,必须使用系统调用 -- 其实就是函数,只不过是系统提供的
- 我们的程序,只要你判断出它访问了硬件,那么它必须贯穿整个软硬件体系结构!!

在回到刚才,其实这张图的这一块,就相当于是系统调用了。
有没有对我们的整个结构一目了然了?
四,操作系统的管理:"先描述再组织"
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的"搞管理"的软件
还是用一个例子来解释:
4.1第一阶段:管理者与被管理者的"非面谈"机制
在一个大型组织里,比如校长(管理者)是不需要直接和成千上万个学生(被管理者)见面的。校长如何了解并管理这些学生呢?
他需要一张 Excel 表格。表格里记录了每个人的姓名、性别、年龄、籍贯、紧急联系人、各科成绩、职位、宿舍号等关键信息。
管理本质: 校长对学生的管理,实际上变成了对这张"表格数据"的管理。

随着学生数量激增到几万人,第一阶段的坏处就显现了。校长每天早上如果想找一个成绩异常的学生,或者统计平均分,必须从头到尾遍历一遍 这张厚重的纸质表格或庞大的电子表。严重拖慢管理节奏。
4.2第二阶段:引入类与结构体(描述)
为了解决效率问题,校长(此时也是一名优秀的程序员 )决定不再盯着那张死板的表格。他利用 C++ 的思维,定义了一个结构体或类:
cpp
struct student {
string name; // 姓名
char sex; // 性别
int age; // 年龄
float score; // 成绩
string origin; // 籍贯
// ... 其他属性
};
通过这个 struct,校长把每一个真实存在的学生,都抽象成了一个计算机能够理解的对象。
** 这就是 "先描述"。将管理对象的属性抽离出来,形成统一的模板,使之"数字化"。
4.3第三阶段:链表化管理(组织)
有了描述对象的模板,校长接下来要做的是把这些散落在内存各处的学生对象"穿"起来。他在结构体里增加了一个指针:
cpp
struct student {
// 学生基本属性...
struct student *next; // 指向下一个学生对象的指针
};
现在,所有的学生对象形成了一个链表 (stu_list) 。校长想要增加一个学生,只需新建一个节点插入链表;想要开除一个学生,只需删除对应节点。
这就是 "再组织"。通过高效的数据结构,将描述好的对象统一管理起来,实现对海量对象的高效控制。
好好好,从校长的例子回到操作系统:
操作系统(校长)管理磁盘、网卡(学生)时,并不是直接操作硬件实体,而是通过驱动程序获取硬件数据,并在内核中为每个硬件定义一个 struct(如 Linux 中用 task_struct 描述进程,用各种 struct 描述设备),然后用链表、树等高效的数据结构将这些 struct 对象组织起来。
这就是------操作系统的管理哲学:
先描述(Describe),再组织(Organize)。 有的教科书也管这个叫建模。
题外话,学过至少高中马哲的一下就看出来了,这就是;唯物辩证法中的"认识论"以及"系统论相关原理"。所以说嘛,操作系统为什么称为计算机哲学呢?
再推广到语言层面,先描述------这就是为什么有面向对象为什么有数据结构/STL。再组织------这就是为什么有算法。全通了。
好,总结一下, 所以操作系统对进程对硬件的管理都转化为:
- "描述": 将进程和硬件的数据信息放入一个结构体
- "组织": 结构体链接结点形成链表,对链表进行管理
- 在底层最后都会转化为对某种特定数据结构的增删查改。
进程篇,第一讲·终,我是此方,我们下期再见。