【Linux】冯诺依曼体系结构与操作系统概念理解

一、冯诺依曼体系结构

1、体系概述理清

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系

  • 在冯诺依曼体系结构主要由五种设备组成,分别是:输入设备、存储器、运算器、控制器和输出设备,它们各司其职,都做着它们各自的工作

[ 细说五大结构 ]

  • 首先要来讲的就是我们能直接接触到的东西,也就是两个输入、输出设备
    • 【输入设备】:向计算机输入数据和信息的设备,是计算机与用户或其他设备通信的桥梁,例:键盘、话筒、摄像头、网卡、磁盘
    • 【输出设备】:是计算机硬件系统的终端设备,用于接收计算机数据的输出显示、打印、声音、控制外围设备操作,例:显示器、声卡、网卡、磁盘

对于输入输入设备和输出设备,我们统称为外围设备,对于外围设备而言,都比较慢,就比如说【磁盘】,不过虽然它比较慢,但是价格并不贵,三五百块钱就可以买到一块512G的硬盘,贵一点的话可能像固态硬盘价格在900 ~ 1200不等,但是它们都有一个优点就是:存储容量大、可以长久保存数据不丢失!

  • 可以看到,对于上面所列举的输入和输出设备中,同时出现的就是==网卡和磁盘==这两样,我们主要来说说磁盘 这个东西。因为我们要通过输入设备将输入都输入到计算机中,那计算机肯定要对这些数据去进行一些处理,此时这些数据肯定是要一直存放在计算机中的,所以肯定要和东西将我们输入到计算机中的数据都保存起来,这个时候就需要使用到一些存储器 了,此时我们就要来讲讲存储器了,它分为内存和外存,不过一般我们都称之为内存
    • 【内存】: 用于存放电脑运行中的原始数据、中间结果以及指示电脑工作的程序,断电后会丢失,容量小,速度快
    • 【外存】:用来存放一些需要长期保存的程序或数据,断电后也不会丢失,容量比较大,但存取速度慢
  • 既然可以存储我们输入进去的数据了,那要如何去处理这些数据呢?此时就需要使用到运算器
    • 【运算器】:计算机中执行各种算术和逻辑运算操作的部件,。运算器的基本操作包括加、减、乘、除四则运算等等
  • 当运算器运算完成之后,就会经过输出设备将处理后的结果展现给用户,==这就是用户与计算机之间的交互过程==
  • 不过上面这些从输入到存储到计算,再到输出的过程,计算机去如何去执行的呢?靠什么去控制这种种行为?此时就要使用到控制器
    • 【控制器】: 完成协调和指挥整个计算机系统的操作

对于上面的运算器和控制器,我们将其合称为【中央处理器】,即cpu。它是计算机的大脑、也是核心部分,很多控制信号都要经过CPU才能执行

2、内存的重要性

  • 经过我上面这一番讲解,相信读者对冯诺依曼的基本体系有了一个概念了,不过一定会有同学提出这样的疑问:既然计算机只是从外界接收数据,然后处理我们输入的数据再把结果反馈给我们,那也可以不用存储器呀!
  • 在上一小节中,我们讲到了输入设备和输出设备,它们统称为外围设备,对于像【磁盘】这种外围设备来说虽然它有着大容量的内存,但是读写速度却非常慢,机械硬盘读写速度平均60---80M每秒;固态硬盘不同品牌型号之间,平均大约在150---300M每秒

  • 但是对CPU来说,也就我们上面说到过的运算器 + 控制器,它的运算速度读者可以自行去网上看看,那比磁盘不知道要快出多少倍了。那一个写入很慢,一个读入很快,真的可以兼容吗?

在网上有流传着一个东西叫做【木桶效应

  • 什么叫木桶效应呢,也就是这个木桶的承水量不取决于木桶中最长的那块板,而==取决于最短的那块板==
  • 对应我们上面所说磁盘与CPU:一个输入,一个读取;一个慢,一个快,虽然二者的维度不同,但计算机还是会按照慢的那个来执行,也就是说==整体的效率就以外设为主了==

那这一个快。一个慢,该怎么办呢?

  • 此时就还是需要使用到冯诺依曼体系结构中的【存储器】,也就是我们俗称的内存 ,因为对于内存这个东西,它虽然比CPU来得慢一些,但是却比磁盘快多了,它们三者的速度大概可以像下面这样对比
    • CPU ------ 纳秒(ns)
    • 内存 ------ 微秒(us)
    • 外设 ------ 毫秒(ms)
  • 可以看到CPU是纳秒级别 的速度,但外设却是毫秒级别的,它们之间要进行交互的话还是太Crazy了🤣所以就有了内存这个东西,可以==作为中介==

那有了内存后则怎么使用呢?

  • 因为有了内存的存在,虽然它掉电易失,但还是局部短时间的存储,因此外设可以将数据暂存到内存中,此时,CPU后面想要去处理这些数据的话直接去内存中拿就可以了,无需再与外设进行交互造成不兼容的问题

CPU中不是有个叫寄存器的东西吗?也可以起到临时存储的功能,为什么不直接用它呢?

  • 因为寄存器太贵了,只要是贵的东西就不会让我们广泛去使用。内存可以适配和外设之间的效率,既能够完成我们需要的功能,而且性能还不怎么差,它还便宜

