**💭 前言:**本章我们首先会明确冯诺依曼体系结构的概念,旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节,着重谈谈操作系统概念与定位、操作系统是如何去做管理的,引入 "先描述,再组织。
冯诺依曼架构(Von Neumann architecture)
冯诺依曼体系结构 (Von Neumann architecture) ,又称 "范纽曼型架构"。它是我们常见的计算机,如电脑、笔记本或服务器大部分都遵守的一个架构体系。
输入设备:
键盘,话筒,摄像头,usb,鼠标,磁盘/ssd,网卡等等
存储器:
存储器其实就是内存!
中央处理器(CPU):
CPU,寄存器,各级别缓存
输出设备:
显示器,磁盘,扬声器,网卡等等
注意事项:
图中的存储器指的就是内存。
不考虑缓存情况,这里的 CPU 能且只能对内存进行读写,不能访问外设(输入或输出设备)
外设想要输入或输出数据,也只能写入内存或者从内存中读取。
所有设备都只能和内存打交道
内存
**??思考??:**为什么冯诺依曼体系中要存在 "内存" 这样的东西?
- memory 指内存,disk 指外设磁盘,cd 指光盘磁带
有很多种存储,且存储的速度方面是有差别的、
站在我们刚刚展出的冯诺依曼体系结构来看,就是 "输入设备" 是最快的,"输出设备" 是最慢的。
存储器是适中的,如果我们此时不考虑内存的存在:
先让输入设备接收用户输入,如果用户不输入,或者输入设备在接受用户期间,
我们的 CPU 是属于闲置状态的,当 CPU 把数据拿到之后再进行计算还得写,写完后还得刷。
CPU 把数据计算完再交给输出设备,交给它时速度非常慢,可能还要给用户展示。
总体来说,就是输入设备非常快,运算器和输出是非常慢的,这里就引出了 "木桶效应" 问题。
" 木桶如求盛水多,决于短板短几何。"
CPU 把数据计算完再交给输出设备,交给它时速度非常慢,可能还要给用户展示。
总体来说,就是输入设备非常快,运算器和输出是非常慢的。
因此,由此构建出的计算机效率是非常低下的!
所以我们就不能够只是裸地将外设和 CPU 直接粘合起来,构成所对应的计算机体系。
所以就有了冯诺依曼体系结构,在输入输出和运算, 控制器之间添加一个中间设备 ------存储器。
**存储器最大的价值:**输入设备在输入数据时不是把数据直接交给 CPU 的,而是把数据先从外设交给存储器,再将存储器当中的数据再被 CPU 读取,CPU 计算完后再将数据写回存储器,再由内存刷新回输出设备。因此在整个计算机体系当中,内存是属于数据层面上的核心地位。
**数据角度:**外设不和 CPU 直接交互,而是和内存交互。(CPU 也是如此)
内存在我们看来,就是体系结构的一个大的缓存,适配外设和 CPU 速度不均的问题的。
**内存的意义:**使用较低的钱的成本,能够获得较高的性能。
" 我们自己写的软件,编译好之后,要运行,必须先加载到内存。"
为什么?因为这是 体系结构 决定的!如果不加载到内存 CPU 没办法执行的。
所以我们自己编好的软件加载到内存,这是体系结构决定的,
当你在启动时,还没有执行程序时,你的数据其实已经预加载到内存当中了。
这就牵扯到 "局部性原理" 的概念了:局部性原理是指 CPU 访问存储器时,
无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
比如正在执行第10行代码,你有理由推断你接下来要执行的代码一定是第10行代码附近的代码。
因为局部性原理的存在,你在访问某些数据时可以将数据的周边数据提前给你加载出来。
这,就是操作系统预加载数据的根本理论基础。
运算器和控制器
我们先来看 运算器,运算器主要承担了运算的工作。
计算机的计算种类无非两种:① 算数计算 ② 逻辑计算
加减乘除取模这一些就算算数计算,逻辑与逻辑或逻辑反这些就是逻辑计算。
在人的计算世界中,计算其实就是算账、算数。
人会推理一些东西,这实际上就是逻辑。所以计算机的计算和人的计算,无外乎就是这两种。
**总结:**所有的外设在数据层面上不和 CPU 接轨,直接和内存处理。CPU 读数据直接从内存中读数据,处理完数据后的结果再刷新到内存。
对我们来说,实际上计算机为了提升整体性能,也加了许多其他的优化策略,比如寄存器和缓存,这些话题我们一言难尽,我们放到后面再去探讨。
为什么冯诺依曼系统如此流行?
其实计算机体系不止有冯诺依曼系统,还有哈佛架构和向量处理器系统
,还有流水线结构等等,为啥冯诺依曼系统被广泛使用呢?
先给大家铺垫一下内存分级的知识:
结论: 离CPU越近的设备,运行速度越快,造价也越贵!
在硬件层面上,CPU只能和内存交互而不能直接和磁盘外设交互!这是因为外设磁盘离CPU很远,处理速度很慢,相信大家都听说过短板效应,所以CPU为了总体的运行速度不被拉低,就不会直接和磁盘外设打交道,而是和内存打交道!
所以冯诺依曼的这种体系很巧妙将中央处理器进行复杂的数据处理,运算而离CPU远一点的设备用于存储数据或者接受数据后传给内存做分析。
这就得出了这样的结论:
冯诺依曼系统既有高价格的设备用于处理复杂的数据,又有低价格的设备用于存储数据或进行数据交互这使得冯诺依曼体系的计算机可以在价格不高的前提下,做到效率比较高!
正是这种能让老百姓买得起的价格
并且使用起来比较高效的模式
才让冯诺依曼系统到现在也如此流行!
理解操作系统(OS)
什么是操作系统?
我们之前也讲过,
操作系统是一款软件,用来进行对软硬件资源进行管理的软件。任何一款计算机系统都包含一个基本的程序集合,我们称之为操作系统。
操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell 程序等)
**定位:**在整个计算机软硬件架构中,操作系统的定位是一款纯正的 "搞管理" 的软件。
**管理的目的:**① 对上:提供一个良好稳定的运行环境 ② 对下:管理好软硬件资源。
而我们今天要重点谈论的就是 "管理",什么叫做管理?如何理解?
再次理解 "管理"
虽然我们不懂什么是管理,但是我们肯定是被管过的。
**管理的本质:**不是对管理对象进行直接管理,而是只要拿到管理对象的所有的相关数据,我们队数据的管理,就可以体现对人的管理。
"在公司中,你之前负责的模块经你手自己处理了大半年,模块的效率比之前翻了十倍一百倍,领导就知道你一定是做出成绩来了,如果你在公司里什么都没写,什么有效数据都没有产出,所有管理最终都要落实到对数据做管理。"
这是我又有一个问题了,如果你说它连我的面就不见,他又是如何拿到我的数据的呢?
执行者可不是只拿数据,还可以落实对应的政策。
先描述再组织
对管理的进一步理解:人认识世界的方式 ------ 人是通过属性认识世界的。
一切事物都可以通过抽取对象的属性,来达到描述对象的目的。
cpp
class OBJ {
// 成员属性
}
继续刚才的例子,如果你自己就个是个当过程序员的校长,你想管理学校的同学,
那么就可以抽取所有同学的属性,描述对应的同学,我们知道 Linux 内核代码是由C语言写的。
那么C语言中有没有一种数据类型,能够达到描述某种对象的功能?
那就是:struct
cpp
struct student {
学生的基本信息(身高,姓名,年级,电话...)
在校基本信息(专业,班级,年级)
考试成绩(平时成绩,期末成绩)
学校活动(...学生会, 班长?)
其他信息
struct student* next;
struct student* prev;
};
如此一来,对学生的管理,就变成了对链表的增删查改。然后我们在有头插、尾插的各种方法。
现在如过我想找到考试成绩最好的学生,只需要遍历整个链表,找到那个学生的结点即可。
再比如,学校的挂科率太高了,要整治一下这个问题,我们就执行一个排序算法,以绩点排序。
按升序排列,找到若干名排在前面的绩点低的学生,再通过自带的信息联系到辅导员,进行管理。
管理的本质:对数据做管理 对某种数据结构的管理,管理的核心理念 ------" 先描述,再组织。"
所谓的管理,其实就是 "先描述,再组织。"
- **描述:**用 struct 结构体
- **组织:**用链表或其他高效的数据结构
操作系统对硬件的管理
和校长管理学生一样,操作系统也不是直接管理硬件,而是管理硬件映射出来的信息和校长创建的结构体类似,操作系统也会对各个硬件创建一个结构体,结构体中存放硬件的各种信息和健康状态等等,再通过链表或者其他数据结构将这些结构体一一链接起来统一管理!
操作系统将软件硬件管理好并不是它的目的,它的目的是给用户提供良好得,稳定,高效,安全得使用环境,而管理只是一种手段
每一个硬件都有对应的驱动程序来做管理像键盘,鼠标,U盘等等都有对应的驱动程序,然后操作系统再通过这一整套成熟的驱动程序来管理下层的硬件!并且在此基础上衍生出各种软件业务,和用户服务!
总结
本篇文章的内容大家要有一个基本的认识,然而虽然说操作系统是为用户提供服务的,但是它并不相信用户,因为群众中可能有坏人,就像银行一样,为你提供服务但是不信任你,于是在操作系统和用户之间还有系统调用窗口和shell外壳来阻止群众中的坏人直接获取Linux内核中的各种信息!
系统调用说白了就是操作系统给用户提供了一个又一个的函数用户通过调用函数来获取操作系统内的各种数据,然而函数是操作系统内部写的,所以你只能看到有限部分的数据。