一、硬件体系
首先我们要知道,我们最常见的计算机(笔记本)以及我们不常见的计算机(服务器)其实本质上都是一堆硬件的结合:cpu、网卡、显卡、内存、磁盘、显示器、键盘……
但他们并不是毫无章法地放在一起,硬件和硬件之间需要有效地组织成一个系统才能更好地发挥功能,我们把这个组织结构叫做冯诺依曼体系结构!
1.1 冯诺依曼体系结构介绍
a、输入设备:鼠标、键盘、摄像头、话筒、磁盘(文件读取)、网卡(网络接受)……
b、输出设备:显示器、播放器硬件、磁盘(写入文件)、网卡(网络发送)……
计算机只能识别二进制语言,所以人和计算机打交道,必须要借助输入输出设备,并且我们会发现有的设备是纯的输入或输出,而有的设备既有输入也有输出
c、存储区:内存
运行程序、读取文件、写入文件……等大部分操作都是在内存中进行的!
d、运算器:对我们的数据进行计算任务(算数运算、逻辑运算)
e、控制器:对我们的计算机硬件流程进行一定的控制
运算器和控制器统称为中央处理器(CPU)
冯诺依曼体系结构由以上五个部分组成,但我们要知道每一个硬件都是独立的个体,所以想要建立联系协同起来,必须借助“线”进行连接!!我们把它叫做总线,总线又分为系统总线和IO总线
系统总线:存储区和运算器、控制器之间的线
IO总线:存储区和输入设备、输出设备之间的线
1.2 冯诺依曼为什么要这么设计?
我们会发现一个问题就是,输入设备和输出设备并不直接跟中央处理器打交道,他们都只跟存储器打交道,所以存储器(内存)在这个过程中发挥了串联整个线路的作用!我们接下来就要分析为什么要这么去设计!!
1.2.1 提高工作效率
以下是计算机存储的金字塔层次结构:
CPU的速度是纳秒级别的,而硬盘是毫秒级别的,所以他们的速度差距太大了!!因此需要内存(微秒级别)在中间做一个和事佬。
1.2.2 串型变成并型
其实CPU和硬盘,很容易让你想到木桶效应,就是木桶能接多少水取决于他的短板,而同理计算机运行有多快似乎也应该取决于硬盘,但如果真的是这样的话,那我们加入内存的意义在哪呢?不也是会相互拖慢速度吗??
其实你会这么想的原因是,你把这套体系理解为串型了,就是单纯认为中央处理器一定要等到数据全都加载到存储器的才会去工作,其实在我们将数据从输入设备加载到存储器时,中央处理器可能并没有闲着,而是在处理别的工作!!他们是一个并型逻辑!!
举个例子:比如说二进制可执行程序其实也是文件,文件是在磁盘上存储的,我们要运行这个程序就必然要将其先读取到内存中,而当外部设备在将数据加载到内存中时,其实cpu可能正在进行其他的运算,当你把数据预先都加载到内存中的时候,cpu恰好开始执行你的代码,所以我们会发现cpu从存储器中拿数据和外部设备导入到存储器这两个过程是可以同时进行的!!所以这是并型而不是串型!!大大提高了效率!!这也是内存存在的真正价值!!
1.2.3 有利于计算机的传播
通过计算机存储的金字塔结构,我们会发现越往下成本越低、容量越大、速度越慢,这是一个有舍有得的过程,那如果我一点也不差钱,那我是不是可以全部都用寄存器?不要内存也不要磁盘?也不需要遵守冯诺依曼体系?
答案其实是应该可以做到的!!如果你特别有钱,或许真的可以让别人给你定制一个只靠寄存器的计算机,但是这个计算机必然是造价特别贵的。老百姓是用不起的!!
其实我们是否会去使用这个计算机,一方面是考虑是否易操作、性能好,另一方面也要考虑成本!!所以冯诺依曼体系中为什么要有内存,也是因为我们不仅需要中央处理器,但是为了控制成本也不得不有硬盘,所以才需要有一个速度适中、容量也适中的存储器,这样可以在不降低太多性能的前提下降低成本,能够让老百姓去使用!!
通过此时的冯诺依曼体系结构,包括开源的Linux和git,我们会发现其实一样东西是否能够被快速传播,成本是十分重要的,价格太高是不利于传播的,其实现在市面上或许也会存在很多能够造福于百姓的创造,但是可能由于成本太高无法推广给普通老百姓,所以必然也是会沉没在历史的巨轮中。比如我们看过的一个电影叫《我不是药神》,其中抗癌正版药非常贵才会让老百姓不惜犯罪也要去吃盗版药。也是这个道理!!
1.3 实际应用
冯诺依曼体系中最为关键的就是内存!!我们可以很好地解释以下知识:
1、为什么一个程序要运行必须要先加载到内存中??
——>这是由冯诺依曼体系决定的, 程序其实就是一个二进制文件,文件就是存储在磁盘(外部设备)中的,要去中央处理器那里才能运行,所以必须要先加载到内存中!!
2、我们之前写的进度条,如果不换行的话,数据会被存储到缓存中,那么缓存在哪??
——>根据冯诺依曼体系结构,我们可以知道缓存其实就在内存中!!
3、如果我想把实验报告通过qq发送给我的好友,如何用冯诺依曼体系来分析整个数据流??
二、OS体系
每个硬件都有他对应的功能并且能够安装冯诺依曼体系去很好地工作,但是这是远远不够的,因为什么时候需要去执行什么功能是需要有人去调控的。
举个例子:假设你是一个国家的国王,这个国家里有擅长搞经济的,有擅长打仗的,有擅长谈判的,有擅长艺术的……当你想要听声乐,你会去叫搞艺术的人过来,当国家和平时期,你会重点培养搞经济的人,当外敌来犯,如果你想和解,你会叫擅长谈判的人来,你想打仗,你就会叫擅长打仗的人来…………所以这整个逻辑都是需要有人去调控的,在计算机中也是如此。
所以可能你的电脑中同时运行了qq、qq音乐、cctalk……那我什么时候该运行先哪个,运行qq的时候,凭什么不先运行qq音乐呢??所以我们需要有一个大脑一样的角色去管理他们——OS
OS是一款可以管理软硬件资源的软件,就像人可以管理人也可以管理机器一样!!
2.1 OS存在的意义(为什么)
2.1.1 给用户提供良好(稳定、高效、安全)的运行环境
无论我们上层是什么样的,最终的行为都是在硬件上体现的,软件想要操控硬件,就必然需要一些能够与硬件建立联系的驱动程序。比如说鼠标,当你刚把数据线接上的时候,从物理上你已经连接到你的电脑上了,但是你可能还需要等待几秒才真的可以去使用,因为驱动程序一开始还没有马上被加载出来——>驱动程序是我们和硬件打交道的软件(大部分是系统自带的)
OS是一个帮助我们管理软硬件资源的角色,但这仅仅只是他的手段罢了,他的目的是为了给用户提供一个良好(稳定、高效、安全)的运行环境,但我们要知道其实普通用户是不善于和OS打交道的,所以普通用户使用的都是基于程序员开发出来的软件,所以首先是我们专业的程序员需要去跟OS打交道,然后再搞出满足普通用户需求的各种软件!!
所以后面我们要探究的就是,程序员究竟如何和OS打交道呢??
2.1.2 OS其实不信任用户
OS里面有各种各样的数据,但是OS并不信任用户!!
首先我们要理解的是,不相信你和让你使用其实是不矛盾的,举个例子:银行允许任何用户进来,但是他其实并不相信所有的用户,因为用户当中可能会有坏人,所以银行为了保护自己需要封闭起来,但是不能完全封闭,因为这样就无法给老百姓提供服务了,所以他开放了一些小小的窗口,如果你普通用户想要取钱、借贷……只能通过这个小窗口来申请!!
同理,OS也觉得自己的数据太重要了,他担心坏人恶意攻击他,也担心小白随意篡改他,无论有意无意都有可能对他造成伤害,比如说一个磁盘可能有500G,但是有人给他改成了300G;你的网络本该是良好的,但是却被改成断开……所以OS也得像银行一样,把自己封闭起来,但是留一些小小的窗口出来(在计算机中称为接口)——>所以OS的设计者用C语言写了一些内部的函数方法开放给外部,我们把它称之为系统调用!
因为这些接口都是由设计者提供的,所以他的内部自然会存在一些方法能够检测你的行为是否非法,只有合法的行为才能访问他的数据。
——>因此未来我们想跟OS打交道,只能通过系统调用来完成!!
——>但是系统调用本身使用难度也很大,所以就需要程序员基于系统调用去设计一些上层的软件或者接口去供普通用户使用。
2.1.3 OS和计算机语言的区别
其实语言的本质就是:头文件 库文件 编译器=可执行程序
1、所以语言实际上是基于系统调用接口之上存在的!!但是语言之间也是有区别的,比如说java、python、虚拟机等底层是用C或C 写的,所以哪怕是我们常说C/C 是偏底层的语言,但他实际上也只是在系统调用之上而已。所以我们可以有一个很好的边界认识。
2、任何语言访问硬件都需要经过操作系统,所以我们会发现,语言可能会变,但是操作系统是不会变的,因为下层如果改变的,整个上层的逻辑都会崩盘,再牛逼的软件也必须遵守这套体系。我们常说的计算机发展很快其实都指的是上层,下层的变化是不大的。
2.2 OS的管理方法(怎么做)
2.2.1 如何管理
为了能够更好地去理解管理,我们举个生活中的例子:
问题1:在学校里,校长是我们公认的管理者,我们学生是公认的被管理者,可是我们大多数人却没有见过校长,但是校长依旧可以把我们所有人都管理得很好,这是为啥???
所以首先我们可以得到一个观点1:管理者和被管理者之间是不需要见面的!!
问题2:那么管理者在不见被管理者的情况,是如何做好管理的呢??
比如说学校需要选出几个人去参加数学竞赛,我只需要知道哪几个学生的数学水平比较高就可以了,如果学校想给前10名奖学金,只需要给成绩排个序取前10名就可以了。比如我作为一个老板,我知道一个员工一年拿下了特别多的项目为公司创造了特别多的利润,业绩排名第一,我在不见到他的情况下通过他的表现就可以做出给他升职加薪的决策,所以我们会发现,对于管理者来说,只要知道管理信息,就可以在未来进行管理决策。所以管理的本质是通过对数据的管理,达到对人的管理!即使是在小公司我们和管理者能够见面,管理者关注的也无非就是管理信息。
问题3:那管理者究竟是如何拿到数据的呢??
如果是在学校,大家可能会想到辅导员(充当执行者),在管理者和被管理者其实还夹杂着执行者,因为一件事情除了决策还需要有人去执行!比如说校长想知道哪些人能够有资格去参加程序设计比赛,然后他就可以喊辅导员过来,辅导员(执行者)和学生(被管理者)走的比较近相对比较了解,或许就可以通过辅导员拿到对应的信息。这确实是有一定道理,但是如果规模比较大的话,比如大学里面,一个辅导员手下就有几百号人,一个校长手下就有几千甚至上万人……他们同时面对这么多数据,肯定忙不过来啊!!所以通过人去拿数据,不是不行,但是能力比较有限。所以我们换个角度思考,我们不就是想要知道一些基本信息吗,而学生虽然各有特点,但都是相同的属性。比如说张三和李四的学院、专业、电话、年龄、籍贯、身高、体重、各科成绩、兴趣爱好…………直接把这些我们想要知道的信息管理起来,不就可以解决这个问题了吗。你第一时间可能会想到用个excel表格,这是大部分人能想到的,但是比方说人数特别多,然后你想在对应的信息里找到比方说前5个数学最好的学生,那你可能得花费很多时间用眼睛去扫描数据,也挺累的其实,其实我们作为程序员,还有更好的办法,就是用结构体管理起来。
我们每入学一个学生,就可以新建一个学生类型,而每毕业一个学生,就可以删除一个学生类型,但是学生不只有一个啊!!所以我们需要把它管理起来,而对数据进行管理,当然就是数据结构啦!!那我们就可以在每一个学生结构体里面加一个next指针,这样就可以把所有学生的信息都串起来变成一个链表了!!所以我们就把对学生的管理转变成了对链表的管理!!!
转变为链表的管理和相比用excel有什么好处呢?? ——>对链表的管理本质上就是对链表的增删改查,所以我们可以根据链表的特点去写很多我们需要的一些接口。比方说我想找到数学成绩最好的10个学生,那么直接写一个相关的接口,而后每次我们只要调用这个接口就可以完成这件事,就不需要在excel里面一个一个去看了!!
综上我们进行一下总结: 1、管理者和被管理者是不需要见面的 2、管理者只需要得到管理信息,就可以做出管理决策,所以管理的本质是通过对数据的管理从而实现对人的管理 3、管理者一方面可以通过执行者去拿到数据,另一方面可以通过将被管理者的一些信息用结构体描述出来,然后再用数据结构组织在一起,然后再通过该数据结构的特点实现相关需求的算法来拿到数据。
在计算机体系结构里,我们的OS就相当于管理者,我们的软硬件资源就相当于被管理者,而我们的驱动程序就相当于是执行者。
2.2.2 理解先描述再组织
在理解如何管理之后,我们发现了管理者通过描述出被管理者的结构体,然后再通过数据结构组织起来,然后再实现一些相关的算法去实现管理。所以就引申出了一个概念——先描述再组织
思考一下我们以前写的通讯录应该是怎么写呢??
首先我们的通讯录里面要有人,肯定要先把人给描述出来,比如说有名字、电话、年龄……然后我们再用通讯录把这些人的对象管理起来,然后基于这个通讯录去实现一些接口:比如删除联系人、增加联系人、查找联系人…… 所以我们可以得到一个结论就是:其实未来我们无论开发任何软件,其实都是按照先描述再组织的形式去思考!!
再思考一下我们学习C 的正确顺序,首先我们先是学的类与对象,这是描述,而后我们学了内存、STL,其实就是在学习怎么进行组织………所以我们学习语言的顺序也是按照先描述再组织的思路去学的!!
另外再OS中,我们还可以知道:在OS中管理任何的对象最终都可以转化为对某种数据结构的增删查改!!
2.2.3 理解库文件vs系统调用
先举个例子,假如有A和B两个校长,A校长有一个学生数学特别厉害,但是B校长没有,于是B校长就想跟A校长商量借这个同学来打比赛,但是B校长肯定不能直接去找这个学生,因为这个学生是A校长的人,他得负责,所以他必须要通过A校长的同意才行。
同理我们通过printf把“hello”打在屏幕上,其实并不是我们直接通过调用这个库函数就和硬件打交道了,而是必须要自上而下贯穿下去,也就是要通过系统调用接口然后让OS知道!!!
所以我们知道了库函数必须通过系统调用接口才能找到OS,所以库函数和系统调用是上下层的关系,库函数是基于系统调用之上的二级开发!!