Ⅰ. 冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
截至目前,我们所认识的计算机,都是有一个个的硬件组件组成
- 输入单元:包括键盘, 鼠标,扫描仪, 写板等
- 中央处理器(CPU):含有运算器和控制器等
- 输出单元:显示器,打印机等
❓ 那为什么要有冯诺依曼体系结构呢?下面是我自己的理解:(注意接下来的讲解只关于上图中的红色箭头)
首先我们得先知道,这里的存储器指的是什么?这里的 存储器指的是内存!其特点是 掉电易失~
注意哦,虽然我们平时也把磁 盘叫做内存,但是其实 磁盘指的是外存,其特点是存储的东西是永久性的,要将其与内存区分开!并且我们磁盘是属于外部设备的,外部设备分为输入设备和输出设备,其中最典型的同时具备输入和输出功能就是磁盘和网卡,而其他的外部设备都只是只有输入或者输出!注意这里的外部设备,是相当于内存和cpu来说的!
接下来说一下,冯诺依曼体系中的 运算器和控制器,其实就是我们所说的 cpu!其实 cpu 还有其他的构成,只不过主要是这两大板块,这一点要注意!
这样子的话我们就能画出一小部分的思维导图:
接下来引入一个知识点,就是它们的计算速度:CPU > 内存 > 外设,而另一方面,我们需要明白的是 CPU 处理的时候是需要数据的!
这里先讲个知识点:CPU是怎么认识指令的呢?如中文、英文等指令?
💡 其实 CPU 是拥有自己的指令集的,指令集就是 CPU 中用来计算和控制计算机系统的一套指令的集合,分为 复杂指令集 和 精简指令集 两部分,而我们在写代码的时候,最后都要通过编译器去将源文件编译成 CPU 能够认识的二进制可执行程序,该程序中其实就包含着一堆 CPU 能够识别的指令!
我们来想一想,在没有冯诺依曼体系的情况下也就是不存在内存缓存的情况下,我们的 CPU 如果是从外部设备接受消息的,我们知道 CPU 和 外部设备的速度完全不是一个级别的,这样子的话会出现的问题就是效率太低太低了,我们要知道 CPU 的空间大小其实是不大的,而如果外部设备中传输的信息过多的话,那速度是无法接受的~
所以冯诺依曼体系中强调了内存也就是存储器的重要性,其**目的就是为了提高效率,存储器会存储外部设备要预加载的信息**(比如说开机的时候将操作系统的信息加载到内存中、程序要运行时候加载到内存等),然后 CPU 再通过存储器来接收消息,这看起来本质就是多了个中介,但是我们要明白内存的速度可远远比外部设备的速度要快,起码是上千倍的~
相信大家都听过短板效应,一个东西的效率等属性,主要取决于一个东西的最短板处,那么一旦我们用了 CPU 和 内存 打交道的方式,这样子是可以大大提高效率的!
而对于将外部设备的信息加载到内存中,以及内存中加载到 CPU 中的这些操作等,都是 操作系统 做的!
另外,外部设备和内存之间的信息交换过程,也称为 IO的过程,也就是 INPUT/OUTPUT
👹 关于冯诺依曼,必须强调几点:
- 这里的存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有外部设备都只能直接和内存打交道,而不能与cpu直接打交道。
❓ 对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上 qq **开始和某位朋友聊天开始,数据的流动过程。**从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?
💡 如果是发消息的话,那么其实我是通过键盘输入,然后加载到内存(更准确的说法是加载到qq程序里)中进行一些运算,然后会显示到我们的显示器上面,并从我的网卡传输信息到我的朋友那边,朋友通过网卡接收信息后加载至内存进行一些运算,然后通过其显示器显示,达到效果!
💡 如果是发文件的话,中间过程都是一样的,只不过我的输入设备变成了磁盘而已,因为文件存在磁盘中!
Ⅱ. 操作系统(Operator System)
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
🦏 操作系统的本质其实就是一个管理软硬件资源的一个软件!
下面我们通过问题的引入,来一层一层的解析计算机的软硬件体系结构!
💡 为什么要管理呢?因为要对下通过合理的管理软硬件资源(手段),对上为用户提供良好的(稳定、高效、安全)执行环境(目的)!
下面画一个简单的图概述一下操作系统与硬件和用户之间的关系:
💡 怎么管理的呢? 其实管理的本质就是对数据做管理!比如说在学校的时候,你可能基本没见过校长,但是校长就是有办法管理到你,其实就是因为校长有了你的数据,并且是在不断的更新,这样子的话校长不用见到你,也可以对你进行管理,做出决策!
💡 那么操作系统怎么获得硬件的数据? 其实就是通过驱动!我们可以举个例子,比如在学校中,校长为了得到数据,会去收集学生的数据,但是如果学生太多的话那可不行,所以就有了辅导员,校长就是管理者,通过执行者也就是辅导员去拿到被管理者也就是学生的数据,而这里的校长就相当于是操作系统,而辅导员相当于驱动,而学生就相当于硬件!所以最后就是一句话,操作系统通过驱动去获取硬件的数据!(具体如何获取不是我们要关心的重点)
🐲 我们这里先引入一个简单但是很重要的知识点:管理的方法是先描述 (语言),再组织 (数据结构)
我们要明白一个问题,就是如果学生太多的时候,校长要管理的数据量就越大,那么如果没有很好的管理的方法是不行的!所以校长此时想出了一个办法,对每个学生的数据,比如学号、姓名、班级等数据,用结构体或者类来描述起来,然后通过数据结构如链表、二叉树、堆等结构进行组织。这样子校长每次查找学生的信息或者删除学生的信息的时候,只需要根据对应数据结构的方法来操作即可!体现了管理的方法!
💡 上面我们说到操作系统管理硬件,那么操作系统是否也可以管理软件呢??答案是可以的!
举个例子,在银行的分层中,最底层的硬件其实可以看做是金库、桌椅板凳、电脑设备、纸张等,而驱动可以看作是安保、后勤、IT人员和其他人,而我们的操作系统可以看作部门经理、行长与一些具有业务能力的人等。那么这个时候,我们看到行长他其实不只是要管理底层也就是金库这些的数据,他也得管理同层的部门经理等人,与此一致,操作系统也是如此,是可以管理软件的!
💡 为什么操作系统上面需要一层系统接口调用呢?
我们还是举个例子,在银行中,为什么不让我们直接进入它的仓库,用他们的电脑…
很明显,因为银行系统不相信任何人,并且银行系统是非常容易收到伤害的,所以银行需要将自己保护起来,但是银行存在的意义是为人民服务,提供存取等服务,满足用户需求。既然这样子的话银行将自己保护起来,又得对外提供服务,银行就建设了服务窗口!客户不允许加入到窗口里面,只能通过小窗口与内部人员进行服务请求!
一样的道理,操作系统也不相信任何人,因为一个操作系统如果轻易就被修改,那么其就不稳定和安全了!但是操作系统又得向上为用户提供各种服务,这个时候为了保护自己,计算机就在操作系统的上一层提供了系统调用接口,目的其实是为了保护操作系统的同时让操作系统向上为用户提供服务!(并且操作系统的接口一般都是用C语言写的,所以与C语言调用函数接口是类似的!)
我们去银行办服务的时候通过小窗口给内部人员请求服务的,再由内部人员去完成服务,其实也就相当于是用户输入指令,然后通过系统去调用接口,再交给操作系统去完成操作!所以**用户是不能直接和操作系统打交道的,都是得通过系统调用接口**!
💡 那要是一些文化不足等人群也来申请服务,他们不懂如何申请,那该怎么办呢?计算机软硬件管理体系中又给出一层,叫做用户操作接口层!
举个例子,当一个老人来到银行办服务比如存钱的时候,他们可能因为知识不够不懂如何去操作存储机器,那么这个时候大厅经理就能帮助他们了,只要老人将其需要的服务通过简洁的方式表达给大厅经理,经理就能将其服务转告给内部人员,让其帮忙完成服务!
这个过程其实就相当于当有人在调用接口的时候,由于接口很多并且使用很复杂,这个时候就需要用户操作接口,比如常见的shell外壳、lib库以及一些界面,这样子调用的人通过这些操作接口就能间接的调用系统调用接口完成操作系统的操作,而当用户的请求是错误的时候,其实用户操作接口就会做拦截,就不会去调用到下面的系统调用接口!
一句话,用户操作接口层的作用就是使调用的人使用的更加方便!
上面这张图片也就是完整的计算机软硬件体系结构!
系统调用和库函数概念
- 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
- 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。