【Linux操作系统14】操作系统概念与管理思想深度解析

操作系统概念与管理思想深度解析



🎬 Doro在努力个人主页
🔥 个人专栏 : 《MySQL数据库基础语法》《数据结构》

⛺️严于律己,宽以待人


文章目录

导读:本文从冯诺依曼体系结构出发,深入剖析操作系统的本质、设计目的以及核心管理思想。通过"校长-辅导员-学生"的生活化类比,带你理解操作系统"先描述再组织"的管理哲学,以及系统调用存在的必要性。适合有一定C语言基础,想要深入理解操作系统底层原理的读者。


一、从冯诺依曼到操作系统:计算机的"骨骼"与"大脑"

1.1 冯诺依曼体系结构回顾

在学习操作系统之前,我们必须先回顾一个重要的概念------冯诺依曼体系结构。这是我们理解操作系统的基础,也是现代计算机体系结构的基石。

冯诺依曼体系结构将计算机划分为四个核心组成部分:

  • 输入设备:键盘、鼠标、扫描仪、磁盘、网卡等
  • 输出设备:显示器、打印机、磁盘等
  • 存储器 :这里特指内存(RAM)
  • 中央处理器(CPU):包含运算器和控制器

关于冯诺依曼体系,有几个必须强调的关键点:

📌 核心结论 :不考虑缓存的情况下,CPU只能直接访问内存,不能访问外设(输入或输出设备)。同样,外设要输入或输出数据,也只能写入内存或从内存中读取。

一句话总结:所有设备都只能直接和内存打交道。

这个结论解释了为什么我们的程序在运行前必须先加载到内存------因为程序编译后的二进制文件存储在磁盘上,只有加载到内存后,CPU才能获取到程序的代码和数据进行执行。

1.2 为什么需要操作系统

当我们把硬件搞清楚了,数据流动也搞清楚了,接下来就必须聊聊操作系统 了。因为上节课我们说过,输入设备的数据可以提前加载到内存中,然后CPU从内存中读取这些数据。那么是谁来提前加载这些数据呢?答案就是操作系统

操作系统(Operating System,简称OS) 是一个进行软硬件资源管理的软件。

这里有两个关键词需要理解:

  1. 软件资源:进程、文件、各种应用程序
  2. 硬件资源:CPU、内存、磁盘、网卡、显示器等

二、操作系统的广义与狭义理解

2.1 广义的操作系统

我们在使用Windows时,如果只有Windows操作系统本身,其实是用不了的,或者说用起来非常不方便。因为我们使用操作系统,本质上是要使用操作系统上面安装的各种软件:

  • 做PPT需要Office
  • 写文档需要Word
  • 编程需要VS Code或其他IDE
  • 娱乐需要各种游戏和播放器

广义的操作系统 = 操作系统内核 + 核心应用软件

对于Linux来说,广义的操作系统包括:

  • Linux内核
  • 各种核心指令(ls、cd、mkdir等)
  • 配套的函数库和工具

2.2 狭义的操作系统

狭义的操作系统 只聚焦于操作系统本身,不包含任何上层应用软件。它就是我们常说的操作系统内核

操作系统内核的核心工作有四大块:

  1. 进程管理:管理程序的执行
  2. 内存管理:管理内存的分配与回收
  3. 文件管理:管理磁盘上的文件
  4. 驱动与设备管理:管理各种硬件设备

💡 本文约定 :后续文章中提到的"操作系统",如无特殊说明,均指狭义的操作系统(内核)


三、操作系统的本质:一款"搞管理"的软件

3.1 为什么要有操作系统

为什么我们的电脑开机总要等几十秒?这几十秒在等什么?

答案:在等待操作系统加载到内存中。

操作系统本身也是一个软件,而且是一个非常大的软件。开机的过程,本质上就是把操作系统从外设(如硬盘)加载到内存的过程。加载完成后,操作系统才能开始工作,管理各种软硬件资源。

