冯诺依曼体系结构以及回答操作系统(是什么,为什么,怎么办)问题

一、硬件

冯诺依曼体系结构

我们常见的计算机,如笔记本。或者我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
什么是冯诺依曼体系结构?如下图:
在这里插入图片描述
输入设备:鼠标,键盘,摄像头,话筒,磁盘,网卡等等。
输出设备:显示器,磁盘,播放器,网卡,磁盘等等。
输入设备和输出设备统称为外设(外部设备)。
有的的设备是纯的输入或者输出设备,有的设备可以既是输入设备,又是输出设备。
运算器:对我们的数据进行计算任务(算数计算,逻辑计算)。
控制器:对我们的硬件的计算流程进行一定的控制。例如:输入设备的数据好了没,什么时候从内存里拿数据进行计算。
运算器和控制器合成CPU。

由上述可知,计算机的各个硬件都是独立的个体,而计算机在工作的时候各个硬件之间一定要进行数据交互,所以各个单元必须用“线”连接起来,即在物理上是连通的,才能使各个硬件之间的数据进行交互,这个“线”分为系统总线和IO总线,连接CPU与存储器(内存)的线是系统总线,连接存储器(内存)与输入输出设备的线是IO总线。

冯诺依曼体系结构规定,输入设备的数据只能输入给内存,然后内存把数据交给CPU执行计算功能,计算后得到的结果再交给内存,内存再输出给输出设备。不能CPU直接从输入设备拿数据进行计算,然后把结果写到输出设备上。这是冯诺依曼体系结构的规定。为什么呢?原因是CPU的速度太快了,而输入和输出设备属于外设,速度特别慢,如果CPU直接从输入输出设备拿数据和输出数据,就会出现CPU总是在等待输入设备的数据就绪,而计算好结果的数据也要总是等输出设备来拿,两者的速度差距太大就注定是串行工作的,这样的话,整机的速度就取决于输入和输出设备的速度,即会变得很慢,不利于整机效率的提高。而在CPU和外设之间加入存储器(内存),内存的速度比输入输出设备的速度要快很多,但是要比CPU的速度慢,并且内存的空间是比CPU大很多的,所以内存可以事先缓存着准备要执行的代码和数据,即在CPU进行着其它计算的时候,内存也同时在加载着数据,即可以并行工作,等到CPU再去内存中拿数据进行计算的时候,需要计算的代码和数据已经完全加载到了内存中了,这时CPU就能快速地从内存中拿到数据进行计算,由此可以大大地提高了整机效率。
所以存储器(内存)在冯诺依曼体系结构中是居于核心地位的,存储器是硬件级别的缓存空间,类似于C语言的缓冲区。

回答两个问题:
问题一:一个程序要运行,为什么一定要先加载到内存中呢?
程序是文件,文件是放在磁盘上的,程序中的代码和数据是要通过CPU运行和计算的,而CPU只会在内存中拿数据,所以程序要想运行就必须要先加载到内存的根本原因是冯诺依曼体系结构规定的!!!!所有的软件的设计都必须遵守底层的硬件结构!!
问题二:为什么我们在写printf打印函数的时候,不加\n,打印的数据会先缓存在缓冲区中,原因是CPU运行后的结果本来就是要写回内存的,即写回到缓冲区中,然后等到特定的场景下再刷新到显示器,而不是CPU直接和输出设备交互的,所以打印时缓存是正常现象。
值得注意的是,CPU与输入输出设备只是在交互数据上没有联系,但是在控制信号上是有一定的联系的。

在这里插入图片描述
关于冯诺依曼,必须强调几点:
第一、这里的存储器指的就是内存。
第二、不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
第三、外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。

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

二、软件

2.1 计算机的层状结构

在这里插入图片描述

2.2 操作系统的概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统地理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
由内核加上其它程序的统称的操作系统是广义上的操作系统,但是我们平时在谈操作系统的时候,其实是特指操作系统的内核,即狭义层面上的操作系统指的就是操作系统的内核。

2.3 操作系统是什么?

操作系统是一款进行软硬件管理的软件。

2.4 为什么要有操作系统?


