计算机结构

自从第一台计算机诞生到现在,计算机在计算,通信,交通,娱乐等方面展现出了强大的生产力,那么是什么赋予它的能力呢?下面是我对计算机的个人理解。

在计算机领域两个伟大的先驱不得不提,一个图灵,一个冯诺依曼。图灵解决了如何完成任务的方法。他将任务分成数据流和控制流,数据流在控制流的指引下得到最后的结果。这个在今天方案解决工程中依然适用,数据流就是我们常用的数据结构,而控制流就是算法。冯诺依曼提出了由运算器,寄存器,高速总线的计算机结构影响深远,至今的计算机逃脱不了这种架构。而GPU,CPU、DSP以及其他智能硬件都是对其中某项或者某几项的改进和优化。

随着半导体相关技术的发展,计算机计算速度和存储速度容量都发生了巨大变化。神奇的摩尔定律(当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍)指引了在半导体行业发展中的规律。如今,运算处理器已经可以实现多核GHz的运算速度,理论上来讲中央处理器每秒可以执行10^{10}量级,这种处理速度远远超过人的处理速度。这正是计算机强大的根源之一。

计算机若想体现自身的价值,必须开发出相应的软件。那么正常的软件程序是如何在计算机上运行的呢?

计算机底层是只识别0和1数字的。而中央运算单元根据需求编码出一套指令,操作系统根据指令提供了API,编译环境开发者对这些API封装得到SDK,那么软件开发人员就可以根据SDK进行软件开发。从计算机向上看是一层层的封装。而计算机的执行过程正好是这些过程反过来。

所以,首先软件开发人员需要将任务翻译成代码也就是编辑过程,这个就涉及到数据结构的合理设计(类的高内聚低耦合),算法的选取(空间和时间复杂度)等等。

其次,编辑好的软件需要开发环境的编译。在这其中还要涉及到程序的预编译(c语言中是将宏进行替代),开发环境需要按照文件为基本单位对代码进行翻译,翻译成汇编语言,每个文件编译后得到对应的目标文件。

再次,链接。编译是以文件为基本单位进行的,编译好的目标文件可能包含其他文件命名的变量或者函数,在这个过程中需要将各个文件进行链接(在Linux系统中是通过make文件来完成)最终链接形成可执行文件。静态加载动态库时,将动态库的代码拷入到可执行文件中,最终形成的可执行文件比较大;动态加载时,这里只记录函数地址,形成的可执行文件较小,这样占用内存少,是目前比较流行的方式。但是动态加载需要进入动态库加载函数,可能会增加调用时间。经过这一步我们就完成了一个程序了。

剩下的是执行部分。以下就具体解释下执行过程。

那么程序是如何变成进程的呢?

首先,通过双击图标或者其他方式(开机启动注册表或者其他进程加载)将程序进行加载。此时操作系统为进程创建一个进程控制块,放入到cpu任务队列中,此时程序就进入了就绪态,等待cpu来执行,进程的执行顺序可参考我的另一篇文章任务调度。是否将程序加载到内存中根据操作系统不同而不同。这里加载是根据虚拟内存4G空间位置(该位置固定)  进行地址映射到实际物理地址,具体可参考我的另一篇博客内存管理。

其次,进程条件满足时,cpu将执行该进程,进程进入运行状态。此时,控制寄存器将根据地址寻找到对应的代码和数据放入到指定的寄存器或者其他等级的高级缓存中。运算器将从这些寄存器中执行运算,并将结果放在另外指定的寄存器中。如此循环执行。

再次,当进程条件不满足时或者有更高级的进程抢占CPU时,当前进程将被保存进入阻塞态,直至下次条件满足时cpu执行。此时内存中该进程的数据有可能被操作系统中放入到磁盘的SWAP区(windows系统常常叫虚拟内存,实际是不准确的)。

最后,当进程执行完毕或者遇到强行终止的状态时,进程就进入终止态。此时将从内存中将进程的相关数据移除。整个进程结束。

此时,就完成了人类语言到机器码的过程,再到实现过程。具体到具体应用上,计算机能够按照这个结构实现对复杂模型的快速运算,对大型系统的实时控制。然而这些模型和系统都是人类按照一定规则计算好的,计算机做的不错的是在数据传输这块。现在的人工智能想让计算机完成自我指定规则(大数据)或者想让计算机按照某种特定规则泛化(深度学习)来完成任务。那么在现有框架下是否能够完成呢?语音识别,图像识别在深度学习的训练下已经提高了很多精度,能否在其他方面也有所拓展呢?

发布了42 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wangyhwyh753/article/details/89455335