【总结一下】:

  • CPU的速度是很快的,外设的速度是很慢的,因为有了内存,CPU以后在进行数据计算的时候,根本不需要访问外设了,而只要直接伸手向内存要就可以了

3、从硬件层面看软件

对于上面讲得大部分都是理论,可能会比较难懂一些,本小节我将从硬件层面看软件,使用硬件的行为来解释软件

  • 当我们使用C/C++编写完代码后都会编译生成可执行程序,对于这个可执行程序,其实就是一个文件,那既然是文件的话,它就存放在磁盘中,对于磁盘我们上面说了,就是一种外设。那此时就引出了下面这个问题

💬 为什么要执行我们的程序要先加载到内存?

  • 我们自己的代码和数据、编译好的指令,是要由CPU去执行的,在上一小节我们讲到==CPU它只会伸手向内存要数据==,而我们的可执行程序是一个文件,文件存放在磁盘中,所以这就解释通了为什么我们的程序要先加载到内存中,因为CPU只会去内存中读数据,体系结构决定了这一切!

知道了上面这点我们还可以来拓展一下

💬 开机的时候为什么要加载操作系统呢?

  • 也是同样的道理,操作系统的底层也是各种指令和数据,这些都是需要CPU去解析的,它解析完了操作系统才能正常运行起来,但是CPU只能到内存中去拿数据,所以在开机的时候把操作系统率先加载进来CPU就方便很多了,不需要再和外设去进行交互,这样就太慢了

通过以上的两个问题解答,相信你对CPU和内存之间的关系应该是非常了解了,知道了数据为什么要加载到内存中,即Why,但是我现在想问什么时候加载,也就是When

  • 也是用运行我们的程序来举例:在Windows中,我们只需要双击可执行程序,那么它就会加载到内存中了;在Linux中,我们使用./就可以运行一个可执行程序,也代表它加载到内存中

4、理解数据在网络中的流动

清楚了整个冯诺依曼体系结构,知道了大部分的计算机都是基于这种结构,那么现在我通过一个场景带你带你真实地体会一下这种体系结构在实际中的应用

现在你在上网,使用QQ向你的朋友发送了一句"在吗",那此时这个数据在网络中进行流动的呢?假设你们的电脑都是基于冯诺依曼体系结构,需要有这么一个输入、处理、输出这么一个流程

  • 下面是我画的一个流程图,可以看到就是两个冯诺依曼体系结构中间使用网络进行了互连,在这里我们先不考虑网络的问题,只谈数据是如何在各个器件中流动的

流程细说

  • 当你使用输入设备,比如:键盘 ,在QQ的聊天框中发送了一句"在吗"的时候,这条信息就被读取到了计算机内部,被暂时存放在了【内存】中,接着CPU就会到内存中去读取数据,解析里面的指令然后由【运算器】进行运算,接下去通过【控制器】将这些信息由【输出设备】,例如:网卡 ,转发到网络中进行传输,网络内是如何传输的这里就不细讲了,涉及要一些 网络协议 相关的内容
  • 因为你朋友的电脑也是基于冯诺依曼体系的,所以也会存在【输入设备】,例如:网卡 ,将网络中传输过来的数据输入到它的计算机中,也是将其存放到内存中,然后一样CPU去内存中拿出这些数据再进行处理,转换成我们可以识别的样子,通过【输出设备】,例如:显示器 ,将消息打印在你朋友的屏幕。之后你的朋友再发送一句"在的",也是同理经过这样的传输,继而你们就实现了==相互通信==

5、拓展

在了解了数据如何基于冯诺依曼体系结构在网络中进行流通,接下去我来拓展一些小知识:mag:

:book:早些年的计算机,因为芯片本身的集成能力比较差 ,有时候在进行数据读取的时候时间输入设备的数据直接打给CPU的,CPU读取完数据后再把数据写到内存中缓存起来,后面在合适的时候再让CPU从内存里拿出数据

:book:不过随着时代的发展,计算机内部除了CPU这个芯片,还有第二张芯片交DMA,它只负责将外设的数据搬到内存中,这个过程就不用CPU参与了,所以目前认为CPU不会和外设直接沟通。

:book:虽然CPU在数据层面不会和外设直接交互了,但是有些控制信号还要交互了,比如说外设要给CPU发一些控制信号,然后让CPU帮它做一些事情

【总结】:

  • 以上就是有关冯诺依曼体系结构的叙述,大多以概念为主,配合图示进行理解,清楚五大部件各自的作用,它们之间是如何关联的。不过最重要的一点还是在于CPU是直接与内存进行交互的,因为任何数据都要通过输入设备先存放到内存中,而不是直接与CPU进行交互

二、操作系统概念理解

1、引入

我们上面所讲到的冯诺依曼体系中的各大部件可以理解为硬件,在冯诺依曼体系之上,还有一堆概念叫做软件

  • 刚才我们有说过,因为有【存储器】的存在,所以可以把外设的数据预加载到内存当中,然后供CPU进行读取,但是文件中数据非常多,那此时我想提出以下几个问题:
    • 既然要预加载,那是要加载哪一部分数据呢?
    • 预加载的时候如果内存不够了怎么办?
    • CPU在执行对应的数据时,如何快速地找到你预加载的数据?
    • 计算机在进行某种计算的时候,是不是把一个任务直接跑完才跑下一个,还是多个任务同时在跑
    • 数据计算完后可以将其重定向到文件当中,在特定的路径下就可以看到所写入的文件内容,可是我们怎么去快速地找到这个文件呢? ------ 有目录,但是谁给你维护的这个目录呢?

