如何把计算机组成原理、操作系统、数据结构和计算机网络融会贯通,相互联系起来?

如何把计算机组成原理、操作系统、数据结构和计算机网络融会贯通,相互联系起来?

何为融会贯通?

知识的融会贯通的唯一核心衡量指标是,遇到没有遇见过的问题却能用处理过的经验去解决问题。

工业计算发展史

现在忘记你捧在手里的手机是一台计算机,我们回到计算机诞生的原始时代,这波穿越可能有点久远,我们直接去研究老祖宗的算盘吧。可能很多的人都没有见过这个东西,主要是会计电算化让一群臭打算盘的直接失业了,所以会比较稀少。那么算盘的工作过程就是一个非常简单的依靠一系列规则计算加减乘除(据说能搞开方),那么算盘是一个基于人类身体能量所驱动的产生计算力的机器。
应该是在第一次工业革命之后,人们开始追逐更高的计算力,当然是因为涌现了很多的数学家,我们需要的计算力已经没有办法通过人的能量来驱动了,恰好机械文明开始发扬光大,所以我们可以在很多的纪录片中看到庞大的计算机械,依靠弹簧的势能驱动机械并遵守某种规则,将机械能量转换为计算力。
随着人类的文明进化,人类开始逐渐不满足于自己已经拥有的,所以需要各种抢地盘,但是各个帝国的扛把子们发现老叫一群人拿着刀枪棍棒砍来砍去,要不就骑马打仗,这个效果不太行啊。所以人类开始进化威力更大的家伙事,为了造出来这些威力更大的家伙事,数学家和物理学家琢磨出来了各种各样的公式帮助人类去驾驭更强大的能量,虽然这个时候驾驭能量更多的是为了抢地盘吧。但是这些公式的计算,又需要更大的计算力,听碰巧的,在这个时候,电出现了,而且发现了某些东西,可以保持一种半导体特性,刚刚好能完成布尔逻辑的电路表示,也是从这个时候,我们的手机还有我们的PC的老祖宗被研究出来了,也就是小学语文课本的ENIAC这个庞然大物。
当然啦,这一堆工业计算的发展历史还是简化了的,我们会发现我们一直在通过利用更好的能量去驱动能量转化率更高的机器来为我们创造计算力,再利用这些计算力去生产更棒的计算力,所以现代计算机的出现,实际上推动了整个工业界的发展,因此在逼乎这个非常普通的搬砖专业莫名其妙就成了宇宙第一专业。

所以如何自底向上的捣鼓计算机?

这是一个我大一最想知道的问题,但是无奈我的直系学长们确实水平太low了,所以这个问题的答案直到大二的时候我才有自己的心得体会,所以也是因为这个脑子有坑的问题, 搞ACM也就没有时间了,所以leetcode一直是一个令我非常脑壳疼的问题。
不过接下来我们直接按照408的考试范围去深入浅出一下。我推荐的复习顺序:计算机组成(3天) -> 数据结构(5天) -> 操作系统(2天) -> 网络原理(2天),一共12天足够琢磨清楚考试怎么考了。


首先我们需要明白的问题就是,什么是计算机体系的根,其实就是一堆电路板子,如果各位会一点verilog的话,其实是可以造出来一个小型的CPU的,如果没记错这应该是EE的一个大作业。
在前面的工业计算历史中,我一直在强调的一个关键词:规则。
是的,当真的全部预习完408你应该也会有这样的感觉,规则在计算机的世界里无处不在,我来简单举几个例子。
1.二进制运算和原反补,是电路板子上的数据表示和处理规则
2.栈和队列,是线性表的一种特殊数据操作规则
3.虚拟内存和进程调度,是操作系统控制资源的规则
4.OSI七层协议中的各个子协议,是网络之间的通信规则

如果有学法律的小伙伴应该很清楚的知道,一堆法律法规都是查出来的,没有一个是背出来的,就好像我们的国家以宪法为核心然后出来了一堆各式各样的法律,那么计算机也是一样的,而计算机组成就是这个最原始的规则。

计算机组成