1、操作系统帮助用户管理好下面的软硬件资源。
2、为了给用户提供一个良好(安全、稳定、高效)的运行环境。
总的来说就是:操作系统通过管理好底层的软硬件资源(手段),给用户提供良好的执行环境(目的)。

这里的用户指的是谁?
这里的用户指的不是普通的老百姓用户,因为我们平时在使用的app是程序员开发出来的软件,例如各种游戏,抖音;我们不是在使用直接使用操作系统,而是使用搭建在操作系统之上的软件,所以这里的用户其实是指程序员,是程序员在使用操作系统,在操作系统之上开发出各种各样的应用软件,才能提供给普通老百姓使用。

因为操作系统是软硬件资源的管理者,底层的硬件资源的信息是不能被随意修改的,所以用户是不能绕过操作系统直接访问底层的硬件的,但是我们知道,我们所有在上层的操作最终都会转换成对底层硬件的操作的,比如我们在写C语言printf函数的时候,把内容打印到了显示器上,我们给别人发信息的时候,信息是要放到网卡里发送的,这些都是操作都是要访问底层的硬件资源的,但是操作系统是不相信任何人的,所以操作系统为了保证自己数据的安全,同时也能给用户提供服务,它以接口的方式给用户提供调用的入口,让用户获取操作系统内部的数据。所谓的接口就是操作系统提供的,用C语言实现的对自己内部函数的调用,简称系统调用,所有访问操作系统内部数据的行为,都必须要通过系统调用来完成。

因为系统调用接口使用起来非常的麻烦,普通用户使用系统调用接口成本比较高,所以有很多程序员就基于系统调用接口之上写了C语言C++的各种库,所以我们平时在写C语言C++程序的时候,调用的库函数接口底层一定是封装了某种系统调用接口的,因为只能通过系统调用接口访问操作系统。

2.5 操作系统是怎么管理底层的软硬件资源的呢?


管理的本质是:通过对数据的管理,达到对底层软硬件资源的管理。

管理有时候是隔层的,就好比在大公司的老板和员工,老板并不是直接对员工进行管理,而是通过主管拿到员工的数据,进而对员工进行管理。操作系统也一样,并不是直接对底层的硬件资源进行管理,而是通过驱动程序拿到底层硬件资源的数据,进而达到管理的目的。这里的操作系统相当于决策者,驱动程序属于执行者。那么底层的硬件资源的数据那么多,并且底层有那么多的软硬件资源,操作系统需要怎么管理呢?

首先,硬件的属性是非常多的,并且是分散的,直接管理肯定是不行的,虽然底层的各个硬件的各种属性肯定是不同的,但是它们都是有这些属性的,而操作系统又是通过C语言写的,在C语言中要对一种多属性的对象进行描述的话,毫无疑问是需要用到结构体的,所以要把底层的硬件资源描述清楚的方法就是按照硬件的属性信息,声明对应的结构体,然后再定义一个一个的对象,把每一个硬件的属性信息填入到结构体中,这一个个的结构体对象就是描述底层硬件资源的数据,这个过程是描述的过程。

但是把这一个个的对象描述清楚就行吗?当然不是,我们想要更好地管理这些数据,肯定是要把这些数据以某种数据结构的形式组织起来的。所以这些关于软硬件资源的数据可以用双向链表的方式连接起来,如此一来,操作系统对底层软硬件资源的管理就转换成了对这个双向链表的增删查改了。例如,现在多了一个硬件,操作系统只需要再定义一个对象,填写相关的属性信息,然后把这个对象链接到这个双向链表中就可以了。如果某个硬件坏了,需要拆除,那就是在这个双向链表中找到对应的节点并删除它即可。这个过程是组织的过程。

所以简单来说,操作系统管理底层软硬件资源的核心思想可以用六个字来总结,那就是:“先描述,再组织”。

以上就是今天想要跟大家分享的全部内容了,你学会了吗?如果这篇文章对你有所帮助,那么点亮一下小心心,外加点点关注呗,后期还会持续更新有关Linux操作系统的相关内容哦,我们下期见啦!!!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_70056514/article/details/131713725