以上这些工作是无法通过硬件来完成的,而是要通过==软件==来完成

  • 比方说在一家医院里有一些先进的仪器,照CT、照X光。但是医院当中医生少病人多要怎么分流;医生的水平也不同,要怎么更好地分配。这些光靠仪器是做不到的,要靠人去做

此时我们就可以引出一个概念,叫做【软件】,对于软件分为系统软件和应用软件,而我们本模块所要讲解的 ==操作系统== 就是属于系统软件的一部分

2、基本概念

然后我们就来聊聊有关操作系统的相关概念

【概念】:操作系统是系统最基本最核心的软件,属于系统软件的组成部分,用于控制和管理整个计算机的硬件和软件资源

笼统的理解,操作系统包括:

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

对于我们日常使用的Windows,或者是现在正在学习的Linux,它们都属于操作系统,是一个很笼统的概念,这里就不细说了【可以看看这篇文章:链接

3、设计目的与定位

那此时就有同学会疑问,操作系统被设计出来的真正用途是什么?

首先来看看下面这张图,是一整个计算机内部的软硬件系统架构【后面系统调用细述】

  • 可以明确地看出,【操作系统】是位于整个系统架构的中间层,所以你可以理解它是核心所在,也就是我们常说的C位,在上面我们也有提到,对于操作系统而言,它可以对上管理软件,对下管理硬件 ,这就是它被设计出来的目的
    1. 与硬件交互,管理所有的软硬件资源
    2. 为用户程序(应用程序)提供一个良好的执行环境
  • 既然它那么重要,那我们就给它一个定位:一款纯正的"搞管理"的软件

4、感性理解操作系统对硬件做管理【✔】

既然操作系统是做管理的,那它是怎么"管理"的呢?本小节我会通过一些现实的场景案例带读者来进行理解

  • 说起管理,如果读者是一个大学生,一定体会过管理和被管理 的不同,如果你只是一名普通的学生,也没什么职务,可能你只有被管理的份;但若是你在班里面或者学生会担任一些职务的话,就会了解到管理别人是什么感觉,但你也只能管管学生,放眼学校,比你权利大的人多的是,例如:辅导员、校长

若是有校长和辅导员的存在,那我们就肯定是那个被管理的人了,那我现在想要问一个问题:对于这二者来说谁是管理者呢?

  • 此时很同学就会异口同声地说到:那肯定是辅导员呀!校长什么时候管过我们😎

但是我想告诉你的是,真正的管理者却是校长,只是你没有察觉而已,要理解这一点,我们要先来看看"决策" 与 "执行"这两个概念

① "决策" 与 "执行"

💬 首先我想问:对于一个管理者来说,它为什么被称为管理者呢?

  • 在我们现实生活中所做的各种事情,无非可以分为两种:1.决策 2.执行
  • 那什么叫做==决策==呢?决策也就是你决定是否要去做某件事情,比方说今天有一节水课~,这个老师讲得云里雾里的,听得你都要睡着了,那你可以决定不去听他的课。但是呢若有一些课你觉得很重要,老师也讲得不错,那你会决定去听这节课
  • 那什么又叫做==执行==呢?上面说到我们自己可以决定是否要去上这个课、或者不上,但这也只是决定,还没有行动呢!执行其实就是行动:不去上这个课的话就考虑做其他有意义的事,去上这个课的话就会需要将对应的教科书、笔记放到书包然后背着书包去教室

初步理解了"决策" 与 "执行"的概念后,我们就将它映射到刚才所说的校长、辅导员和学生中来

  • 其实对于我们学生来说,"决策" 与 "执行"是混在一起的,因为做决定和执行都是我们自己,就像你来上大学你妈妈一定会和你说:把自己管好,不要去外面瞎晃;饭要吃好,不要为了省钱去吃一些垃圾食品,那这前者就是决策,后者便是执行
  • 那其实在我们生活中的其他地方,决策和执行其实是会被分得很明确的,例如说在公司中,你的领导一定是一个决策者,而不是一个执行者,它只是决定哪些事情要去做,具体怎么做还是交给手底下的人去实现

那经过我上面这么一番叙述的话,你应该可以明白什么是【决策】和【执行】了,此时我想再让你回答前面的那个问题,到底谁才是管理者

  • 校长! 它才是真正的管理者,虽然在很多地方并没有看到他在"执行",因为这些不是他做的,他要做的是"决策"
  • 举些很简单的例子,比方说学校近期要举办一些大型活动,但是贸然在学校内部搞一些活动也没有成文规矩,此时就需要得到高层领导的批准才可以,那么就需要层层上报给校长进行审批,通过一些会议后上面同意了,那下面才可以部署实施

那有的同学就好奇了,难道学生可以直接和校长打交道吗?这又成何体统,这些审批通过后就是直接当面告知学生吗?

  • 如果你是一个正常的大学生的话,一定不会有这样的经历, 校长是不会直接和学生打交道的,除非它真得非常亲民,每天无所事事,一般都需要一个中间人,它是谁呢?也就是我们"亲爱的辅导员":heart:
  • 当校长做完决策之后,辅导员就会落实这些决策,做好一些大体的规划后就可以交给一些学生会的人来负责了

