冯诺依曼体系结构与操作系统的理解

✅<1>主页:我的代码爱吃辣
📃<2>知识讲解:操作系统
💬<3>前言:今天来介绍一下冯诺依曼体系结构,和操作系统的理解。

目录

1.冯诺依曼体系结构

冯诺依曼体系的工作原理:

为什么会有内存

生活中的冯诺依曼体系

 2.操作系统(Operator System)

概念

设计OS的目的

操作系统是如何做管理的

系统调用


1.冯诺依曼体系结构

冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器输入设备输出设备),这套理论被称为冯·诺依曼体系结构。

  • 运算器:用于实现算术运算,(如加减乘除)逻辑运算等。
  • 控制器:存储当前的指令,存储下一条指令的地址,分析指令。。(现代的诺伊曼机将运算器控制器集成到了一起,统称为"中央处理器(cpu)")。
  • 存储器:又叫做(内存),用于暂时存放CPU中的运算数据,以及与硬盘外部存储器交换的数据
  • 输出设备:用于接收计算机数据的输出显示、打印、声音、控制外围设备操作等,例如我们的显示器,声卡,网卡,磁盘。
  • 输入设备:向计算机输入数据和信息的设备(我们将输入设备和输出设备统称为外围设备,简称外设),例如键盘,鼠标,麦克风,磁盘。

冯诺依曼体系的工作原理:

早期的冯诺依曼机:由输入设备输入数据,经过运算器转移给存储器,当数据需要计算时,在存储器中区取数据,经过运算器和控制器处理的数据,也要通过运算器的传送给存储器,由存储器传送给输出设备,进行输出。

早期的冯诺依曼机,最显著的特点就是:以运算器为中心进行工作。

现代冯诺依曼机器:

 早期的冯诺依曼机,输入输出设备要想与存储器交换数据,都必须经过运算器,这显然就是比较繁琐的了。现在的冯诺依曼机,当输入设备输入后,直接可以加载到存储器中,由cpu去存储器中取数据和程序。将处理好的数据和程序再交给存储器,由存储器输送给输出设备。

现在冯诺依曼机的特点就是:以存储器为中心。

为什么会有内存

我们知道,冯诺依曼机,工作的本质时,将数据通过输入设备进行传输,然后通过cpu进行处理,将处理的数据,通过输出设备输出给用户。

那么既然计算机只要拿到数据处理,再将数据输出就可以了,那么内存的意义又是什么呢?像冯诺依曼机器的那样先将数据和程序加载到内存,cpu在向内存中拿数据和程序,这样不多了一道程序,效率不会变慢吗?难道不可以将输入设备的数据直接给cpu处理,这样不是更直接没更好吗?

可不可以设计成这样呢?

这里我们需要普及一个概念:cpu的处理数据的速度是非常快的,而外设的速度一般是比较慢的。如果像上述一样设计就会出现木桶效应。

 木桶效应:木桶盛水的多少不是取决于最长的那块木板,而是取决于那块最短的木板长度。

 换做在计算机中,如果舍弃内存,将输入输出设备直接与cpu连接,就会引发虽然cpu的速度很快,但是还是整体速度还是会被外设给拉慢下来。

所以冯诺依曼就想着引入内存,将cpu即将处理的数据,提前加载到内存中,这样我们的cpu就不需要每次都向我们的输入设备在要数据和程序了,而且内存和cpu的整体交互速率还是很快的,这样整体的计算机工作速度也就变快了。

一个程序实际上就是一个可执行文件,在windows里面就是一个.exe文件,像这样的文件在我们的电脑里都是存储在磁盘里面的,磁盘也就是我们的外部设备,而我们常说的,我们想将一个程序跑起来为什么说需要先将程序加载到内存,原因正是冯诺依曼体系结构决定的,冯诺依曼体系结构决定cpu从内存中拿数据。所以我们程序跑起来的第一步就是先将程序加载到内存,这就是由物理结构而决定了软件运行的行为。

从这里我们就可以总结出两个结论:

  1. 在数据层面,cpu一般不和外设直接沟通,而是直接和内存打交道。
  2. 在数据层面,外设只和内存打交道。

由此我们可以看到,内存对于整个冯诺依曼体系结构的重要性。

我们观察内存的功能,也就可以发现,内存就是一个数据的中转站,既然这样我们内存中转的速度不是越快越好吗?当然是越快越好。我们知道在cpu上还集成了寄存器,寄存器的速度是非常快的,那我们可不可以用寄存器来作为内存的存储单元呢。答案是:不可以。

因为:寄存器的造价非常的昂贵,在整个计算机中,现在的x86_64计算机中一共也就才有16个64bit通用寄存器。算起来才只有0.125kb大小。如果内存采用这样的配置来制造,恐怕全球也就没几个人能使用得起计算机了吧。

生活中的冯诺依曼体系

我们所使用的个人pc,移动端手机,或者是服务器设备,都是一台冯诺依曼机器。

现在我们了解了冯诺依曼体系结构的基本结构,我们通过一个小例子来演示一下,数据是如何在两个冯诺依曼机器上流动的。

假如:你用你的手机给你的女朋友发了一条QQ信息,你的女朋友手机上就能收到你发得信息,这实际上就是两台冯诺依曼机在交互。首先你打开QQ就是将磁盘中QQ的可执行程序加载到内存中,通过键盘等输入设备将数据加载到内存,经过cpu得处理返回给内存,在通过网卡等输出设备,传递给你女朋友的手机,你女朋友同样将QQ打开,将磁盘中QQ的可执行程序加载到内存中,并且将网卡里面你发送的数据加载到内存,通过cpu的处理,传送到内存中,最终内存将他传输给显示器,显示到显示器上。

 2.操作系统(Operator System)

我们在介绍冯诺依曼体系结构里面,花了很多的功夫介绍了内存的重要性,其中一条就是说内存可以将cpu将访问的数据预加载到内存中,那么问题来了,将外设的数据预加载到内存里面是有谁来做的?内存?外设?还是cpu呢?答案都不是,将数据预加载内存,这已经不是由硬件能做的事情了,此时就需要一款软件来完成这件事,这款软件就是操作系统。

概念

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

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

设计OS的目的

如果仅仅给我们一台冯诺依曼裸机,仅仅将冯诺依曼组件组装好的情况下,就给我们使用,这显然我们是不会使用的。冯诺依曼体系结构,就相当于是计算机的物理组件,那操作系统就是计算机的灵魂。在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件。我们之前也提过这样的一个概念:操作系统是一个款做软硬件资源管理的软件,为了是给用户提供(安全 高效 功能丰富)的体验。

其中有一个非常重要的词就是"管理"。如何理解操作系统对软硬件做管理?

举一个例子:医院是用来给病人治病的,避免不了有很多的非常先进的医疗器具,但是仅仅有这些医疗器具就可以给病人治病了吗?显然是不可以的,想要给病人治病还得需要医生来对医疗机器进行使用和操作才可以,这其中有很多的问题是考光靠机器解决不了的,比如科室的划分,医生的人员调配,等等。而现在的医院能解决这些问题,是因为他们有自己的一套管理机制。

这个时候也就说明了管理的重要性。

操作系统是如何做管理的

既然谈到管理必然由管理者和被管理者,我们以学校为例:

假如某一天我们学校的校长做了一个决定,要求每一个学生必需写一份学期总结,这个决定下发给校长手下的每一个辅导员,再有辅导员来收取自己班级的每一个班级的学期总结。这里的校长就是决策者,而辅导员是传达校长决策的人,最终决策的执行者是我们学生。

那么如果校长想管理我们的每一个学生,需要跟在每一个学生的后面,去管理吗?显然不是的。校长想管理我们只需要,拿到我们每一个学生的数据就可以了,如果这个校长编程,就可以用一个结构体来描述一个学生,然后将每一个学生的结构体用顺序表存起来,我们想将每一个学生的成绩从小到大排序,就可以直接将顺序表排序,如果我们想将成绩最差的开除了,可以直接将顺序表里面,成绩最小的那个人,从顺序表里面删除。这样校长对学生的管理就变成了对数据结构的管理了。而管理的本质就是对被管理者的数据做管理。对学生用结构体进行描述,实际上就是一个建模的过程,所以为了更好的管理,需要的前提就是,先对对象描述,再做组织。

对对象的描述,就是我们学习编程语言的目的,使用面向对象的思想将对象进行描述,在使用合适的数据结构对数据进行组织。

那么校长,辅导员和学生在我们计算机中,有匹配什么样的角色呢?

所以操作系统对下通过对软硬件资源的管理,对上为用户提供安全,稳定高效的功能丰富的执行环境,让用户有一个更好的使用体验。

系统调用

上面我们说了,操作系统通过对软硬件的资源管理,给上层用户提供良好的环境体验。那么有一个问题就是,操作系统对我们用户充分信任吗?答案是不信任。

举个例子:

银行为了让更多的人去存钱,而提供各种优质的服务,但是银行对我们确实不信任的,当我们想存钱的时候,银行不会让我们直接进入金库将钱放进去,因为银行不信任我们。但是银行又必须为我们提供这样的服务,怎么办呢?很简单就是银行不直接为我们见到金库存钱,而是提供了可以存钱的窗口服务。那么取钱,贷款,办理理财也是如此,银行会提供,相应的窗口服务,既能提供服务,又能保证安全。

换做是操作系统,操作系统也是不信任我们,那么操作系统又想给用户提供好的服务,但是又相信任何人,如果操作系统为你提供服务但是,又不想让你接触操作系统的核心。操作系统也会加上一层封装,并且为你提供窗口试的服务,对于操作系统而言这个窗口式的服务,就是"系统调用"。你想调用什么操作功能就可以直接调用,操作系统提供给你的系统调用接口。

但是,系统调用的使用成本非常高,所以在此之上又开发出来了一些适合普通普通用户使用的开发层应用,比如:shell程序,图形化界面,函数库等。

 虽然我们是第一次说这个系统调用,但是其实我们已经使用过非常多了,就比如我们梦开始的地方:

printf("hello world");

 为什么一个printf函数就可以使得字符串打印到我们的显示器上,实际上在printf'的底层实现也是调用了显示器相关的系统调用。

 

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的代码爱吃辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值