尝试回忆一下,组成中,一个存储器统领了整个计算机体系,我们可以通过位扩展字扩展字位同时扩展一起提升存储容量,当然也可以通过地址复用技术,直接把地址线给梭哈掉了一半。这个地方其实透露着串并联电路的玩法。然后有了存储器,就需要一堆电线把它和CPU连接起来,这堆电线也就是总线了,总线连接了CPU和存储以及外部设备,那么如何控制这堆设备和存储协调工作呢?这个时候是不是需要去了解一下总线仲裁了,目前我们已经有了存储和CPU还有总线了,按照存储程序的理念,好的,我们可以在上面执行一段程序了。
在我们执行一段时间以后,我们发现这个设计实在是太慢了,那么怎么办,我们首先优化CPU提升CPU的计算力,这个时候CPU流水线就出现了,将CPU的执行划分成了多个单元,然后进行流水线,只不过某些时候会出现一些冒险。
CPU的能力被优化了以后,那么存储是不是也可以优化呢?毕竟CPU跑的太快了,好了,那么你们在各种参考书,还有考试大纲疯狂划重点的存储器体系结构就出现了,这个东西,我目测今年要来一票大的。
当存储和CPU都被优化的差不多了以后,我们需要做一些边边角角的事情,为了在硬件层次上达成一个规则,我们需要指令系统,目前这些指令系统被演化成了X86、RiscV等等等,也被叫做指令集,这个地方主要是一些设计指令系统的工作,我们有多少条数据线,然后我们地址有多少,那么我们的一条指令需要有多少个单元,指令和地址如何分割一个地址单元,这个地方特殊强调一下,如果你看过这篇文章并且有幸混进了互联网大厂,那么在工作中进行系统设计的时候如果你还记得指令系统,只要稍微看一下自动机理论,你能设计出来非常scalable的系统。当然考研的话,这个东西不是很重要,前提是你对存储器学得非常明白。
然后呢,我们现在只能计算不能交互,很头疼,怎么办,I/O设备就出现了,我们的计算机硬件为了适应各种各样的外接设备,提出了各种各样的总线标准,至于怎么协调这些设备的,利用的是中断,至于怎么利用的,我们卖个关子到操作系统中去描述这个问题。
到这里,计算机组成这门学科的骨架已经被搭建起来了,这样复习起来还是非常快的。

数据结构

这门课非常的劝退,对于跨考的会非常不友好,因为其中蕴含了太多离散数学中的东西,而且出题是非常诡异的,我把整个王道系列刷了两遍,依旧不能达到一个很好的正确率,可能和大学没搞搞ACM有一定关系?而且从市面上我能找到的书和资料来看都没有找到专门用来考试的东西,我觉得王道在数据结构这个复习书上确实不太行,很多应试套路还得自己研究和总结。

好啦,先忘记组成原理把,我们来看数据结构,会被考到的数据结构:线性表,栈,队列,压缩矩阵,树,图。会被考到的算法,HashMap,KMP,Dijkstra,Floyd,Prim,Kruskal,Bin-Search,FastSort,TopSort,MergeSort,union-find algorithm,Huffman,BFS,DFS,我争取在最后三个月把所有的算法都写出来,并且用没有任何技巧的C语言重新实现一遍。

让我们再重新审视计算机组成,我们为了让一堆硬件和电路板子帮助我们计算,我们做了各种各样的设计,也定制了很多的规则,比如Cache一致性协议(双端口RAM),指令系统(MIPS),以及各种各样的东西,那么为了让他们在OS中能有良好的用户编程体验,现在我们需要把他们形式化成人能看懂的东西,一句话,对所有硬件的操作统统都可以看成是对某种数据结构的CURD。

比如我们的LRU缓存策略,可以通过双链表+哈希表来处理,这种应用在数据库系统内非常常见,可能各位看官老爷以后有人去做DB,那么BufferPool就是一大Cache。同样的计算机程序需要被编译,如何将C语言转换到汇编程序,其实需要用到一个HashMap去记录指令,而依据CPU流水线进行代码优化的时候自然需要用到Kruskal的贪心思想还有一些DP的思想。

数据结构在考试上来说,主要的工作就是找规律,做比较,比如顺序表和链表的优缺点,树上算法更多的是找规律,也是递归的应用。

这里简单谈一下我理解的递归吧,关于数据结构开篇第一条分析时间复杂度,时间复杂度并不是真实的时间,只是一个时间系数,这个时间系数内涵其实是,每一次循环处理后的问题规模缩小程度,递归的过程其实就是利用了一个栈后进先出的性质将原问题依次分解归拢收回栈中再依次弹出计算,最后栈中保留最后的结果时,计算就结束了。那么如何处理这种递归问题呢 ?首先我们要找到分支出口,也就是每个问题来了被分成了几个情况,几个情况的处理方式又是什么,如果是一个规模缩小分支,直接递归下降,如果是异常情况直接返回。

数据结构还是看个人的理解,这个东西没有什么固定答案,毕竟高德纳的圣经我也就是读过而已,所以也没啥特别的方法论,更多还是多看看算法题,多写写代码。

操作系统

还记得我们的计算机组成不,我们已经用一堆电路板子完成了某种特定类型的计算,那么是不是可以设计一个通用的电路系统并帮助我们计算更多类型的问题呢?答案当然是肯定的,要不也不至于研究出来OS了。

首先我们已经有了计算机组成中的指令系统,这里先给一个额外的知识,所有的硬件驱动其实就是对CPU中的某种指令的响应程序,计算机使用设备的过程调用的程序和CPU相关指令是一个面向对象编程的过程。

我们在拥有了指令系统以后,其实已经有了对整个计算机硬件的控制能力,那么现在就需要将这些控制能力给统一的管理起来,最原始的OS其实是计算机中的一个芯片提供的,目前这个东西还存在着也就是BIOS芯片,计算机通过BIOS引导到了真正的资源管理系统,这个真正的资源管理系统就是我们需要研究的东西。

