linux之冯诺依曼体系和操作系统的概念与定位

冯诺依曼体系结构

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

linux之冯诺依曼体系和操作系统的概念与定位_第1张图片

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成
输入单元:包括键盘,鼠标,扫描仪,写板,话筒,摄像头,网卡,磁盘/ssd等
中央处理器(CPU):含有运算器和控制器等
输出单元:显示器,打印机等 

存储器: 存储器其实就是内存!

输入设备的作用是什么呢?
计算机本质其实就是来计算和处理数据的,那既然是计算和处理数据的,那我们首先要把数据给计算机, 输入设备就是用来给计算机输入数据的。

那计算机拿到数据,进行处理和计算之后,要把结果反馈给用户啊。
所以除了输入设备,还需要有输出设备
有些设备它既是输入设备也是输出设备,比如网卡

那计算机本质是要计算和处理数据,所以肯定要有CPU(中央处理器,含有运算器和控制器),CPU是计算机的大脑,负责解释并执行计算机程序中的指令,从而对数据进行各种操作和处理。

linux之冯诺依曼体系和操作系统的概念与定位_第2张图片

为什么要存储器(内存)?作用是什么? 

按我们上面的分析,输入设备把数据喂给计算机,然后CPU进行计算处理,最后输出设备把结果展示给用户。那还有一个内存,它的作用是啥啊?

输入输出设备也叫做外设,即外围设备,而外设一般是比较慢的。
比如说磁盘,磁盘相对于内存是比较慢的。所以如果没有内存的话,CPU只能和外设直接交互,外设的速度是很慢的,而CPU运行速度非常快。那像这样CPU直接和外设交互,会造成木桶效应.

linux之冯诺依曼体系和操作系统的概念与定位_第3张图片

木桶效应就是说一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板
那这里也是同样的道理,CPU速度很快,而外设非常慢,那这时整体的速度就会受影响,整机的运行速度就会降低。

那为了解决这个问题,就引入了内存:

内存的速度比外设是快很多的,当然它没有CPU快。
而内存它是可以临时存储数据的,比如当时CPU在处理A任务,与此同时就可以把后面的B任务放到内存,然后A任务处理完就可以直接处理B了。在输出数据的时候同时也可以输入数据.
所以有了内存的存在,我们可以对数据进行预加载,那CPU后续进行数据处理的时候,就不需要再访问外设了,可以直接从内存拿数据。
所以计算机整体的效率就不再以外设为主,而是以内存为主了。内存的访问速度变快使得CPU可以高效地进行数据处理,所以可以认为,内存的引入就是为了解决CPU和外设速度不匹配的问题。

那从这里我们也能得出第一个结论:

在数据层面,CPU一般是不直接和外设进行沟通的,而只和内存打交道,从内存获取数据,然后处理结果再写回内存。

那与此同时,我们还能理解这样一个问题:

我们平时写的C/C++的代码,它在编译链接之后生成一个可执行程序,其实就还是一个文件,那文件是存在磁盘上的,磁盘呢就是一种外设。
那大家在之前学习C/C++的过程中,可能会听过这样的话,就是一个程序想要运行起来,必须先加载到内存,然后才能被运行。
那为什么呢?
原因在于CPU要去执行我们可执行程序里的二进制的机器指令,只会从内存去获取,因为体系结构就是这样的。所以我们的程序必须先加载到内存,才能被运行

 内存和磁盘的关系与区别

内存和磁盘是计算机中主要的存储部件

内存是利用了电效应实现了存储,一旦电脑断电它存储的数据就会丢失!
然而磁盘是外设,是永久存储介质!

为什么冯诺依曼系统如此流行?

其实计算机体系不止有冯诺依曼系统还有哈佛架构和向量处理器系统,还有流水线结构等等
为什么冯诺依曼系统被广泛使用呢?

只在存储能力的方面来做解析

关于内存分级:

linux之冯诺依曼体系和操作系统的概念与定位_第4张图片

结论: 离CPU越近的设备,运行速度越快,造价也越贵! 

基于上面对木桶效应的分析, 冯诺依曼体系将中央处理器进行复杂的数据处理和运算,而离CPU远一点的设备用于存储数据或者接受数据后传给内存做分析 

这就得出了这样的结论:

冯诺依曼系统既有高价格的设备,用于处理复杂的数据,又有低价格的设备用于存储数据或进行数据交互,这使得冯诺依曼体系的计算机可以在价格不昂贵的前提下,实现比较高的效率.