这里再举个例子把上面的知识做个总结回顾

  1. 那比方说现在我们学校要举办一个程序设计大赛,以此来选拔出编程能力强的一些同学代表我们学校去参加外面的比赛,此时当校长决策好这件事后,就把计算机学院的辅导员小王叫过来说:我们学校近期决定举办一场编程大赛💻,这是属于你们计算机学院的范畴,就交给你来办了,这里的话是一万块钱的资金,找财务处去领就行,用于布置场地和购置一些材料、奖品
  2. 那辅导员在收到任务后就立马召集学院中的各个实验室的负责人,也安排开了会议,将本次活动相关的情况说明后就安排不同的人从事不同的事务,继而这个决策就被执行下去了
  3. 那当一切都安排就绪后,就在学校的官网上发放了这次活动的详情概述,并通知通过们留意并积极报名参加,那学生属于参与执行的人

那上面的这三点就可以像下图这样表示出来

② "管理者" 与 "被管理者"

充分地理解了"决策" 与 "执行"之间的关系,接下去我们来看看"管理者" 与 "被管理者"之间的联系

💬 首先我想问你一个问题,从上大学到现在,你有见过你们学校的校长吗?

  • 那同学们肯定是异口同声地回答说:开学典礼的时候见过!
  • 那现在这么一想,既然我们连管理者的面都没见过,为什么他可以把我管得这么好呢?给我安排入学、安排床位、安排就餐、安排学业,似乎一切都井然有序,不过连面都没有见过诶
  • 其实这样的想法就不对了,谁说不见你面都不能把你管理好呢?校长手底下人可多了去了,各种领导干部、辅导员、部门、学生会,那不是把你管得妥妥的。不看学校,看工作中的话其实也是一样的,拿到你在工作的时候就要你的老板天天跟在你身边管你吗,公司里面有也有各种领导,和部门经理,照样也可以把你给管理好

⭐那我们就得出了第一个结论:管理者和被管理者,其实是不需要直接沟通的!

💬 此时又有同学疑惑说:既然我们都没见过面的话,它是怎么把我管理好的呢?

  • 相信你一定也很清楚了,校长才不需要去时常关心你的生活,只要一句话就可以获取你在学校的各种情况:你是哪个学院的、哪个班的、学号是多少、上个学年的学分绩点是多少等等各种信息,为什么它可以拿到这些呢?
    • 还记得你刚入学的时候填的各种信息吗?
    • 还记得你进入学校的官网查询学期成绩吗?
    • 还记得你在班群里日常填写的各种信息搜集吗?
  • 这些其实都记录在了档案里📰,不然你的辅导员平常也没跟在你的屁股后头,为何期末可以找到你并且和你聊这么多呢,那校长通过辅导员不就可以看到这些了

💬 不仅是你和你的校长,你和你的父母也是一样

  • 设想在高中的时候,为何你在学校发生了什么他们可以立马知道呢?原因就在于他们通过某种途径获取到了你在学校的各种数据,继而才了解到了这些,才可以更好地管理你

⭐那我们就得出了第二个结论:管理的本质:对被管理对象的数据做管理!!

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

💬 上面我在图中只是列出了几个学生,但是真正地在大学中,可能存在着成千上万的学生,那校长是如何去管理这些海量数据的呢?

  • 虽然要搜集的学生信息很多,但这些信息其实都是存在重复的,因为对于每个人而言,校长只要搜集那些基本的信息就可以了,例如:姓名、年级、电话、成绩、紧急联系人 ,那根据我们C语言中所学的 结构体 和C++中所学的 类和对象 就可以对这些信息去做一个封装,如下所示
c 复制代码
struct Student{
	char name[20];
	char grade[10];
	int  tele;
	double score;
	int  emerge;
};
  • 那么每个学生的信息我都可以使用这个结构体去进行描述,那现在每个学生可以进行描述了,但是要怎么组织好这么做学生呢?此时我们可以想到使用我们在数据结构中学习过的链表,我们可以将每个学生看做是一个结点,当前结点的指针域指向下一个结点,就这样把它们一个个串起来
c 复制代码
typedef struct StudentListNode{
	char name[20];
	char grade[10];
	int  tele;
	double score;
	int  emerge;
	struct StudentListNode* next;
}SLNode;

那既然有了链表之后,我们就可以对里面的结点进行增、删、查、改了,接下去我结合具体的情景来描述一下

💬 此时校长说:我要找全校数学成绩最好的学生代表我们学校去参加数学竞赛🎯

  • 那我们就要根据score这字段去链表中查找每一名学生,然后找到他们里面数学成绩最高的一位,那其实也就演变成了对【链表的遍历

💬 此时校长又说:为了整顿学风,我打算在所有学生中找到综合成绩最差的一名,然后把他开除!❌

  • 这一点的话,我们可能需要对链表中的每个结点去记性一个升序或者降序排序,那此时就可以使用到我们所学习过的【头插 】【尾插 】相关的操作,当链表呈现有序后,找到那个成绩最低的学生结点,然后使用【头删 】【尾删】相关的操作就可以将这个结点从当前链表中剔除了

💬 此时校长还说:我发现最近某个寝室的两个学生小王和小李曾经有过斗殴的记录,为了降低再次发生的风险,败坏风气,把它们的班级做一个调整:bed:

  • 那首先还是一样,我们需要通过他们的名字去遍历链表,然后查找到它们所在的这个结点,接着将他们分配到不同的班级中即可,算是对链表结点的一个修改。但这个操作的话因为有不同的班级,所以可能需要涉及【哈希桶】,这里不做详解