操作系统的核心目的可以概括为两句话:

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

这里的"良好"具体指:稳定、高效、安全

操作系统把底层的软硬件资源管理好,不是为了管理而管理,而是为了在上层给用户提供稳定、高效、安全的运行环境。这就好比班长维持班级秩序,不是为了让学生难受,而是为了给老师提供一个良好的上课环境。

3.2 计算机系统的层次结构

整个计算机软硬件架构是一套层状系统

复制代码
┌─────────────────────────────────────┐
│          上层用户应用                │
├─────────────────────────────────────┤
│          外壳程序(Shell/GUI)       │
├─────────────────────────────────────┤
│          系统调用接口                │
├─────────────────────────────────────┤
│          操作系统内核                │
├─────────────────────────────────────┤
│          驱动程序                    │
├─────────────────────────────────────┤
│          底层硬件                    │
└─────────────────────────────────────┘

驱动程序是专门为硬件设计的软件,操作系统通过管理驱动程序来间接管理硬件。这就好比妈妈让孩子吃饭,孩子不听,妈妈就喊姐姐来管,孩子就怕了。操作系统不直接管理硬件,而是通过驱动程序这个"姐姐"来管理。


四、管理的本质:先描述,再组织

4.1 一个生活化的故事

要理解操作系统如何进行管理,我们先来讲一个生活化的故事。

假设在一个学校里,有三种角色:

  • 校长:真正的管理者
  • 辅导员:执行者,负责采集学生信息
  • 学生:被管理者

关键问题:校长可能四年都没见过你一面,但他为什么能把你安排得明明白白?

答案 :因为校长不需要和你见面,他只需要获取你身上的有效数据

  • 你的各科成绩
  • 你的学分绩点
  • 你的在校表现
  • 你的特长爱好

校长基于这些数据就可以做决策:

  • 成绩太差?辅导员去把他开掉
  • 成绩优秀?给他发奖学金
  • 篮球打得好?让他参加校队

4.2 管理的本质是对数据的管理

从这个故事中,我们可以得出一个重要结论:

🔑 管理的本质是对数据的管理,而不是对人的管理。

管理者和被管理者不需要见面,管理者只需要获取被管理者身上的有效数据,基于这些数据做决策,然后通过执行者将决策落地。

在计算机世界中:

  • 校长操作系统
  • 辅导员驱动程序
  • 学生硬件/进程/文件

操作系统要管理硬件,就需要通过驱动程序获取硬件的各种信息(状态、工作模式、健康程度等),然后基于这些信息做决策。

4.3 先描述,再组织

现在我们来思考一个问题:假设校长要用计算机来管理学生,他会怎么做?

第一步:描述(Description)

校长需要定义一个数据结构来描述学生的属性:

c 复制代码
struct Student {
    char name[20];      // 姓名
    int id;             // 学号
    char gender;        // 性别
    float scores[50];   // 各科成绩
    float gpa;          // 学分绩点
    char performance[100]; // 在校表现
    char *next;         // 指向下一个学生的指针
};

这个结构体就是对学生这个"被管理对象"的描述。它包含了学生所有的关键属性,对应着Excel表格中的列。

第二步:组织(Organization)

有了描述之后,我们需要把多个学生对象组织 起来。最简单的方式就是用链表

c 复制代码
struct Student *head = NULL;  // 链表头指针

// 创建学生节点
struct Student *stu1 = malloc(sizeof(struct Student));
strcpy(stu1->name, "张三");
stu1->id = 1001;
// ... 填充其他属性

struct Student *stu2 = malloc(sizeof(struct Student));
strcpy(stu2->name, "李四");
stu2->id = 1002;
// ... 填充其他属性

// 连接成链表
stu1->next = stu2;
stu2->next = NULL;
head = stu1;

4.4 管理工作的转化

