目录

一、冯诺依曼体系

1.1. 冯诺依曼体系

1.2. 数据信号

1.3. 为什么需要内存这个媒介 (小问题)

1.4. 理解数据流动

场景一:张三通过QQ 发送文字 “你好”

场景二:张三通过QQ 发送一个文件

场景三:李四接收上述内容(“你好”文字 或 文件)

二、操作系统

2.1. os 是一个软硬件结合管理的软件

2.2. 理解“管理”  

2.3. 系统调用  

2.3.1. 完整办事流程

2.3.2. 为什么需要“窗口”(系统调用)而不能直接进金库?


一、冯诺依曼体系

1.1. 冯诺依曼体系

        在讲解 操作系统之前,我们会讲解一套耳熟能详的的 体系 —— 冯诺依曼体系,大到不常见的服务器, 小到我们常用的 电脑,都是遵旨这个体系结构的。

        输入设备:键盘、鼠标、扫描仪、麦克风、摄像头。
        输出设备:显示器、打印机、音箱、绘图仪、投影仪。

        其中 中央处理器 简称 CPU,包含存储器和控制器等元件

        如何判断是输入设备或者是输出设备:需要站在CPU的视角,看数据的流向

  •                 数据从外部设备进入 CPU(CPU 读取数据)→ 输入设备
  •                 数据从 CPU 流向外部设备(CPU 写出数据)→ 输出设备

        简单记就是:进 CPU 的是输入,出 CPU 的是输出。

        下面我们看 数据信号以及其走向,从而得知:整个体系的运行流程

1.2. 数据信号

        我们以 QQ软件运行 为例 进行:
        首先我们知道,QQ软件是在磁盘当中的,在C区也有可能在D区,软件运行的时候,需要 CPU 指定对应的代码,访问QQ的数据,而 CPU 获取、写入 在图中所看只跟 内存 相关,换而言之,就是:QQ在运行之前会把 磁盘中的内容 加载到内存中

        本来 QQ 是在磁盘上的,如何跑到 内存中的?  因为 IO = Input / Output,这个以后再说。

        什么是加载?

                加载的内容是数据,加载的本质是拷贝,QQ运行成功后,我们可以在聊天框中看到之前(14天之后的,因为有些内容14天之后会被删除)的聊天记录,图片文件都有,他是怎么来的,是之前下载到本地的,反过来就是说,通过 把对应的文件加载到内存中,显示到 QQ 的聊天框中。

        我们现在就可以得出以下结论:

  •         软件需要运行,其实是在 CPU 上执行代码 - 因
  •         软件需要加载,加载的本质是拷贝 - 动力
  •         数据拷贝到内存,数据信号是 媒介。
  •         I/O 连接外设与内存/CPU的“门户”和“搬运动作”

        数据信号 传递的过程 (该体系的运行流程)
        用户输入的数据先放到内存中,CPU 读取数据的时候直接从内存当中读取,CPU 处理完数据后又写到内存,然后内存再将数据输出到输出设备当中,最后由输出设备进行输出显示。

1.3. 为什么需要内存这个媒介 (小问题)

        不要内存,按照上面的来可以不?不可以。输入设备和输出设备的相应时间都是毫秒级的,而 CPU 的响应时间是 纳秒级的,由木桶原理可知,最终的反应时间是 毫秒级的。这个反应时间太慢。 (时间因素)

        

        这个是 存储设备 存储大小、成本以及存储速度的图像,我们发现,能不能同时把外设都做成 纳秒级别的呢?天方夜谭,太贵 (成本问题)

        因此相互取舍,就形成了现在的结构体系。

1.4. 理解数据流动

        我们之前是站在一个点上,或者是一小段的内容上去了解数据流动,这次我们以 通过QQ 发文字 "你好" 和 发送一个 文件 来系统的理解 数据流动的过程。

