💭本文是对计算机底层学习的初步认识的知识铺垫,初步了解冯诺依曼体系结构和操作系统的概念和定义,为后续进程与地址空间系列学习打下基础。
冯.诺依曼体系结构是当今计算机,如:笔记本、服务器,都遵守的一个体系结构。其总体结构如下图:
⭕我们重点关注其中的数据信号传输。即:我们要研究数据如何经过各类硬件传输和处理。
💭 平时我们使用计算机的时候,知道很多计算机的组成部分(包括外设和内部组件),例如:键盘、鼠标、显示器、磁盘、内存、网卡……而所有的这些,都包含在冯诺依曼体系中,他们各司其职,一起构成了我们的计算机。
输入设备、输出设备: 是计算机输入数据和输出数据的设备,通俗地理解,输入入的是电脑,输出出的是人。输入设备有:键盘、鼠标等;输出设备有:显示器、扬声器等。值得注意的是,磁盘和网卡既是输入设备又是输出设备。
存储器: 就是内存,有掉电易失的属性。
中央处理器: CPU,由主要的运算器、控制器和其他一些器件组成。
💭在冯.诺依曼体系结构,对于数据的读写,CPU的速度是最快的,而输入输出设备是最慢的,这会导致我们从输入设备传入数据到CPU处理,再从CPU传出已处理的数据到输出设备,这些过程之间的速度不匹配问题,降低了整机效率。虽然CPU的读写速度是最快的,但是倘若只有外设(如磁盘)这种效率极低的部件来与它进行数据交互,必然会拉低整机效率。
为了提高整机效率,冯.诺依曼体系引入了内存(存储器)的概念,完美地解决了这一难题!
设备 | 读写速度 |
---|---|
CPU(中央处理器) | 最快 |
存储器(内存) | 次快 |
外设(输入输出设备) | 最慢 |
📝如表中所示,内存的读写速度位于CPU与外设之间,它的出现适配了CPU与外设之间速度不匹配的问题。内存可以理解为一个大大的缓存空间,当有数据从输入设备传入时,不是直接传入CPU进行处理,而是传入内存再传入CPU。同理,从CPU中处理完的数据,也不是直接传输到输出设备,而是先经过内存再到输出设备。
在外设与内存之间进行数据交互的过程称为I/O
I:输入设备 → 内存
O:内存 → 输出设备
🌰举个栗子!
Q:我们常说程序运行要先加载到内存中,为什么呢?
A:程序的本质其实就是文件,是通过编译链接后生成的可执行文件(.exe),而文件是存储在磁盘中的。要使得程序运行起来,CPU要读取二进制可执行程序文件,而磁盘是一个输入设备,由冯诺依曼体系结构决定,必须先将数据加载到内存中,才能让CPU读取到数据。这个过程实际就是将可执行文件加载到内存当中。
🔎延伸:磁盘是一个存储设备,它与内存的特性相反,具有永久性存储能力。平时我们电脑中的各种文件和数据,都是存储在磁盘当中的(关机的时候也是存在磁盘中,因为如果存储在内存中,由于掉电易失,关机了数据就全丢失了)。当我们开机的时候,各种软件的程序会从磁盘中加载到内存,方便我们使用,而不是等我们要用的时候再把软件的程序从磁盘中拿到内存。
💭CPU在计算机中扮演着一个“打工人”的角色,而我们作为计算机的用户,就是CPU的“老板”,CPU只能听从我们的命令去执行对应的事。那么,我们要对下属下达命令,那他得能听懂我们说的话才能正确地执行吧?就好像一个日本老板,用日语给听不懂日语的下属指派了一个任务,老板确实完成了下达命令这项工作,但是由于下属无法识别命令本身,导致无法执行命令。同理,CPU也需要认识我们给它下达的命令。
🔎概念:所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。
通俗理解,指令集就是CPU能认识的语言,而程序运行之前编译的过程,就是将高级语言翻译为机器语言(包含一条条的指令),使得CPU能够看懂程序,这样才能运行。
从大类来分,一般将指令集分为精简指令集和复杂指令集。
参考内容:
【CPU指令集】CPU指令集是什么
假设张三要在他的电脑上用QQ给他的好朋友李四发送一个消息“Hello”,会经过怎样的数据流动过程呢?我们应该基于冯诺依曼体系结构来考虑。
💡这是发送消息的过程,那么发送文件呢?
其实大同小异,张三的输入设备变成磁盘,拉拽文件到聊天框中就是将文件传入QQ程序中,加密处理过程类似,发送过程也是一样的。而李四接收文件、处理文件的过程也是同上,只不过输出设备变成李四电脑的磁盘,文件传入磁盘中。
🚀承上启下
冯诺依曼体系结构中,在数据层面,CPU不和外设直接交流,只和内存直接打交道,以达到提高整机效率的目的。那么,CPU和内存之间这个“打交道”的过程是由谁来做的呢?怎么做的呢?没错,那就是我们的操作系统了!当然,操作系统的作用远不止于此!
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。操作系统是一个进行软硬件资源管理的软件。笼统地理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库, shell程序等等)
理解操作系统的核心,就是理解它如何管理
以下只讨论操作系统对硬件的管理。
💭日常生活中存在很多管理的例子。例如,在学校中,校长是管理者(这里我们将学校体系简单化,视校长为唯一管理者),学生是被管理者。校长具有对学校内重大事项的决策能力,而他做出的决策都需要依据被管理者,也就是学生的数据。例如,评定奖学金时,校长就需要根据学生的综合成绩数据做出评定决策;又如某某学院的总体成绩下滑,校长就可根据这一数据,做出相应的决策。
因此我们得出结论,管理的本质就是对数据做管理。
💭数据如何获得呢?学校里学生很多,而且数据都是动态变化的,校长无法直接捕捉,于是,又有另外一种角色帮助校长完成这项工作——辅导员。每个学院都有自己的辅导员,他们是与自己学院的学生日常接触的角色,通过与学生接触获取学生的数据,并反馈给校长。从而完成了对学生数据的收集与管理。
而操作系统的管理体系就类似于上述例子学校的管理体系
⭕ 如图
驱动程序是用来操控硬件的逻辑方法的程序,每个硬件都由它特定的驱动程序操控。驱动程序主要干两件事:
💡因此,操作系统便可通过驱动,获取底层硬件的数据,从而对硬件进行管理。
💭有了被管理者的数据后,就要有对其进行管理(增删查改等操作)的方法。继续拿学校举例子,校长现在已经通过各个学院的辅导员获得了全校所有学生的信息,他想要进行一次奖学金评定,给全校综合成绩排名前十的学生发放奖学金,怎么实现?难道自己一个一个学生的成绩找吗?这样效率极低,就算完成了,如果下次是选出全校身高最高的十个人又是另外的找法。这种按数据管理的方法是不科学的,因为学生多、学生数据更多。
科学、高效的数据管理方法:因为每位学生的数据种类都是相同的,如:姓名、成绩、学号、班级、性别、籍贯等等,所以可以先将每位学生描述为一个带有多种属性的对象,然后再将所有对象组织起来,成为一个特定的结构,这样管理起来很方便,只需要对结构进行操作即可。从按数据管理转变为按对象管理。
⭕操作系统对数据的管理亦是如此,总结起来就是六个字:先描述,再组织
class dev
{
private:
// 硬件信息
int type;
int status;
//...
dev* next;
}
// 伪代码
//创建一个链表
list<dev> devList;
//插入磁盘节点
dev disk_dev;
devList.insert(disk_dev);
//插入键盘节点
dev keyboard_dev;
devList.insert(keyboard_dev);
完成先描述再组织过程后,操作系统对硬件的管理变成了对硬件对象组成的数据结构的管理。例如,要删除对键盘的管理,只需要以键盘的某个特定属性为key值,在链表中找到keyboard_dev
节点,删除该节点即可。
为了保障操作系统的安全性,在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者对部分系统调用进行了适度封装(如printf、scanf),从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。在Linux下,操作系统提供的接口一般都是C语言函数接口。
⭕综上所述,计算机大致的体系结构如图所示