💬 此时校长最后说:隔壁XX大学最近来了一个转校生,要把加入xx学院的xx班级中

  • 这个需求其实很明确,就是当前所在链表添加结点而已,校长可以新new出来一个结点,把新增的这名同学的相关属性设置好后就可以将其插入到链表中去了,如果不需要考虑顺序,那直接【尾插 】就可以了,若是要考虑顺序的话,还是要使用【插入

好,以上就是对于我们所构建出来的学生信息链表的相关增删查改属性,即完成了对校长管理工作的建模过程:house:

【总结一下】:

  • 当我们要对特定的事物进行管理的时候,管理的思路是:我们不能天天和他打交道,要通过数据去管理它,但数据可能很多,而且要管理的对象有很多信息可能都是重复的,比说我是一个工厂老板,手底下就会有很多员工,它们的很多属性类别基本都是重复的,因此我们可以通过将这些信息先通过一个结构体或者类描述出来,将它们封装在一起,获取到每个员工的信息后再将每一个结点定义初始化出来
  • 但是这样还不够,因为他们都是离散的,而不是绑在一起的,所以我们要将它们都组织起来,此时可以使用到之前所学习过的数据结构,例如:链表,那既然有了数据结构将其组织了起来,那就可以对这些数据进行操作了,类似的增、删、查、改或者是排序、搜索都可以,随意地去拿捏这些数据

👉一句话,管理的本质就是:先描述,再组织👈

④ 小结

经过了上面这一系列对硬件管理的感性理解,我们来做一个小结

  • 本节我们主要理解的是操作系统如何对硬件做管理,那它是怎么做管理的呢?其实归纳起来就是我们上面所说六个字:先描述,再组织。那对于硬件来说,其实和我们所描述的学生是同一个道理,也有它自己的属性,比如说这个硬件的名称是什么、编号是什么、归类是什么、状态是什么,我们使用最基础的【C语言】就可以去描述这些属性,构成一个个的结点,使用【数据结构】就可以将这些离散的结点组织起来,更好地做数据的管理和修改,即我们上面==对学生信息的管理变成了对链表的增删查改==
  • 因此对于上面这一系列的过程,描述的过程就是【面向对象】的封装过程,组织的过程就是【数据结构】的操作过程。所以为什么我们要学习语言呢?为什么我们要学习数据结构呢?本质上我们未来所写的软件或多或少都和管理有关
  • 所以语言帮我们完成描述的过程,数据结构帮我们完成组织的过程,只有理解了先描述再组织,才能理解管理的本质,进而去理解操作系统;换言之,想要理解操作系统,就必须得懂语言和数据结构!

⑤ 操作系统、硬件驱动与硬件

上面说了这么半天,继续回归我们开头所讲的校长、辅导员、学生,我们便可以重新去定义一下它们之间的关系

  • 校长【发布决策】 ⇒ 操作系统

  • 辅导员【执行决策】 ⇒ 硬件驱动

  • 学生【参与执行】 ⇒ 硬件

  • 对于操作系统和硬件我们上面都有提到过了,不过这里的硬件驱动可能有些读者不太明白,我来讲一讲这个

一般我们每一种硬件设备都会为其配置一个驱动程序,鼠标、键盘、网卡、声卡、显卡都具备驱动程序

  • 那有了这些驱动程序后,操作系统就可以管理到下面的硬件了,就和校长有了辅导员之后便很好地对学生做管理一样。首先它会通过各种驱动程序对各种硬件的信息做提取,然后将这些信息全部抽象,面向对象式地将其封装为一个结构体或者类,然后填充设备结构体,构造设备结点,然后将这些结点以某种数据结构管理起来,然后对操作系统对设备的管理就转换为了对链表的增删查改

💬 那操作系统怎么知道一个硬件出问题了呢?

  • 那肯定是通过驱动程序的报告来随时查看硬件的状态,或者驱动程序直接在驱动层直接改了某一个结点的状态,然后操作系统在遍历链表结点的时候发现某个结点的状态是band就知道他出现问题了

👉 所以操作系统对硬件和软件的耦合过程其实就是对管理做建模的过程

⑥ 操作系统管理的目的

在上一小节中我们谈论到的都是操作系统对下,也就是对硬件的管理,那一开始我有说起过它是一个对软硬件资源进行管理的软件,但是为什么要对它们进行管理呢?就像校长为什么要管理好我们呢?本小节来谈谈这个话题

  • 要知道,对于一款操作系统来说,它的生态取决于它的使用人数,如果使用它的人多了,那么它自己也就会被广泛地使用起来,就像Linux一样,因为有其开源社区的存在,它是一块开源的OS,而且安全、可靠,所以使用的人才会这么多,不过这也要取决于用户是否用得舒心
  • 为什么这么说呢?加个比方,有一天你下课了准备回宿舍打开电脑玩原神,怪打得好好的,但是电脑五分钟黑屏一次,八分钟蓝屏一次,那你的使用体验感一定不会很好。此时你一定会选择重装系统或者干脆换一个系统
  • 因此操作系统必须管理好当前机子的软硬件,给用户一个良好的体验感才可以留住用户