正是这种能让大多数人承受的起的价格,和使用起来比较高效的模式,才让冯诺依曼系统到现在也如此流行!

数据流向分析

在硬件层面,单机和跨主机之间的数据流是如何流向的? 

软件是脱离不了硬件的,我们只要把硬件层面搞清楚,那软件的很多行为就也可以尝试解释了

QQ发送消息与接收消息

那首先你发消息的时候就是通过输入设备(键盘)把信息输入到内存, 然后CPU对内存的数据进行计算处理,处理的结果写回内存,然后通过输出设备显示,所以你自己也能看到你发的消息。
那输出设备除了把你发的消息展示到你电脑的显示器上之外,还通过另外一个输出设备——网卡发送到网络上(网络上如何传输我们先不管),然后另一台电脑就通过网卡(这里又作为输入设备)接收到这些消息, 把这些信息数据加载到内存里, 然后CPU获取并进行相应的处理,再写回内存,由输出设备获取并通过输出设备(显示器)展示,对方也就看到了你发的消息。

我们能体会到,由于底层硬件的结构,数据在流动时必须遵守冯诺依曼体系结构进行流向。 


操作系统的概念和定位 

操作系统是一种软件,软件想要运行的话就要先加载到内存里,那其实我们计算机开机的时候就是在加载操作系统。
那操作系统是一款什么样的软件呢?
操作系统是一款进行软硬件管理的软件!

概念:

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS).笼统的理解,操作系统包括:

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

设计OS的目的:

与硬件交互,管理所有的软硬件资源,为用户程序(应用程序)提供一个稳定,高效,安全的执行环境

定位:

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

那既然操作系统是搞管理的,那第一个问题,我们该如何理解这里的”管理“

我们先来讨论一下操作系统对硬件的管理

那要谈管理呢,就一定要谈这两种角色,即管理者和被管理者

比如在学校里,学生就是被管理者。把学校的场景简化一下,假设只有下面这三种角色:校长、辅导员和学生,这三种角色中谁是真正的管理者?
首先我们做的事情无非就两种——决策和执行决策。
比如我们作为一个学生我今天醒来决定要不要去上课,下课后我决定要不要打把游戏放松一下,如果决定了就去执行。那学生的话其实对自己的生活即是决策者又是执行者。

对于真正的管理者来说,它主要做的是决策。所以校长是学校的真正的管理者。


比如校长告诉辅导员,让他下周一举办一个编程大赛,然后辅导员去落实,去准备,最后我们学生去执行。
所以可以认为这三个角色是这样的关系:
校长——决策者
辅导员——做执行
学生——被动的接受管理指令

对于一个大学生来说,平时在学校和校长的接触多吗?
并不多

那这里就有一个问题,校长作为管理者,都没怎么见过学生,那他如何去很好地管理学生呢?管理者和被管理者一定需要经常接触,经常沟通吗?
不需要,管理者和被管理者,不一定非要进行之间沟通的!

就像公司的员工,可能连老板的面都没见过,但是老板依然可以把他管理的很好。

其实只要管理者能拿到被管理者的数据就可以对其进行管理。
在公司,员工跟老板见都没见过,但老板能知道员工每天的工作情况,从而进行一系列评定, 那既然管理者和被管理者没有之间接触,那他是如何拿到你的数据呢?
虽然老板和员工没有直接接触,但是员工的上一级,比如部门的领导,他和员工有直接的接触,他知道员工每天的情况,那他就可以把这些数据汇报给老板,那老板就知道了。
校长可以拿到学生的数据是因为辅导员可以给它汇报。

下一个问题,对于管理者来说,被管理者的数据量可能非常庞大(比如一个学校有2万名学生,但是只有一个校长),那管理者如何做到对这些数据进行合理的分析呢?

虽然数据量非常大,但是这些数据的类型是一致的。

 比如校长要获取所有学生的信息都是它的姓名,年龄,体重,成绩。
那校长就可以这样:
定义一个结构体,然后把这些字段都定义为成员变量。然后告诉辅导员按照这些字段把所有学生的这些信息汇总上来。然后就可以给这个结构体再加一个指针,用一个链表把这些学生的数据全部管理起来,然后校长做这样一个决策,让所有学生里面成绩最高的那个代表学校去参加竞赛,那就可以遍历这个链表找出成绩的最大值,然后获取这个成绩对应的学生姓名,然后把辅导员叫过来,告诉他让他找这个学生去参加比赛。

