【Linux】冯诺依曼体系结构、操作系统
Linux
- 1.冯诺依曼体系结构
- 1.是什么?
- 2.为什么设计成这样?
- 3.数据的流动?
- 2.操作系统
- 1.是什么?
- 2.为什么设计操作系统?
- 3.核心功能
- 4.如何理解 "管理"
- 5.系统调用和库函数概念
1.冯诺依曼体系结构
1.是什么?
常见的计算机,如笔记本;不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构。
- 输入设备:键盘、鼠标、话筒、摄像头、网卡、磁盘等。
- 输出设备:显示器、打印机、网卡、磁盘等。
中央处理器(CPU)
:运算器 + 控制器。存储器
:内存。
- 所有的
输入设备
和输出设备
都叫做"外设"
。磁盘叫做外部存储设备,简称"外存"
。 - 读文件:将磁盘中的数据读取到内存中;写文件:将内存中的数据写入到磁盘中。将这种读写的动作称为 “Input/Output”,简称
"I/O"
。 - 站在内存的角度理解 I/O:输入设备将数据交给内存,叫做 Input;内存将数据交给输出设备,叫做 Output。
知识点:
- 已知软件运行,必须先加载到内存中(Input)。程序运行之前在哪里?答案:由于程序就是二进制的可执行文件,所以在
磁盘
中。 - 为什么程序运行之前要加载到内存中?答案:由于
冯诺依曼体系结构规定
,CPU 只能从内存中读取数据,无法直接从输入设备直接读取。总结:数据必须从输入设备加载到内存,再由内存加载到 CPU 中。 - 执行 printf 函数时:并不是直接将数据放入输入设备。而是先将数据放入缓冲区中,需要的时候将数据刷新到输出设备。之所以由缓冲区,这也是冯诺依曼体系结构规定的。
- 冯诺依曼体系结构数据流动的方向:输入设备先将数据移动到内存,内存再将数据移动到 CPU,CPU 将计算后的数据再移动到内存,最后内存将数据移动到输出设备。
数据流动的本质:数据从一个设备 "拷贝" 到另一个设备
。冯诺依曼体系结构的效率:由设备的 "拷贝" 效率决定
。 - 在数据层面上:CPU 只和内存打交道,而外设之和内存打交道。内存充当类似 “桥梁”。
- 在网络中接收和传输数据是
网卡
起的作用。网卡先获得网络中的数据,再将网卡中的数据加载到内存中,再将内存中的数据加载到 CPU 中,经过计算后,重新加载到内存中,数据又从内存加载到网卡,最后将网卡中的数据传输到网络中。 - 执行 scanf 函数时:由于软件已经加载到内存中了,所以内存可以获取数据。
关于冯诺依曼体系结构,必须强调4点:
- 这里的存储器指的是内存。
- 不考虑缓存情况,这里的 CPU 能且只能对内存进行读写,不能访问外设(输入/输出设备)
- 外设(输入/输出设备)要输入/输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有设备都只能直接和内存打交道。
2.为什么设计成这样?
以上是存储分级:
- CPU 由寄存器和三级高速缓存组成。
- 离 CPU 越近:存储容量越小,存储速率越快,但是价格更贵。
问题一:为什么中间需要一个存储器?可以去掉?
- 若去掉存储器时:由于输入/输出设备的运算速度相较于 CPU 非常的慢,这就导致整个体系结构的效率由 “外设” 决定非常低(木桶效应)。
- 那么可以将外设更改为 “寄存器” ?答案是:可以,但是计算机的价格会相当的贵。
- 为了解决 “外设” 和 “CPU” 之间的速度不匹配问题,存储器作为 “桥梁”,既可以节省成本,又可以提升效率。当代计算机是性价比的产物。
- 冯诺依曼体系结构的历史意义:普通人都可以买得起计算机,网民多了,才构成了当今的互联网。可以说是:构成互联网的必要条件。
问题二:为什么中间加了一个存储器整个体系结构效率就变高了呢?效率不是由最低的 “外设” 决定的?
- 存在操作系统,将操作系统加载到内存中,操作系统可以提前将外设加载到内存中,CPU 就可以直接从内存中读取数据。“局部性” 原理,可以发挥内存最大的效果。
- 体系结构的效率:由设备的 “拷贝” 效率决定。数据从外设拷贝到内存,在从内存拷贝到 CPU,这样效率有所提高。
3.数据的流动?
注意:对冯诺依曼的理解,不能只停留在概念上,要深入到对软件数据流理解上。请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。
问题一:用户之间的聊天?
- 数据流动过程:用户之间聊天的前提是先登入qq,也就是qq已经加载到内存了。从硬件方面:内存从键盘读取数据。从软件方面:通过键盘将数据交给qq,而qq就在内存中,所以输入数据就流动到了内存中。数据由 CPU 经过加密、封包后,重新写回到内存中,数据又从内存拷贝到输出设备 “网卡” 中,数据通过网卡传输到网络中,通过网络交付给对方的输入设备 “网卡”,数据又加载到内存(前提:对方qq启动),数据由 CPU 经过解密、解包后,重新写回到内存中,最后数据刷新到了对方的显示器中。
问题二:如果是在qq上发送文件呢?
- 数据流动过程:文件在发送之前在磁盘中,先将文件拷贝到qq中,而qq已经在内存中,等价于将qq拷贝到了内存中,然后内存中的数据经过 CPU 的加密、封包,重新拷贝到内存,再到网卡,传输到网络由对方网卡接收,再加载到内存,内存中的数据经过 CPU 的解密、解包重新拷贝到内存,最后文件到了对方磁盘中。
总结:
- 聊天的本质:把数据从用户键盘,通过体系结构,转发到对方显示器的过程。
- 发送文件的本质:把文件从本地磁盘,通过体系结构,拷贝到对方磁盘的过程。
2.操作系统
1.是什么?
操作系统是一款进行软硬件管理
的"软件"
。
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
若操作系统只有内核,作为应用者而言是无法使用的。
- 为了在操作系统上进行开发:操作系统会配上自己函数库(系统调用、C标准库)。
- 用户无法直接跟操作系统打交道,为了用上操作系统:操作系统会提供命令行、图形化界面等。
小知识:安卓手机的低层是 Linux 内核,只需要将一些库,就可以基于安卓做开发。
2.为什么设计操作系统?
- 对下:与硬件交互,管理所有的软硬件资源。
- 对上:为用户提供⼀个良好的执行环境。
驱动程序的作用:为了读取不同设备中的数据,需要不同的驱动程序。
- 软硬件体系结构(就是上图中从硬件到用户):层状结构。
- 层状结构:高内聚,低耦合。高内聚:将相同功能、逻辑的数据或代码,放在同一层内部。低耦合:层与层之间只使用接口的方式进行互相调用,在数据和逻辑层面上的依赖关系尽可能少。方便代码的可维护性:一个模块的修改不影响开一个模块。
- 计算机在硬件也满足高内聚,低耦合的层状结构。哪个硬件坏了,换哪一个即可。
- 不能直接访问操作系统,必须使用系统调用(系统提供的函数)
- 操作系统不允许用户直接访问内存,直接读取进程,直接访问文件,直接读取驱动,必须要求用户通过操作系统自己提供的(系统调用:C封装的接口),来访问操作系统。
- printf 函数的本质:将数据写到硬件(显示器)中。但不是直接写到硬件中,整个计算机体系是层状结构,不可能绕过操作系统直接写到硬件中,printf 函数的低层封装了系统调用,通过操作系统对驱动管理进行访问,访问对应的驱动程序,最后将数据写到显示器中。
- 我们的程序,只要判断出它访问了硬件,那么它必须贯穿整个软硬件体系结构。
- 库可能在底层封装了系统调用。
3.核心功能
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的"搞管理"
的软件。
4.如何理解 “管理”
如何理解 "管理"?
管理的例子:学生、辅导员、校长。
- 描述被管理对象。
- 组织被管理对象。
- 通过先描述,再组织:对任何 “管理” 场景进行建模。
- C++提供类解决:先描述的问题;提供STL解决:再组织的问题。
- 操作系统对软硬件的管理都基于:
先描述,再组织
。
5.系统调用和库函数概念
问题:操作系统要向上提供对应的服务,但是操作系统不相信任何用户(例如:银行),那么如何为用户提供服务?答案:系统调用
。
- 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接⼝,供上层开发使用,这部分由操作系统提供的接口,叫做
系统调用
。 - 系统调用在使用上,功能比较基础,对用户的要求相对也比较高。所以,有心的开发者可以对部
分系统调用进行适度封装,从而形成库
,有了库,就很有利于更上层用户或者开发者进行⼆次开发。 - 库函数和系统调用属于上下层的关系。库函数在上层,系统调用在下层。
- 如何判断库函数内含有系统调用?只要库函数访问了硬件,那么一定含有系统调用。