再举个贴近我们生活的例子,日常我们肯定会去餐厅吃饭,那你是会去服务好的餐厅还是服务差的呢?

  • 毋庸置疑,一定是【服务好到】,因为有了好的服务,首先心情就会好了,若是一家餐厅🏠连服务都无法保证的话,即使它做得菜再好吃那食客也不会太多
  • 因此餐厅的老板必须管理好它手底下的人,那些服务员、吧台人员我们可以视为硬件,那谁是软件呢?你可以认为是菜品🍱,在硬件没有问题的情况下首先可以保证机器可以跑起来,但是我们还要进入操作系统去使用各种软件来满足我们日常的需求。因此在有了一个良好的服务后,我们还会想要一个美味的菜品,对于餐厅老板来说,能对客人满足上面这两点那它的餐厅一定不会太差

【总结一下】:

  • 操作系统通过对下管理好软硬件资源,这是它的手段 ;对上给用户提供 安全、稳定、高效、功能丰富 的执行环境,让用户有一个最佳体验,这就是目的

5、系统调用与库函数【⭐】

经过上面一小节的叙述,知道了操作系统它会把软硬件管理得很好,争取不会出任何匹配,给用户一个良好的体验,那现在我想问一个问题:操作系统相信我们吗?

① 银行管理系统的设计💻

可能你对我这样的提问感到疑惑??操作系统为什么不相信我呢?接下去我通过一个银行的案例来讲解一下

  • 在中国有很多银行,例如:建设银行、农业银行、工商银行等等,若是你在一些金融相关的公司中从事过的话,那可能也会设计一些银行管理系统的项目开发,此时需要架构师去设计出整体的骨干框架,再将里面的内容一一完善
  • 那假设你现在作为一名架构师的话,你需要考虑整个银行的体系由哪些组成,例如最普通的电脑、服务器、各种办公软件,这可能是我们程序员平常接触较多的;除了这些之外还有一些其他的生态,比方说:桌椅板凳、员工宿舍之类的;那除了我们看得到的,也可能还有看不到的,例如:仓库、金库这些。上面的这些你都可以看作是我们上面所说到过的【硬件】,那既然是硬件的话就一定会有【硬件驱动】来对它们进行管理,例如:
    • IT部门就专门来管理电脑、服务器、各种办公软件;
    • 后勤部门专门来管理桌椅板凳、员工宿舍;
    • 安保部门专门来管理仓库、金库这些
  • 那既然有部门的话,就一定有员工去做一些日常的工作,像存款、借贷、接待、资金的流动和周转,你可以把它们看做是【软件】。那既可以管理硬件又可以管理软件的是什么呢?就是【操作系统】,对应银行这里的话也就是银行的行长。
  • 行长也是人,员工也是人,周边的则是物件,那人就一定可以管人,也可以管理物品,但是行长不会去做这些事,它所做的只是一些决策工作,具体的实施还是交给下面的员工来完成。例如IT部门的张主管反馈:银行的电脑和系统好久没有更换了,都是二十年前的,想要对这些东西做一个大更新↑ 这就要汇报给到上层领导,然后再交给银行行长做决策,最后当行长批准后再拨款然后去执行这些事情

这样,整个银行系统就被我们搭建起来了,以上的描述可以参考下图👇


💬在设计出一个银行管理系统后,我再来回答一下上面那个问题:操作系统相信我们吗?

  • 那我们还是可以以银行的场景为例,假设你手头上有500块钱,想要存到银行里去,假设现在没有网上银行这么便捷,只能到线下去办理,那请问银行会怎么给你存这笔钱💴呢?是把你带到一个仓库,和你说银行里的钱都存在这里了,你进去把自己钱放好,旁边的五百万( _ )和五吨黄金你不要去动它,放好了然后出来做个登记就可以了✍
  • 你认同我上面的说法吗?银行会让你这么做吗?答案是:当然不会!

那根据银行的案例相信你也可以回答这个问题了,操作系统会选择相信我们吗?

  • 操作系统给我们提供良好的服务,并不代表他会无条件地相信我。反之,它完全不相信我们!!!

② 初识系统调用与库函数

💬 那有同学说:这不是矛盾了吗?既然操作系统不相信我们,又怎么更好地去给我们提供服务呢?

  • 上面有说到过,操作系统为了满足用户需求,就会管理好各种软硬件,来为用户提供各种需求,但是呢它又不想用户随意地访问它内里的数据,怕一些有心人或者是电脑小白破坏了它内部的系统,因此它会提供给用户一个东西, 使得既可以满足用户的需求,又可以防止用户对自己的内容做任何修改,它就是 ------ ==系统调用接口==