当校长把学生的管理工作转化成链表的管理工作后:

  • 找身高最高的学生 → 遍历链表求身高属性的最大值
  • 找成绩最好的3个学生 → 遍历链表排序取前3
  • 开除成绩最差的学生 → 遍历链表找GPA最小值,然后删除对应节点
  • 统计学生人数 → 遍历链表计数

所有对学生的管理工作,都转化成了对链表的增删查改操作!


五、从生活到代码:操作系统就是数据结构的集合

5.1 操作系统内部的数据结构

操作系统是用C语言编写的(99%的代码是C语言,1%是汇编)。既然是用C语言写的,那么操作系统内部要管理各种对象(硬件、进程、文件等),就必须遵循"先描述,再组织"的原则。

操作系统内部一定会存在大量的结构体和数据结构!

被管理对象 描述方式(结构体) 组织方式(数据结构)
硬件设备 struct device 链表/数组
进程 struct task_struct 双向链表/红黑树
文件 struct inode 哈希表/B+树
内存页 struct page 伙伴系统

💡 深刻认识 :操作系统本质上就是一个大型的数据结构算法的集合

5.2 为什么数据结构这门课存在

为什么计算机专业都要学数据结构?因为操作系统是先实践再有理论的。工程师们在写操作系统时,发现需要各种数据结构来管理不同的对象,于是把这些实践中总结出来的结构整理成册,就有了数据结构这门课。

  • 链表 → 用于管理进程列表
  • 队列 → 用于进程调度
  • 栈 → 用于函数调用
  • 哈希表 → 用于文件索引
  • 树 → 用于内存管理、文件系统

5.3 编程语言的"先描述再组织"

理解了"先描述,再组织"之后,你会发现几乎所有面向对象编程语言的设计都遵循这个原则:

语言 描述(类/结构体) 组织(容器)
C struct 数组、链表(自己实现)
C++ class STL容器(vector、list、map等)
Java class 集合框架(List、Map、Set等)
Python class 内置数据结构(list、dict等)

这就是为什么C++要有classSTL容器,因为你要管理对象,就必须先描述再组织。这也是为什么Java、Python等语言都要有类和相应的容器机制。

语言只是工具,"先描述再组织"才是管理事物的本质规律。


六、系统调用:用户访问内核的唯一窗口

6.1 银行柜台的故事

理解了操作系统如何管理内部资源后,我们来思考另一个问题:用户如何访问操作系统?

让我们再用一个银行的故事来说明。

银行系统内部有:

  • 桌椅板凳(硬件资源)
  • 电脑系统(软件资源)
  • 金库(核心资产)
  • 各种工作人员

银行需要给普通群众提供服务(存钱、取钱、贷款),但如果让所有人直接进到银行内部,自己打开金库存钱、自己在电脑上改账户余额,会发生什么?

安全问题! 群众当中有坏人!

但是,如果银行不对外提供服务,那银行就没有存在的价值了。

银行是怎么解决这个问题的?

开柜台窗口!

银行在系统内部开出一个一个的小窗口,用户只能通过窗口与银行交互:

  • 你要存钱?把存折和钱交给柜台工作人员
  • 工作人员在内部帮你把钱放入金库,在电脑上更新余额
  • 然后把结果(存折、回单)返还给你

6.2 系统调用的本质

操作系统面临同样的问题:

  • 操作系统内部有大量的数据结构(链表、队列等)
  • 如果允许用户直接访问这些数据结构,可能会被恶意修改,导致系统崩溃
  • 但如果不让用户访问,操作系统就没有价值了

解决方案:系统调用(System Call)

操作系统提供一套系统调用接口 ,这是用户访问操作系统内核的唯一方式

🔐 重要结论 :用户要访问内核中的数据,有且只有一种方式------通过系统调用。

6.3 系统调用就是C函数

因为操作系统是用C语言写的,所以系统调用本质上就是C函数,只不过这些函数是由操作系统提供的,而不是标准C库提供的。