场景一:张三通过QQ 发送文字 “你好”

  1. 输入阶段(键盘 → 内存)

    • 输入设备(键盘):张三敲击键盘,键盘产生电信号。

    • I/O搬运:将数据信号拷贝到内存中的键盘缓冲区。

    • CPU介入:CPU从内存读取该数据信号,通过操作系统的中断处理程序(以后再说),将其转换为字符编码。

  2. 处理阶段(内存 ↔ CPU)

    • CPU将转换好的“你好”数据,连同QQ协议的头信息(发送方ID、接收方李四的IP等),打包成一个网络数据包。

    • 这个数据包被写回到内存中属于“QQ运行时的数据缓冲区”。

  3. 输出阶段(内存 → 网卡)

    • 输出设备(网卡):CPU通知网卡控制器,将内存中已打包好的数据包,通过DMA(直接内存访问)方式拷贝到网卡的发送缓冲区。

    • 网卡将数字信号转换为网线/光纤上的物理信号,发送给腾讯服务器(再由服务器转发给李四)。

场景二:张三通过QQ 发送一个文件

  1. 输入阶段(磁盘 → 内存)

    • 输入设备(磁盘):张三点击发送文件,操作系统通过文件系统驱动,将磁盘上存储的文件数据块,以I/O读操作的方式,拷贝到内存

    • CPU加工:CPU从内存中读取文件原始数据,进行加密、压缩,并按照QQ的文件传输协议拆分成多个小数据包(分片)。

  2. 处理阶段(内存 ↔ CPU 反复进行)

    • 每处理完一个分片,CPU都会将结果数据写回内存的QQ发送缓冲区。由于文件很大,这个“读内存→处理→写内存”的过程会循环多次,分批次进行,避免了内存爆满。

  3. 输出阶段(内存 → 网卡)

         输出设备(网卡):处理好的文件分片数据,由内存通过I/O写操作,拷贝到网卡缓冲区,逐包发送出去。。

场景三:李四接收上述内容(“你好”文字 或 文件)

  1. 输入阶段(网卡 → 内存)

    • 输入设备(网卡):李四的网卡收到网络物理信号,转换为数字信号,通过I/O操作拷贝内存中的网络接收缓冲区。

    • 此时,这些数据暂时存放在存储器:QQ的数据(即内存中的QQ进程空间)。

  2. 处理阶段(内存 ↔ CPU)

    • CPU从内存中读取原始网络包,进行解包、解密、校验,还原出张三发送的“你好”文字或文件碎片。

    • CPU将还原出的有效数据写回内存,供QQ界面渲染或文件重组使用。

  3. 输出阶段(内存 → 最终外设)

    • 如果是文字(显示器):CPU将内存中的文字数据,拷贝到显存(显卡内存)中,作为输出设备(显示器)的显示缓存,最终在屏幕上显示出来。

    • 如果是文件(磁盘):CPU通知磁盘控制器,将内存中重组好的完整文件数据,通过I/O写操作拷贝输出设备(磁盘)进行持久化存储,即“另存为”或自动下载到本地。


二、操作系统

一个基本的程序集合,称为操作系统(OS)

操作系统是一款进行 软硬件结合 管理的软件,笼统的说,操作系统包括:

  • 内核(进程管理,内存管理,文件管理以及驱动管理)
  • 其他程序(例如函数库,shell程序等等)

2.1. os 是一个软硬件结合管理的软件

目的:对上,为用户的程序提供一个良好的执行环境  
手段:对下,与硬件交互,管理所有的软硬件资源  

  1.    写代码的时候,想要打开一个文件,C语言是 fopen,C++是 ostream,都是属于用户层,此时会先看 os 版本,条件编译,最后调用 系统调用接口,例如 Linux 调用的是 open  
  2.    电脑中都是有终端的,可以编写指令,这个是用户操作接口  
  3.    键盘、鼠标,每次的按键,会在电脑上做出不同的操作,硬件是如何跟软件相关的,通过驱动程序,例如鼠标的驱动程序可以设置不同按键的功能。  
  4.    磁盘的文件,每个进程的调度等,都是 os 自己操作的。  

2.2. 理解“管理”  

        本质是:先描述,在组织  

        如何去理解 管理,举例子:管理学生和学校:

        前提:校长扮演 管理者(决策权)学生是 被管理者辅导员是 执行者(中间人)。整个管理流程完美体现了 “先描述,再组织” 的建模思想。

        先描述

        辅导员为每个学生创建一条记录,包含“姓名、性别、年龄、籍贯、紧急联系人、各科成绩、职位、宿舍号”等字段。这就相当于在操作系统中为每个硬件设备(如网卡、磁盘)定义了一个struct device ,里面填满该设备的所有属性(型号、中断号、I/O端口等)。

        再组织
        辅导员将全年级学生的记录整理成一张 Excel 表格(或链表、数组)。校长拿到这张表后,不需要一个一个去找学生谈话,只需要对表格里的数据进行操作——比如找到数学满分的张三(查询),把他添加进竞赛名单(插入);找到挂科严重的李四(查询),决定是否劝退(删除或修改状态)。
        这就把“管理学生”这件复杂的事务,转换成了对一组数据(链表)的增删查改

其中我们发现:

        管理者与被管理者无需见面
        校长不需要亲自跑到教室去看每一个学生,他只要看辅导员交上来的数据表格即可。同样,操作系统管理硬件时,CPU 不需要直接操作磁盘或网卡,而是通过驱动程序(中间层)获取硬件状态数据,然后对内存中的 struct device对象进行管理。

综上:

对应操作系统的“管理”

  • 硬件设备 → 学生
  • 驱动程序 → 辅导员(收集/上报数据)
  • 操作系统内核(进程管理、内存管理等)→ 校长(根据数据做决策)
  • 所有硬件信息被抽象成 struct device → 学生信息被抽象成一行表格数据
  • 对硬件的管理 → 对 struct device 链表/数组的增删查改

2.3. 系统调用  

        我们这次以 银行 为例进行:        

2.3.1. 完整办事流程

场景: 用户(应用程序)想要从磁盘读取一个文件(好比“客户想从金库取出自己的保险箱文件”)。

  1. 用户来到银行(程序运行)

    • 客户(应用程序)不会直接冲向金库,而是先找到大厅经理(库/Shell)

    • 例如,程序员在代码中调用 fopen("file.txt","r"),这就是通过 C 标准库(大厅经理)来表达“我想读文件”。

  2. 大厅经理帮忙填表、引导(库封装系统调用)

    • 大厅经理(库函数)检查客户的身份和需求,把复杂的需求翻译成标准化的“申请单”(即:填充好系统调用所需的输入参数,如文件名、打开模式等)。

    • 然后,大厅经理指引客户去对应的窗口(系统调用接口)办理——比如 Linux 下,fopen 底层会调用 open 这个系统调用。

  3. 客户在窗口提交申请(发起系统调用)

    • 客户来到窗口(系统调用),把申请单(输入参数)递进去。

    • 这对应代码中执行 open("file.txt",O_RDONLY),CPU 触发一个软中断/系统调用指令,从用户态切换到内核态。

  4. 窗口后面的工作人员审核(内核接管)

    • 大堂经理(操作系统内核模块)收到申请单后,首先检查权限(安保人员:该用户是否有权限读这个文件?),再检查文件是否存在于磁盘(金库中是否有这个保险箱?)。

    • 如果一切合法,大堂经理(内核)亲自或指挥安保/清洁工(驱动程序)去金库(硬件)取出对应的数据。

  5. 返回结果(系统调用返回)

    • 金库(硬件)把数据交给大堂经理(内核),内核将数据拷贝到用户程序的内存空间。

    • 然后窗口(系统调用)将操作结果(返回值)递给客户——比如返回一个文件描述符(代表成功),或者返回 -1 并设置错误码(代表失败)。

    • 客户带着结果离开窗口,回到大厅经理(库函数)那里,库函数再继续后续处理(比如 fread 读取内容)。

2.3.2. 为什么需要“窗口”(系统调用)而不能直接进金库?

  • 安全:金库(硬件/核心数据)极其重要,如果任何人都能直接进去,会引发混乱和数据破坏。操作系统不相信任何人,所以必须通过标准化的窗口(系统调用)来统一受理请求,并做权限校验。

  • 简化使用:客户不需要知道金库内部怎么运作(比如磁盘的柱面、扇区、DMA传输等),只需在窗口填写标准表格(参数),工作人员(内核)会处理一切复杂细节。

  • 稳定性:窗口(系统调用接口)是固定的,不管金库内部怎么升级(换硬件、换文件系统),客户和大厅经理(应用程序和库)只要按标准格式申请,就不需要改变——这就是接口的稳定性和封装性。

对应在 Linux 系统中:

  •    Linux 是 C语言编写的,  
  •    C语言有 输入参数和返回值  
  •    输入参数:用户将参数传递给操作系统  
  •    返回值:操作系统传递给用户

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