再谈操作系统
再谈操作系统
冯诺依曼体系结构描述的是硬件的组织,而操作系统方面的知识则与软件有关。
1、操作系统的概念
任何一个计算机系统都包含一个基本的程序集合,称为操作系统。操作系统,是一个进行软硬件资源管理的软件。
还记得吗?我们将操作系统分为广义操作系统,和狭义操作系统:
| 操作系统种类 | 广义操作系统 | 狭义操作系统 |
|---|---|---|
| 操作系统(泛指) | 操作系统内核 + 核心应用软件 | 操作系统内核 |
| Linux | Linux内核 + 指令、shell命令行… | Linux内核 |
| windows | windows内核 + 图形化界面程序、软件… | windows内核 |
我们依旧在这里提醒一下:今后我们谈到操作系统,统一指的是狭义操作系统,即操作系统内核。
这里有一张网络上描述操作系统内核与外壳程序的关系图:

其中,我们可以看到,操作系统内核(Kernel内核)后跟着一段内容。这就是操作系统的四大核心管理任务:进程管理、内存管理、文件管理、驱动管理。
当然,我们知道,裸露的操作系统(内核)是不能直接接收用户提供的数据与指令,经处理后进行反馈的,即内核是不能直接用的。所以我们需要shell外壳程序。
再往外走,就是一些可以提供更具体、更个性化服务的软件。对于Linux,可能是一些指令、工具…;对于windows,可能是制作文档的工具、制作ppt的工具…;对于安卓系统,可能是游戏、播放视频的软件…
2、操作系统存在的原因
我们为什么要有操作系统?目前我们只能做一个浅显的认识:如果把操作系统删除了,我们所有的计算机硬件都将变为一堆废铁;所以,如果没有操作系统,计算机系统将无法正常运行。
我们来看一张操作系统分层架构的图:

从这张图我们可以看出,整个计算机系统是一个分层次的系统。
小贴士
操作系统并不直接管理硬件设施。操作系统通过管理特定的驱动程序,从而控制特定的硬件。
假设操作系统直接控制硬件,我们可以认为,这个世界上每添加一个硬件设备,操作系统都要多添加一些代码用来管理这个硬件。这就增加了硬件与操作系统的耦合度,不利于模块化管理,导致效率的下降。
操作系统,
- 对下,通过驱动程序进行与硬件的交互,从而对(软)硬件进行管理。这是手段。
- 对上,保证程序运行时不出现问题、不随意终止,为用户提供稳定、高效、安全的运行环境。这是目的。
所以,操作系统本质上是一个工具。我们使用操作系统这个工具,就可以完成人与计算机的交互,利用人没有而计算机有的优势,来更高效地完成一些任务。
3、操作系统对软硬件的管理
预备知识
操作系统本质上是一类软件,如今主流的操作系统,都是用C语言设计的。
提到管理,我们先来谈谈:管理是什么?
3.1、“管理”
管理,描述的就是管理者与被管理者的问题。
比如,在大学中,
- 校长就是管理者;
- 辅导员就是执行者;
- 学生就是被管理者。
在这个世界上,人做任何事情,无非两类:
- 做决策
- 做执行
比如:开学前,校长召开会议,做出决策:各个新生辅导员做好新生信息的收集工作;辅导员就执行校长的策略;刚入学的学生就接受管理,详细填写自己的主要信息。
校长作为管理者,核心工作就是做决策。而学生作为被管理者,是做执行的载体。
细节一:管理者要做好管理,不需要和被管理者见面!
管理者做管理不需要与被管理者见面,那么管理者如何把被管理者管理好?
实际上,管理者与被管理者见面,不是刚需。在管理者看来,被管理者身上相关的有效信息,才是管理的核心。也就是说,管理的本质是对数据做管理。管理者需要根据数据,做出相关的决策。
比如,我们大多数学生,几乎很少见到校长。但是校长依旧可以做出一些重大决策,因为校长手中掌握了学生们的数据。
细节二:管理者不需要与被管理者见面,那么管理者如何获取数据?
校长不直接与学生见面,那么校长手中学生的数据哪里来的?这时,辅导员就派上了用场。
辅导员作为执行者,执行校长关于收集学生信息的决策,将收集到的信息提交给校长,校长就可以根据这些数据做出下一步的决策。
在上面的情境中,
- 校长就是操作系统;
- 学生就是硬件;
- 辅导员就是硬件的驱动程序。
操作系统并不直接与硬件接触。操作系统通过硬件的驱动程序,收集硬件的相关数据(信息就是数据),传输给操作系统;操作系统根据硬件的数据,结合用户输入的指令与数据,通过硬件驱动程序,完成对硬件的控制。
3.2、计算机实现管理——建模
假设当前大学中,只有50名学生。校长得到了一份辅导员手写的学生信息收集表,上面包含的信息有:姓名、电话、性别、身高、体重、学分绩点、在校表现…
由于学生的数量很少,校长就可以很容易地分析表格,做出决策:
- 挑出绩点最高的一位学生,给予奖学金;
- 挑出绩点倒数的几位同学,通知辅导员特殊关照一下;
- 挑出身高最高的前几位同学,参加市里的篮球比赛;
- …
然而,随着时间的推移,学校招收的学生越来越多,人数达到了10000人。这时辅导员做表格就要做半天,校长看表格也要看半天,严重影响了行事效率。
聪明的校长想到了使用计算机制作学生信息收集表,并且在计算机上进行分析。那么有没有一种数据类型,能够包含学生所有不同的信息,从而表示每一位学生?
还记得吗?我们曾经学过结构体:
struct Stu
{
char _name[10];
char _phone[11];
const char* _sex;
double _score[50];
char _behaviour[128];
// ...
};
有了结构体包含学生的基本信息,我们就可以表示(实例化)出所有学生了:
struct Stu zhangsan = {...};
struct Stu lisi = {...};
struct Stu wangwu = {...};
以前手写、查找表格速度慢,现在计算机上制作与分析表格快多了。
有了结构体还不够,学生变量与学生变量之间还是没有任何关联。校长想找出绩点最高的学生,必须一个一个找,还是比较麻烦。
为了让学生之间产生一种明显的联系,我们又想起了:节点
struct Stu
{
char _name[10];
char _phone[11];
const char* _sex;
double _score[50];
char _behaviour[128];
struct Stu* _next;
};
每增加一个学生,我们就在前一个学生节点后,创建一个学生节点并插入,就形成了一个链表:

现在校长有以下三个需求:
- 找出身高最高的人,参加篮球比赛;
- 找出C语言成绩最好的3个人,组队参加C语言比赛;
- 找出绩点最高的人,给予奖学金。
那么校长这三个需求,就可以转化为遍历链表求最值的问题。
依据上面情境的思路,我们就可以把现实问题,转化为对数据结构的增、删、查、改!
回到我们对于管理的阐述。管理的本质是对数据进行管理,对数据的管理又可以转化为对数据结构的管理。这就是对现实问题做建模,我们此处的建模,指的是将现实问题转化为计算机问题。
3.3、先描述,再组织
在上面的情境中,
- 校长利用结构体存储学生信息,表示学生,是为描述;
- 校长将所有学生节点连接成链表,然后利用链表解决实际问题,是为组织。
在显示生活中,任何系统要被管理,任何问题要让计算机解决,就必须先描述,再组织。
问题一
我们之前写C语言程序,比如通讯录、贪吃蛇、扫雷游戏。我们一般都是先定义结构体描述一些基本对象,然后设计数据结构解决问题。这也是先描述,后组织。
问题二
我们说C++是一种面向对象的编程语言,C++有“类”这个概念,C++还有一个stl标准库,里面规定了许多数据结构及方法。
- 类的本质:对象的描述。
- stl的本质:对象的组织方式。
事实上,先描述,再组织,不仅仅是操作系统完成管理的方式,不仅仅是计算机解决问题的指导思想,不仅仅是C++的设计思想;先描述,再组织,可以认为是整个世界对于所有事物进行管理的真相!
只不过操作系统进行管理时的“先描述,再组织”,就是将基本要素用类型表示出来,然后将抽象的管理任务,转化为管理数据结构的问题。这就意味着,操作系统内部一定存在大量的结构体与数据结构。
小贴士
当然,操作系统基本都是由C语言设计的。我们目前暂时先用struct结构体做描述,后面到了涉及C++的部分,就可以使用class等类类型了。
4、系统调用
现在我们知道了:操作系统内,存在着大量的结构体、数据结构。但是,直接访问这些结构体与数据结构,是有风险的。
你是一个银行行长,你有许多下属都是银行工作人员,你们构成一个银行系统;银行系统又与银行的桌椅、电脑、金库等银行的财产构成整个银行。
今天张三来存300元。你作为银行行长,你敢让张三自己在电脑里登记,然后自己往金库里面寄存自己的300元吗?答案是不行的:人人都这么干,群众中总有坏人会偷拿。
明天李四来取钱。李四是一个老大爷,腿脚都不方便,操作电脑、登记数据更不用说。身为银行行长,你也不敢让李四自己操作。
你作为银行行长,现在有两件事需要做到:
- 为人们提供存钱、取钱等服务;
- 防止群众中的坏人损害银行财产;
于是,你下令建了一堵玻璃墙,外面放桌椅,里面放电脑、金库…;外面开放给人们,而对于里面,你只开放了一个个小窗口;以后人们来银行想办什么事,都只能通过这个窗口完成。
人们想访问银行系统,只能通过银行提供的窗口完成;同理,用户想访问操作系统(内核)中的数据,只能通过系统调用完成。这就保证了操作系统不会发生数据丢失、恶意篡改的情况,以及不会发生因为用户的误操作导致操作系统损坏的情况发生,也就保证了用户安全的运行环境。
4.1、printf函数需要通过操作系统吗?
C语言中的printf函数向显示器打印内容之前,需要通过操作系统吗?
答案是需要。显示器属于硬件,而硬件的管理者是操作系统;printf向显示器做写入,必须经过操作系统。
4.2、库函数简单认识
向printf这样的我们不需要自己实现的函数,就是C语言提供的库函数。

如图,操作系统上层还有一个系统调用接口。实际上,系统调用接口就是C语言函数。
库函数在系统调用接口的上面一层。库函数是对系统调用函数的封装。如何理解?
第二天李四来取钱。李四是一个老大爷,腿脚都不方便,操作电脑、登记数据更不用说。身为银行行长,你也不敢让李四自己操作。
现在你有了第三个任务:帮助不熟悉操作的人,以及腿脚不方便的人,完成相关的业务。聪明的你专门设置了一个职位:大堂经理。大堂经理就是专门给那些不熟悉流程的人,以及腿脚不方便的人做指导的。
同理,大多数用户对于系统调用接口并不熟悉。所以就需要库函数对系统调用接口做封装,未来用户不会直接使用系统调用接口,而是操作更简单的库函数。库函数的使用,降低了用户使用操作系统的成本。
小贴士
并不是所有库函数都封装了系统调用接口。如果库函数需要访问硬件,那么库函数就一定要封装系统调用接口。
windows与Linux的系统不一样,那么系统调用接口肯定也是不一样的。我们使用的C/C++库函数,可能在windows系统和Linux系统分别都实现了一份。
本文重点:
- 先描述,再组织——操作系统管理(软)硬件的宏观方法;
- 系统调用。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)