【概念】:由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口 (来源 百度百科

光这么看看概念还是太抽象了,我们依旧可以通过银行的案例来进行理解🤔

  • 那对于银行来说,要如何做到既给用户办理好存、取钱的业务,又能保护好自己内部的安全,那就是【业务窗口】,银行会为每一个客户提供一个小窗口,我们通过排队拿号去各自的窗口做业务办理,在窗口内也会有对应的人员为我们受理
  • 那对应的我们上面所设计的银行系统就可以再完善一下,添加一些【窗口服务】,因为我们自己无法把钱直接存到银行里,所以我们就可以将这个需求通过窗口交给柜台人员,她会帮你去操作,进行内部的一些相互调用
  • 那有了银行的案例后我们就更好理解了,什么是操作系统的系统调用,那也就是操作系统在给我们提供良好服务的基础上又不让我们随意访问内部数据的一个接口
    • 系统:操作系统
    • 调用:操作系统设计的库函数
  • 这样就可以保证操作系统内部的封装性,又可以给用户提供特定的功能

💬 那有同学说:既然这么好的东西,可是这系统调用我怎么从来没用过呢?

  • 其实我们一直有在使用,只是你在使用的某些东西只是将系统调用这个接口进行了一个封装,你看不到而已,对于这个系统调用来说还是比较复杂的,因为有些东西我们完全看不懂,所以需要一些封装

光这么说还是比较抽象了,老规矩,上银行🏦

  • 现在开通了网上银行,基本一些小钱我们都可以通过网络的操作直接完成了,不需要花费时间跑到银行去,但是呢一些老头、老太太因为不会操作手机,因此只能到线下去办理业务,可有些东西他们还是看不太懂,因为可能不识字,所以就需要专门有人来进行引导,这个人可能就是大堂经理
  • 经过我上面这一说相信你可以理解为什么我们不可以直接去调用系统调用了,把自己想象成那个老头,系统调用就是办理业务的窗口,因为你不识字,而且反应能力不行,所以需要有人来进行引导,那么你跟着这个人就可以了,这个人你就可以理解为系统调用的一个封装

所以在系统调用之上会再去进行一个封装,来帮助我们去进行操作,那要封装成什么呢?

  1. Windows下的图形化界面,只需要点击即可完成对应的操作

2. Linux下的shell和工具集,只需输入指令即可完成对应的操作

3. C语言中的stdio.h,只需包含一下这个头文件即可直接使用里面的库函数

上面这些都是对系统调用的一个封装,在Windows底下将系统调用封装为图形化界面,在Linux底下将系统调用封装为shell和指令集,在C语言中则是将系统调用封装为头文件

💬 那既然我们日常都在写一些代码,那么我们就来讲讲这个[stdio.h]为什么要封装起来

  • 回想我们平常在写C语言代码的时候,都会调用printf()scanf()这些库函数去进行输入输出,这些库函数里难免会访问操作系统,因为要从键盘中输入数据和向显示器打印数据,但是我们能绕过操作系统直接与这些硬件直接交互吗?答案是:不可以,上面说到过了,操作系统是不相信我们的,不过它要给我们提供服务,所以此时只能提供一些系统调用接口,==通过系统调用接口,就可以贯穿整个体系结构访问到我们的硬件==,把数据打印在显示器上
  • 在我们C/C++中,包含的一些库函数,可能也会涉及访问硬件的操作,比如打开、关闭文件,键盘的读取,显示器的输出,这其实就是【IO

所以我们要去进行这些IO操作的话就要包含stdio.h这个的头文件,里面的库函数里可能封装了一些系统调用的接口,可以帮助我们与操作系统去进行交互

💬 那有同学问:那我们现在哪里呢?

  • 对于我们开发者而言,还要再上一层,当系统调用被封装成了各种东西后,我们就可以使用这些东西去进行开发了,然后开发出来的各种APP,再给到用户进行使用
  • 语言是在操作系统之上的。我们日常笔记本、手机上使用的各种APP,都是建立在各种系统调用接口上的。有些可执行程序不能跨平台的原因之一是编译器编译的二进制指令不一样,还有一点就是调用的系统接口不一样

【总结一下】:

  • 初步认识了什么是系统调用,它是操作系统为了满足用户又为了保护自己而对于提供的接口,有了这个系统调用接口后,我们便可以进行二次开发,将这些晦涩难懂的系统调用封装起来,这样当用户在需要使用操作系统内部的一些功能时,可以通过这些二次开发出来的东西,去调用系统调用,从而访问到操作系统内部的一些功能,贯穿 整个体系结构,再访问到底层的硬件

③ 软硬件体系结构

还记得我最早展示的这张图吗,可能那个时候看不懂,不过现在学习了硬件、硬件驱动、操作系统、系统调用接口后,脑海中一定是非常清晰了

  • 可以看到,操作系统其实并不是位于最高层,而是位于中间层,它也是一个软件,不过是属于系统软件的一部分。对下,通过硬件驱动管理好底层的硬件;为使用操作系统的用户提供系统调用接口,但是因为这些系统调用过于复杂,所以,所以就会一些系统工程师去通过这些接口去进行二次开发,例如:可触及的图形化界面、即输即应的shell、包含有众多库函数的头文件等等
  • 有了上面这些后,我们在做开发时候就轻松多了,无需去考虑繁杂的操作系统以及晦涩难懂的各种系统调用,只需要通过操作这些二次开发的接口,完成高效率的开发,就可以很快地实现我们的项目需求,继而为用户提供更多的响应和服务

那操作系统通过响应上层用户的需求,通过系统调用接口向下对驱动发起指令,当驱动程序拿到这些指令后再交给硬件去执行,最后再把执行的结果反馈回来给操作系统,操作系统再通过用户调用的系统调用将结果反馈给用户。这便是一次用户操作在体系结构中数据的相关流动和内部的响应

如果你觉得上面这个太大太复杂了,我这里有一张简洁一点的体系结构轮廓,也可以帮助理解

  • 可以看到,最里面的其实就是操作系统的内核,那可以看作是上面那种图的中间部分,不考虑硬件部分,那么内核之外便是操作系统为外界提供的一些系统调用,【shell】和【公用函数库】便是对系统调用所进行的二次开发,那建立在这个二次开发的基础上我们就可以去通过系统调用访问到操作系统的内核,获取到对应的功能,继而完成我们的应用程序开发工作

好,概念比较多,但如果你能经过思考将这些都理顺了,那么你会对整个操作系统的软硬件体系结构非常得清楚

④ 深刻理解系统调用与库函数

==我通过几位同学的提问来再度带读者理解一下【系统调用与库函数】==

💬上面有提到过系统调用接口,它是接口还是系统调用啊?

  • 在说概念的时候有提到过,系统调用只是一个名称,它主要的应该还是被称作接口,是什么接口呢?是操作系统提供给我们的接口,这个接口可以使我们在调用一些OS提供的库函数时更好地访问到操作系统的内核,继而产生一个联通。但是操作系统它的接口有很多,有对软件提供的、也有对硬件提供的,不一定全都是为了让外界访问到自己的内核,也可以是一些进程控制信号、调用信息之类的
  • 所以系统调用就是接口,接口不一定是系统调用

💬 上面讲到的二次开发有点还没理解,它是怎么与底层的硬件进行交互的

  • 以Linux中的指令集为例,touch指令可以用来创建一个文件,把文件的相关信息和属性写在磁盘上 ,可实际上这条命令不是你想得那么简单,它在底层一定要调用操作系统的系统调用,然后由操作系统向驱动程序发起创建文件的相关指令,驱动程序就拿到这些指令交给硬件去执行,再把这些信息写到磁盘上。当写入操作完成后,磁盘再传递信息传递会驱动程序,驱动程序反馈给操作系统,操作系统再通过系统调用接口将结果反馈给用户。就这简简单单的一条命令就要贯穿了整个软硬件体系结构
  • 无论一个语言支持什么特性,无论是什么特性,它的底层必定封装了系统调用。例如我们使调用C语言中的printf把数据刷新到外设,因为显示器是输出设备,其实并不是我们做的,我们只是通过C语言的一个接口(库函数),C语言的printf内部又一定包含了操作系统的接口,然后将我们的数据经过操作系统,贯穿体系结构,把数据写到了硬件上,后边类同。。

💬 库和系统调用有什么关系?

  • 多数库函数就是对系统调用接口的封装,但不一定所有库函数都会封装系统调用接口。所以库函数和系统调用之间的关系是【上下层关系】,库可能调用系统调用,但不是所有的库都会调用系统调用

💬 我们为什么要使用库函数?

  • 别人的库设计好,调用系统调用,经过系统调用的组合来给我们提供功能更丰富的库函数,通过调用库函数可以大大地提高我们的开发效率,除了库函数之外还有像框架等等,就是为了让我们更快地做出东西,不需要去了解一些底层的原理

三、总结与提炼

最后来总结一下本文所学习的内容:book:

  • 首先我们了解到了冯诺依曼体系结构的组成,知道了它由运算器、控制器、存储器、输入设备和输出设备五大组件。对于前二者,我们一般统称为CPU,即中央处理器,它会处理用户从计算机外部输入到内部的数据和信息,但是二者的速度不匹配,CPU不会和外设直接打交道,此时就需要使用到内存作为中介,将外设中的数据暂时存放在内存中,当CPU空闲下来的时候就会伸手向内存所要数据来进行出来,并将处理完的结果通过输出设备反馈给外界
  • 理解了冯诺依曼系统结构,我们就谈到若是网络中的两台主机都遵循这个结构的话,那这个数据是如何进行流动的,很明显还是我们谈到的这个结构流程,读者只需要记住CPU只会向内存中去拿取数据即可

  • 在讲完硬件之后我们再来谈谈软件,谈到了【操作系统】这个概念,知道了它也是一款软件,不过却可以管理硬件和软件,那首先去我们看了操作系统如何对硬件做管理,通过了解"决策" 与 "执行""管理者" 与 "被管理者"这个两个概念后,我们就清楚了管理的本质是【先描述,再组织】,通过学习编程语言,将一些重复的信息描述成具体的结构,在学习数据结构与算法后,再对这些描述后的信息进行组织并管理,就相当于我们前面所学的对链表进行增、删、查、改这些操作
  • 清楚了操作系统如何对硬进行管理后,我们进一步了解到在它们中间原来还有驱动程序的介入,就像校长为了管理好学生只能作出决策,但是还需要一个帮助执行决策的人,才可以更好地管理下面的东西
  • 有了这个思想后,我们就可以设计出一个基本的银行管理系统,就是基于操作系统、驱动程序和硬件三者,但是因为操作系统并不相信任何人,不过它又要给用户提供良好的服务,因此它会对外提供一些系统调用接口,使程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务,操作系统再向下对驱动程序发生指令,调用硬件,最后经过层层的返回,把最终的结果再由操作系统反馈给用户,这也就贯穿了整个软硬件体系结构

以上就是有关冯诺依曼体系结构与操作系统概念理解,本文概念居多,重在理解,当你深刻理解了这些后,再去学习操作系统的一些相关知识就可以做到融汇贯通:rose::rose::rose:

相关推荐
二十雨辰1 小时前
[linux]docker基础
linux·运维·docker
饮浊酒2 小时前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu2 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
矛取矛求2 小时前
Linux系统性能调优技巧
linux
One_Blanks2 小时前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell2 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼2 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler3 小时前
Linux系统-ubuntu系统安装
linux·运维·云计算
荒Huang3 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
hjjdebug5 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal