Re:Linux系统篇(十六) 进程篇 · 一:深入理解操作系统:从软硬件架构到“先描述,再组织”的管理哲学


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



文章目录


概要&序論

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 (内存映射)。

为什么会有系统调用?先说结论:降低耦合度、安全、与服务提供 我这里有一个很好的例子:把 操作系统 想象成一家 银行

我不信任你但是我要为你服务

  1. 操作系统不相信任何人

    银行里存放着大量的现金(系统资源:内存、硬件访问权等)。如果银行允许任何客户(用户程序)随意走进金库自己拿钱,那整个金融系统(操作系统)瞬间就会崩溃。

  2. 安全与秩序的边界

    因此,银行建立了一个厚厚的"防弹玻璃窗口"。客户只能站在玻璃外,通过这个窗口(系统调用接口)向柜员(操作系统内核)提交业务申请(参数传递)。

  3. 受控的服务过程

    柜员会检查你的身份证(权限校验),确认无误后,由柜员亲自进入金库取钱,再从窗口递给你(返回值)。在这个过程中,客户始终无法直接接触到金库。

在实际开发中,我们很少直接写系统调用,而是使用 printfscanf 这种库函数

  • 库函数(如 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。再组织------这就是为什么有算法。全通了。

好,总结一下, 所以操作系统对进程对硬件的管理都转化为:

  • "描述": 将进程和硬件的数据信息放入一个结构体
  • "组织": 结构体链接结点形成链表,对链表进行管理
  • 在底层最后都会转化为对某种特定数据结构的增删查改

进程篇,第一讲·终,我是此方,我们下期再见。

相关推荐
Shadow(⊙o⊙)1 小时前
进程分析2.0——进程退出、进程等待-Linux重要经典模块
linux·运维·服务器·开发语言·c++·学习
pengyi8710151 小时前
高匿代理核心原理详解,隐藏真实IP实现无痕网络访问
linux·运维·服务器·网络·tcp/ip
Irissgwe1 小时前
九、Linux信号机制(一)
linux·信号处理·信号·进程信号·信号的产生
皮卡蛋炒饭.1 小时前
数据链路层相关学习
linux·数据链路层
Benszen2 小时前
云计算基础-1: VMware落地部署CentOS 7
linux·centos·云计算
JackSparrow4142 小时前
彻底理解Java NIO(二)C语言实现 I/O多路复用+Reactor模式 服务器详解
java·linux·c语言·后端·nio·reactor模式
feng_you_ying_li2 小时前
linux之库的原理,动态库(3)
linux
代码AC不AC2 小时前
【Linux】信号收尾 - 中断、内核态
linux·内核态·中断
草莓熊Lotso2 小时前
【Linux系统加餐】从原理到实战:System V消息队列全解析 + 基于责任链模式的工业级封装
linux·运维·服务器·c语言·c++·人工智能·责任链模式