🔑🔑 博客主页:阿客不是客
🍓🍓 系列专栏:深入代码世界,了解掌握 Linux
欢迎来到泊舟小课堂
😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注
一、冯•诺依曼架构(Von Neumann architecture)
1.1 冯•诺依曼体系
冯诺依曼体系结构 (Von Neumann architecture) ,又称 "范纽曼型架构"。它是我们常见的计算机,如电脑、笔记本或服务器大部分都遵守的一个架构体系。
- **输入设备:**键盘 | 话筒 | 摄像头 | 磁盘 | 网卡 | 写字板 ...
- **输出设备:**显示器 | 音响 | 打印机 | 磁盘 | 网卡 | 显卡 ...
- [CPU]:运算器 + 控制器
- **存储器:**内存
📌 注意事项:
- 图中的存储器指的就是内存。
- 不考虑缓存情况,这里的 CPU 能且只能对内存进行读写,不能访问外设(输入或输出设备),外设想要输入或输出数据,也只能写入内存或者从内存中读取。
- 所有设备都只能和内存打交道。
- 我们平常读文件就是从磁盘上读取,写文件都是写入到磁盘,这种操作我们就叫 I/O
1.2 存储器(内存)存在的意义
**❓ 思考:**为什么冯诺依曼体系中要存在 "内存" 这样的东西?
**📌 数据角度:**CPU 不和外设直接交互,而是和内存交互。(外设也是如此)
输入设备在输入数据时不是把数据直接交给 CPU 的,CPU 获取、写入数据都是在内存中进行的,所以需要把数据先从外设交给存储器,再将存储器当中的数据再被 CPU 读取,CPU 计算完后再将数据写回存储器,再由内存刷新回输出设备。因此在整个计算机体系当中,内存是属于数据层面上的核心地位。
**🔨技术角度:**不使用内存会拉低 CPU 的效率
数据是从一个设备 "拷贝" 到另一个设备的,体系结构的效率由设备 "拷贝" 的效率来决定,这个时候我们需要知道一个存储分级的概念:
在计算机中,有很多种存储,且存储的速度方面是有差别的。站在我们刚刚展出的冯诺依曼体系结构来看,就是 "输入设备" 是最快的,"输出设备" 是最慢的。存储器是适中的,如果我们此时不考虑内存的存在:
根据木桶原理,总效率就取决于效率最低的设备,CPU 需要长时间等待输入设备,这就大大拖慢了计算机 CPU 的效率。
但就算加了内存,根据木桶原理最慢的还是输入输出设备啊?似乎并没有什么改变,为了解决这个问题,我们需要了解内存的概念。
内存作为"中介"设备还起到一个缓冲的作用,因为它的效率比输入设备与输出设备快的多,但又比中央处理器慢。并且内存还有一个优点就是:提供预载数据的能力。
根据局部性原理,当一个数据正在被访问时,那么下一次有很大可能会访问其周围的数据。虽然内存的数据慢于寄存器,但内存的空间更大,能存储更多的临时数据,所以当CPU需要获取某一行数据时,内存可以将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据,大大提升效率。
💰成本角度:造价成本: 寄存器 内存 磁盘 (外设)
既然输入输出设备所在的区域效率这么低,我们制造一个很大空间的寄存器,我们把输入输出,内存等设备全部丢进寄存器不就好了?你如果想的话当然可以这么做,那计算器确实也变得很快,但这样做很贵啊!效率确实是高了,但我们普通人存储临时数据使用昂贵的寄存器太浪费了啊!
**💡 内存的意义:**使用较低的钱的成本,能够获得较高的性能。因为内存的存在,我们现在可以用不多的钱买上一台性价比不错的电脑,这就是内存的最大价值,这也是互联网存在的基础。
二、操作系统
操作系统是一款软件,用来进行对软硬件资源进行管理的软件。任何一款计算机系统都包含一个基本的程序集合,我们称之为操作系统()。
操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell 程序等)
2.1 为什么要有操作系统
首先我们知道在计算机的底层存在各种硬件设备,这些硬件设备通过冯•诺依曼体系结构联系在一起。
但是仅有这些硬件是不够的,还需要一个软件来对这些硬件进行系统化管理。例如:内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?是按行刷新还是全刷新?这个软件就是我们所谈论的操作系统。
一般而言,操作系统为了保护自己的内在结构,并不会将源码呈现给用户,而是而是**封装出一些接口提供给用户。**这些接口一般被称为系统调用接口,但是这些接口对于普通用户来说具有一定的使用成本,因为用户必须要先对操作系统有一定了解,为了方便用户,所以又对系统接口进行封装形成我们的用户操作接口,常见的用户接口有各种库如libc以及部分指令,我们一般在实际编写的过程中调用各种的函数printf,scanf就是来源于这些库。
而最上层还有一层用户层,一般是由我们用户通过指令或图形化界面进行各种操作。
我们可以得出以下几个结论:
- 软硬件体系结构是层状结构
- 访问操作系统,必须使用系统调用(函数)
- 任何程序只要访问了硬件,那么它就必须贯穿整个操作系统
- 库可能在底层封装了系统调用,比如 printf,cout 等
**管理的目的:**① 对上:提供一个良好稳定的运行环境 ② 对下:管理好软硬件资源。
而我们今天要重点谈论的就是 "管理",什么叫做管理?如何理解?
2.2 对管理的认识
**定位:**在整个计算机软硬件架构中,操作系统的定位是一款纯正的 "搞管理" 的软件。
我们先看看人是如何做事的,人做事:
决策 执行
比如今天我打算晚上跟朋友一起开黑,这就是决策。晚上吃完饭你很喊朋友上号,然后一起开黑去了,这就是执行。这就是 决策过程 和 执行过程 ,虽然决策和执行在我们人身上似乎是混合体的,我决策我执行。但是计算机中,为了能够做更好的功能解耦,决策和执行实际上是可以分离开来的。
"有人负责决策,也有人负责执行。"
举个学校的例子,校长做决策,辅导员去执行。校长连我的面都不见,如何管理我呢?管理你要和你打交道,要和你见面吗?他是怎么做到的?
**管理的本质:**不是对管理对象进行直接管理,而是只要拿到管理对象的所有的相关数据,我们队数据的管理,就可以体现对人的管理。
这是我又有一个问题了,如果你说它连我的面就不见,他又是如何拿到我的数据的呢?执行者可不是只拿数据,还可以落实对应的政策。
2.3 先描述再组织
对管理的进一步理解:人认识世界的方式 ------ 人是通过属性认识世界的一切事物都可以通过抽取对象的属性,来达到描述对象的目的。
继续刚才的例子,如果你自己就个是个当过程序员的校长,你想管理学校的同学,那么就可以抽取所有同学的属性,描述对应的同学,我们知道 Linux 内核代码是由C语言写的。
那么C语言中有没有一种数据类型,能够达到描述某种对象的功能?他就是 ------ struct
cpp
struct student
{
学生的基本信息(身高,姓名,年级,电话...)
在校基本信息(专业,班级,年级)
考试成绩(平时成绩,期末成绩)
学校活动(...学生会, 班长?)
其他信息
struct student* next;
struct student* prev;
};
如此一来,对学生的管理,就变成了对链表的增删查改。然后我们在有头插、尾插的各种方法。现在如过我想找到考试成绩最好的学生,只需要遍历整个链表,找到那个学生的结点即可。再比如,学校的挂科率太高了,要整治一下这个问题,我们就执行一个排序算法,以绩点排序。按升序排列,找到若干名排在前面的绩点低的学生,再通过自带的信息联系到辅导员,进行管理。
管理的本质:对数据做管理 对某种数据结构的管理,管理的核心理念 ------
" 先描述,再组织。"
所谓的管理,其实就是 "先描述,再组织。"
- **描述:**用 struct 结构体
- **组织:**用链表或其他高效的数据结构
2.4 系统接口
OS 为什么要给我们提供服务呢?因为计算机和 OS 设计出来就是为了给人提供服务的。
printf or cout 向显示器打印,显示器是硬件,所谓的打印,本质就是将数据写到硬件。你自己的 C 程序,有资格向硬件写入吗?你是没有资格这么做的。
那么要如何提供服务?操作系统不相信任何人的,不会直接暴露自己的任何数据结构,代码逻辑,其他数据相关的细节。想做系统是通过 系统调用 的方式,对外提供接口服务的。Linux 操作系统是用C语言写的,这里所谓的 "接口",本质就是C函数。我们学习系统编程,本质上就是学习这里的系统接口。