struct student
{
    //..各种属性
	char* name;
	int age;
	int height;
	int grade;
    
	struct student*;
}

那此时这个决策就转换成了对这个链表的遍历操作。
那后续其它的一些管理工作比如要开除一个学生,新转来一个学生,两个学生要换宿舍,其实就都转换成了对这个链表的增删查改。

结论: 校长管理学生管理的并不是真正的人,而是在管理学生对应的数据 

那上述我们就完成了对管理工作的一个建模的过程,从中我们也能够得出:

计算机管理硬件,管理的本质:先描述、再组织
以我们上面举的例子来说
描述被管理对象——描述起来,用struct结构体
组织被管理对象——组织起来,用链表或其他高效的数据结构

那我们上面例子中提到的校长、辅导员、学生这个三个角色对应到计算机里面又是什么呢?

校长其实就对应计算机中的操作系统,学生就对应计算机中的软硬件,而辅导员则对应硬件驱动。

操作系统对硬件的管理

和校长管理学生一样,操作系统也不是直接管理硬件,而是管理硬件映射出来的信息.和校长创建的结构体类似,操作系统也会对各个硬件创建一个结构体,结构体中存放硬件的各种信息(先描述),再通过链表或者其他数据结构将这些结构体一一链接起来统一管理(再管理).

抽象出管理校长管理学生和操作系统管理硬件的步骤就是这六个字:先描述,再管理

操作系统的管理核心有:

进程管理
内存管理
文件/IO管理
驱动管理

要管理进程首先要描述进程的性质,管理内存首先要描述内存的性质,然而C/C++的结构体正好可实现这功能.

操作系统为什么要做管理

那操作系统为什么要对软硬件资源进行管理呢?

计算机本质是为用户服务的,所以操作系统对软硬件进行管理其实就是为了更好地为用户提供服务的,不能今天这个硬件出问题了,明天那个软件出问题了。

总结一下就是:

操作系统对下管理好软硬件资源(手段),对上给用户提供良好(安全、稳定、高效、功能丰富)的执行环境(目的)。

那操作系统进行软硬件管理是为了给用户提供更好的服务,那在日常生活中,也有类似的例子:

比如说银行,银行里面肯定也有自己的管理体系来给人们提供良好的服务,在银行系统中,可以认为行长就对应计算机中的操作系统OS,他可以管理员工,也可以管理银行里面的各种设备,就像OS可以管理软硬件一样。

银行是给人们提供服务的,但是银行相信我们吗?

比如你想去银行的仓库里面看看,别人取钱的时候你想进行看看,或者你想看看银行工作人员的电脑,人家会让你干吗?
不会的,银行虽然是给我们提供服务的,但是他不相信我们。

那对于操作系统也是这样的:

操作系统是给用户提供服务的,但是他不相信任何人,不允许用户访问它任何内部的细节,它要维护自身的安全。

系统调用和库函数概念

那它如何做到即为我们提供服务,又要防备我们,保护自身的安全呢?

那大家先想一下银行是怎么做的?

他是不是提供了一个个的窗口,每个窗口都有厚厚的玻璃,只留一个开口来让工作人员为我们提供服务。它这样既可以为我们提供服务,同时也保证自己的安全。 

所以,和银行的做法类似:

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口。

linux之冯诺依曼体系和操作系统的概念与定位_第5张图片

 系统调用在使用上,对用户的要求相对也比较高,

所以,站在系统上开发的人的角度:

1. 开发者可以对部分系统调用接口进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。所有的开发者有很多函数不用自己去写,而是直接调用系统库函数即可(C标准库),

2. 开发者基于系统调用接口写了shell外壳程序(bash,图形化界面..), 比如Linux上的一些命令我们可以直接使用,Windows的图形化界面操作, 它们的底层就是去调用对应的系统调用去完成对应的操作.

专业的人做专业的事情,降低开发成本!

站在用户角度:

一般一个用户想访问底层的OS数据或者访问硬件,必须是贯穿整个体系结构的,所以用户必定会调用系统调用,不过我们是通过外壳程序,库函数或者一些指令来调用系统调用接口进而访问底层数据罢了。

linux之冯诺依曼体系和操作系统的概念与定位_第6张图片

系统调用说白了就是操作系统给用户提供了一个又一个的函数用户通过调用函数来获取操作系统内的各种数据,然而函数是操作系统内部写的,所以你只能看到有限部分的数据. 

你可能感兴趣的:(Linux,linux,运维,服务器)