如下图:
那么为什么计算机当今都还要采用这种设计模式呢?
我们为什么不能让用户通过外设输入后通过cpu处理直接输出显示呢?
下面我们先来了解一些硬件的基本知识:
CPU:运算器&&控制器
输入设备:网卡,键盘,鼠标,磁盘,话筒等。
输出设备:网卡,显卡,声卡,显示器等。(有些设备即可输入又可输出)
这些设备是如何连接的呢:通过总线–主板,但这种连接方式并不是目的,它们只是在物理上连接起来,我们需要做的是数据的流通
,而数据流通的本质就是数据在不同设备之间的来回拷贝,拷贝的速度就决定了计算机运行的效率。
回到刚开始的问题:我们为什么不能让用户通过外设输入后通过cpu处理直接输出显示呢?
我们知道木桶效应
:假设一个木桶是由不同长度的木板围起来的,那它装水的多少并不取决于最长的那个木板,而是取决于最短的那一条木板。
将这个效应运用到计算机上,我们都知道外设输入到计算机中的过程效率是非常低下的,和cpu处理这些输入的数据的效率根本不在一个档次,那如果没有内存的设计,那么计算机运行的效率取决于最低的即外设的效率,就会非常低下,那么我们为什么还要设计更先进的cpu呢。
所以我们引进了一个叫内存的东西,它的运行速度在外设和cpu之间,它负责两方面,一是预处理,二是缓存。
当cpu在处理数据的时候,内存预先把数据从外设提取出来,然后等cpu处理完后就不用再漫长等待数据的到来,直接从内存中拷贝到cpu中即可,输出数据也是,输出外设的速度太慢会导致cpu无法处理别的事情一直处于“闲置”状态,这时候就需要先把输出数据拷贝到内存中,这两方面都提高了计算机的运行速度。
所以内存就使得计算机的运行效率变为以内存效率为主,转化为了软件的问题(指的就是两方面)。
下面是一个场景,你通过qq发送了一个文件给你的同学(B),那么计算机中是如何运行的呢?
qq是一个程序存储在你的磁盘中,先从磁盘中将qq这个程序读取到内存,然后又把文件从磁盘读取到内存,然后通过网卡,同时B也通过网卡接收到这个文件,点击下载后,拷贝到内存再拷贝到B的磁盘中。
在数据层面:cpu只和内存打交道,外设只和内存打交道。
对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上
上图是操作系统软硬件的架构,什么是操作系统呢?它的定位是用来进行管理一个软件
。当我们电脑在开机的那几十秒,就是在加载我们的操作系统。
那什么又是管理呢?
先来简单谈一下:有管理必然分为管理者
和被管理者
管理者:执行决策
被管理者:执行
我们用一个生活中的典型例子来说明:
在大学里面校长就属于管理者,学生当然就是被管理者,那有人就问:辅导员不是才是管理学生的吗?答:辅导员也是在校长的管理下来保证校长他管理决策的执行的。
而辅导员就相当于驱动程序,底层的这些每一个硬件都需要提供相应的驱动程序来对硬件进行相应的数据访问以及其他的操作
,比如:当你新买一个鼠标刚接入你的电脑时,有些厂商会给你提供一个链接来安装相应的驱动程序,安装后才能使用你的鼠标。
这样一个场景:校长的决策是今天放假,辅导员就告诉学生今天放假的决策,学生当然执行这一决策。校长充当的就是操作系统,辅导员充当的相当于驱动程序这个角色,学生就是底层的一些硬件。
所以我们也可以看出管理者和被管理者是不需要见面的(就好比你大学一般只是在开学典礼的时候能看到校长吧,其他时间见得到他吗🤙),所以管理的本质是数据的流通而不是对学生(人)进行管理,是管理校长通过辅导员来统计学生的信息来做一些管理。
那当数据非常庞大的时候管理者怎么管理的呢?
六个字:先描述,再组织。
什么意思呢?继续下面这个场景:
开学了,校长需要统计每一个同学的信息,包括什么姓名,班级,学号,身高…很多很多,那怎么进行管理这些数据呢?可以发现它们虽然内容不同,但是属性是相同的,于是校长就创建了一个结构体:
struct students { char name[]; char class[]; int height; ...... struct students*next;// }
然后通过辅导员(驱动结构)来收集统计所有同学的信息,最后再通过创建一个结构体
struct contact { int num; struct students[5000];//5000个学生 }
最后把这些数据通过链表这个数据结构来管理,这个场景就是对管理的一个计算机的建模的过程。
相信通过这些生活中的例子我们就知道了底层硬件属于被管理者,操作系统属于管理者,而驱动程序就是相应的接口,操作系统调用驱动收集硬件信息后再通过驱动来执行它的决策,并不需要操作系统和硬件面对面了。
希望这些例子能帮大家更好理解,如有错误,欢迎指正,谢谢大家!