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

大数据

文|Raynor

计算机组成原理

这门学科告诉你什么是计算机。

首先,我们可以把计算机分解成最原始的部件——晶体管。晶体管是一种半导体材料,其最重要的作用就是半导:可以通过电流的变化,实现电路的切换。比如计算机最基础的与或非运算,都可以通过晶体管组成的电子元件实现。而通过晶体管的电位差不同,就可以体现”二进制数据”,即0和1。再加上电容和电阻,就能把这种二进制数据临时保存起来。

综合这些特性,大牛们发现把晶体管用作精密的数学计算,可以极大的提高运算的效率。比如我有2个电容,分别是充满电和没有电,对他们同时释放电信号,电容就会把其中的电子放出来,经过特定的逻辑电路,如与门,得到了0的结果。要计算1+1,实际上也是类似的原理。我先设计一个加法电路,把若干电容组合成的”数字”流过这个电路,把结果存入目标电容,就得到了结果。大规模的复杂运算以此类推。

最早期的计算机真的就是用许多结晶体管实现的复杂电路结构,通过控制输入电流得到希望的输出结果。后来人们发现,这种计算可以用某些形式抽象成多种指令,不用针对每次计算设计复杂的电路,只要调用指令就可以实现任何一种计算组合,于是诞生了cpu。只有cpu,每次都要自己配置输入信号,实在太痛苦,就做了纸带输入给计算机。后来又发现纸带还是很麻烦,于是发明了输入终端和对应的存储设备。后来又发现很多数据要临时保存起来,供连续计算使用,于是发明了内存。再后来pc的发展经历了无数次的变革,让计算机一步步到了今天的地步,也就是你现在看到的这样。其中的历程非常曲折,也许有机构能够把他们全部组织成一本漫长的历史,但个人肯定是无能为力的。

操作系统

综上所述,计算机发展到一定程度,什么东西都靠人工也未免太累了。

比如通过输入设备组织指令给cpu去计算,你希望能够找一个快速的输入设备(比如键盘),在能看到结果的地方输入(比如屏幕),然后再用很方便的方式提交给cpu(比如按键或者指令),让cpu去算好了,再把结果展示出来(比如屏幕)。

理想很美好,但是这么复杂的流程,人工管理起来不还是很麻烦吗?除非我构造一个设备,把这些所有设备都管理起来,于是主板就诞生了。

现在主板解决了我们大量的问题,但是我发觉我的需求还远远不够!

我希望我写过的程序能在任何一台机上运行。

我希望我能边听音乐边干活——即同一时间可以运行多个程序。

我希望别人写的傻×东西不要影响到我的工作——即多任务控制。

我希望计算机里面的各种资源都能得到良好的组织,更快的访问。

我希望我的用户界面更好看,使用更方便,功能更强大!

我是个小白用户,啥都不懂,别跟我扯这些有的没的,我就像随便操作两下就能达到我想要的!

如果这些需求全部都做在主板bios里面,那将是一场灾难!除非bios经过极大的调整和改动,划分出一大块区域存放操作系统,并且完成复杂的体系结构改革。

计算机发展到这种程度,早就已经有很多的机构和厂商介入其中,试图从中渔利。他们当然不会求着计算机标准委员会和主板生产厂商去做所谓的主板改革,而是编写自己的程序——操作系统,来解决这些所有的问题。

而操作系统问世之后,一方面接管了主板对于系统资源的管理,加入了自己的中间层——驱动程序,另一方面又充分发挥了人机交互的接口——gui界面,成为了计算机必不可少的组成部分。

操作系统通过bios引导,即作为应用程序开始运行。我们知道程序的本质上就是在cpu上运行种种指令,比如操作系统需要把硬盘上的模块放入内存,实际上就是运行了一系列复杂的cpu指令,cpu指令通过主板bus(实际上就是传递指令的电路)发送指令给硬盘(比如从哪个扇区偏移多少读多少数据),硬盘再通过芯片组转动磁头,把数据读到缓存中,完成后给cpu发送一个信号(即中断),cpu收到这个信号,就在寄存器中寻址该信号对应的地址(即我们说的中断向量表),运行该地址中的指令,发现该指令是发送拷贝指令给主板芯片组,主板就会在cpu的指导下不断的发送信号,告诉硬盘缓存放电,再把接收的电信号存到指定的内存位置去,如此反复,直到完成cpu的一系列指令为止。

操作系统说白了,就是这样通过种种cpu指令,实现自身的所有功能。当然这些指令也不是一条条写进去的,而是通过编程语言完成人类较容易识别的逻辑,然后再通过编译器把这些逻辑翻译成cpu指令,这就涉及编译原理的东西了。

既然操作系统对硬件的访问都是通过cpu指令来完成的,那为什么大家都感觉是操作掌管了硬件呢?这就涉及操作系统最本质的功能之一:对系统资源的管控了。

我们运行的所有程序,实际上都是操作系统帮我们运行的。操作系统背后进行了很多的工作,如虚拟地址空间的分配,cpu分时调度,硬件中断信号的响应等。这样对于硬件资源的访问,也是通过操作系统安排的。比如操作系统会通过把短时间内硬盘读写合并成顺序的方式,以提高磁头的利用率,降低磁头转向的时间。再比如对内存地址的访问也是由操作系统管控的,某个程序中的内存地址具体落到内存条的哪个位置,还是硬盘中的虚拟内存,就看操作系统的心情了。

至此,操作系统和硬件的交互也介绍的差不多了,更详细的东西建议参考操作系统相关的书籍吧,比如《深入理解计算机系统》,《linux内核设计与实现》,《unix环境高级编程》之类的。

数据结构

数据结构的作用,就是为了提高硬件利用率。

比如操作系统需要查找用户应用程序”office”在硬盘的哪个位置,盲目的搜索一遍硬盘肯定是低效的,这时候搞个b+树作为索引,搜索office这个单词就很快,然后就能很快的定位office这个应用程序的文件信息,再找到文件信息中对应的磁盘位置了。

数据结构的东西找本《算法导论》,《数据结构与算法分析》之类的看吧。

计算机网络

计算机网络分为3块:
1. 硬件

网卡,网线,交换机这些,用来处理数据的。

2. 协议

数据在网络中通信如何组织?如何识别?如何保证数据的正确性?
这2块我就不多说了。

3. 操作系统

这就是如何把计算机网络和操作系统结合起来的问题了。

对于操作系统来说,网卡也是一种硬件资源。但是网络不单只是一种硬件,而是一种媒体入口。比如操作系统管理硬盘,当然不是简单的记一下硬盘有多大,然后一切操作都交给硬盘芯片去做,更多的需要组织硬盘的扇区,分区,记录文件和扇区/偏移的关系等等。

操作系统对于网络来说也是如此,要记录自身在网络的标识(ip),可被他人访问的入口(port),以及对方的信息(remote ip/port)。连接,断开,数据确认等操作也是由协议控制。

传递自身消息给对方,类似访问硬盘一样把内存中的数据传递给网卡缓存,再发消息给网卡让网卡去传数据,而是否发送成功这些保证不再由硬件中断信号反馈,而是通过网络协议完成。接收对方消息,也是接收到网卡中断,再把数据从网卡缓存移动到内存中,再通过协议给予对方反馈。