在刚才的文章中,我们的所有设计都是单线程的,也就是我们的计算机硬件只能同时计算一个程序,但是现实情况是,我们的计算请求是并发的,也就是在一段时间到来了一堆需要我们计算的程序,怎么办呢?

在解决这个一群人过来抢饭的问题之前呢,我们先得研究一下怎么组成一个操作系统,操作系统被组织成了四大部分:进程管理,内存管理,文件管理,I/O管理。

我们得先关心一下为什么这么组织,进程管理的本质是将多个程序拆分成了多个时间片,然后操作系统在轮转调度,每一次调度一片在上面跑,形成了宏观上的并发,那么为什么可以这么做呢?是因为我们有了指令系统和CPU流水线的规则,以及硬件寄存器,帮助我们可以完成程序的调入和调出,所以这一大块是在帮助用户抽象计算机组成中的CPU。

然后我们来看内存管理,还记得计算机组成的存储器体系结构吧?我们在进程管理部分已经将程序拆分成了很多个时间片运行,只要程序一运行,那么自然需要消耗内存,消耗内存代表着我们在操作内存条子,所以只要支持并发的OS管理下的计算机的内存条子里是乱七八糟的,每个并发程序的一部分数据和指令都在上面,所以我们需要进行管理,但是在计算机组成中并不关心你并发还是不并发,只关心你用还是不用,你借出去还是还回来,只有简单的段页能力,这个是计算机组成自带的,不过很多的Kernel在这一块只是根据自带的指令完成一部分的内存和磁盘之间的数据通路,那么内存乱七八糟自然要打扫了,就好像面试中经常问的GC一样,操作系统的垃圾回收方式,也是简单的标记整理和标记清除两种算法,至于后来演化出的各种什么三色标记等等等都是以这两个为原型进化出来的。所以这一部分是在帮用户抽象计算机的存储器的体系结构。

文件管理,一句话就是管磁盘的,这个里面会用到数据结构的树的知识哦,如果考863没准给你们来一个手写文件遍历代码,这个遍历的算法就是DFS和BFS。

I/O管理,我记得组成里面我说了I/O这部分要拿到这里来逼逼,这里先回到计算机的设计初衷,计算机设计出来就是为了计算,那么最开始的计算机都是直接把程序扔进去,然后计算机去跑,但是随着需要计算的东西越来越多,主要是大家都需要抢地盘的家伙事,所以就需要进行程序的批量计算,最开始的I/O工作真的非常简单,就是一个操作员在那守着,一会换进去一个磁带算算,不过这个操作员也是一个Phd。然后人们觉得每次都用一个博士在那换磁带实在是太慢了,然后就彻底把这块抽象出来了。

用户的交互如何实时反映到计算机执行过程中,这个时候我们就依靠异步中断了,通过中断,直接向CPU发出一个信号,让CPU转来处理这个中断,把这个中断处理完了以后再继续执行,产生中断的原因各种各样。有的是用户中断,为了让OS陷入内核态去执行一些操作,在网络栈的实现上,OS中利用了大量中断的能力,去响应和处理网络事件,相信上了研究生以后你们玩网络编程的时候就有了解了。

到这里应该已经解释清除了,OS也是人写的代码,只要是人写的代码就需要操作和定义数据结构,只不过OS被用来抽象组成计算机的硬件而已。

计算机网络

我觉得如果前三科已经足够清楚了,那么网络原理真的就没啥了。

网络的重点不是那些有的没的的计算和定义,重要的是理解,网络中的核心部分就是协议,协议中的重要部分就是TCP/IP。

到这里我可以大肆地逼逼什么是协议了,目前我们已经捣鼓了三门基础课,我们会发现协议是一种规则,用来交换信息的规则,我们可以认为信号量是一种协议,是两个进程之间交换信息的工具,我们也可以认为存储器中的片选信号是一种协议,是协调多个存储芯片的工作的规则,当然我们也可以认为,OS中的中断和中断处理程序本身就构成了协议,这个考完研写点中断处理程序就懂了,需要用到系统编程的知识。当然我们依旧可以认为X86指令集也是一种协议,用来在OS和物理机器上进行信息交换的协议。

所以大胆地记住这句话,协议是用来交换信息的标准,不管是进程间通信,还是跨主机的通信,抑或是全网络的通信。都需要协议,而网络协议为了保证交换信息的顺序和一致性,也就提出了层层封装的概念,也就是我们的OSI的每一层都会包装上一个头,然后再把数据发出去,这个头用来标记元信息,理解的时候直接认为这玩意就是一个顺序号,虽然TCP还真有顺序号和TCP回绕,不过考试也不考。

我已经带着你们从组成到操作系统一层一层的把整个计算资源抽象出来了,接下来网络的从底层到高层的协议应该你们会分析了吧?

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值