例如:

  • fork() ------ 创建子进程
  • open() ------ 打开文件
  • read() / write() ------ 读写文件
  • malloc() 底层会调用 brk()mmap()

这些函数都有参数和返回值:

  • 参数:用户传递给内核的数据(如要写入的内容)
  • 返回值:内核返回给用户的结果(如操作是否成功)

这就好比银行柜台:你把存折和钱(参数)交给工作人员,工作人员办完事后把存折和回单(返回值)还给你。

6.4 printf也需要操作系统

最后,让我们思考一个问题:printf向显示器打印数据,需要经过操作系统吗?

答案是:必须!

printf的本质是向显示器这个硬件写入数据。而显示器是硬件,硬件的管理者是操作系统。你想访问硬件,必须给它的管理者(操作系统)"打招呼"。

printf的调用链大致如下:

复制代码
printf() → 标准C库 → 系统调用(write) → 操作系统内核 → 驱动程序 → 显示器硬件

所以,学习Linux系统编程,本质上就是在学习各种系统调用!


七、总结

7.1 核心知识点回顾

本文我们深入探讨了以下几个核心概念:

  1. 冯诺依曼体系结构:CPU只能直接访问内存,所有设备都只能和内存打交道

  2. 操作系统的定义

    • 广义:内核 + 核心应用软件
    • 狭义:内核(进程管理、内存管理、文件管理、驱动管理)
  3. 操作系统的目的

    • 手段:管理软硬件资源
    • 目的:为用户提供稳定、高效、安全的执行环境
  4. 管理的本质

    • 管理者和被管理者不需要见面
    • 管理的本质是对数据的管理
    • 核心思想:先描述,再组织
  5. 系统调用

    • 用户访问内核的唯一方式
    • 本质是操作系统提供的C函数
    • 类比:银行柜台窗口

7.2 "先描述,再组织"的深刻意义

"先描述,再组织"这六个字是理解操作系统的关键:

  • 描述:用结构体(struct/class)定义被管理对象的属性
  • 组织:用数据结构(链表、树、哈希表等)将多个对象关联起来

操作系统内部存在大量的结构体和数据结构,学习操作系统的过程,就是学习各种对象如何被描述、如何被组织的过程。

7.3 学习建议

理解了本文的内容后,在学习后续的操作系统知识时,你可以带着以下问题去思考:

  1. 进程是如何被描述的?(task_struct结构体)
  2. 进程是如何被组织的?(双向链表、调度队列)
  3. 文件是如何被描述的?(inode结构体)
  4. 文件是如何被组织的?(目录树、哈希表)

当你能够回答这些问题时,你就真正理解了操作系统的管理思想。


相关推荐
Trouvaille ~1 小时前
【Linux】poll 多路转接:select 的改良版,以及它留下的遗憾
linux·运维·服务器·操作系统·select·poll·多路复用
没有bug.的程序员1 小时前
本地开发环境优化深度实战:Docker Compose 编排内核、依赖服务治理与极速环境搭建指南
运维·docker·容器·compose·本地开发·编排内核·依赖服务治理
Doro再努力1 小时前
【Linux操作系统13】GDB调试进阶技巧与冯诺依曼体系结构深度解析
linux·运维·服务器
blueSatchel1 小时前
GPIO子系统源码研究
linux·c语言
8125035331 小时前
计算机网络全栈连载计划
linux·网络·网络协议·计算机网络
袁袁袁袁满1 小时前
Linux如何保留当前目录本身并清空删除目录内的所有内容(文件+文件夹)?
linux·运维·服务器·清空删除目录内的所有内容
济6171 小时前
ARM Linux 驱动开发篇---Linux设备树实战-- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
山北雨夜漫步2 小时前
点评day04 一人一单集群
运维·服务器
Chasing Aurora2 小时前
vscode连接 服务器进行 深度学习
linux·ide·vscode·深度学习·研究生·解压缩·连接服务器