当前位置:C++技术网 > 资讯 > 程序内存以及CPU运行机制理解:CPU使用时间、内存大小、二进制的意义

程序内存以及CPU运行机制理解:CPU使用时间、内存大小、二进制的意义

更新时间:2016-08-14 23:42:50浏览次数:1+次

一直都有听说内存这个东西以及二进制,但是还是不是非常理解它们之间的关系以及与CPU之间的关系。感觉理解得非常模糊,比较无语。在做编程的题目的时候我总是不知道是不是代码越短CPU所用的时间越短?好像事实上不是的。那么,和什么有关呢?还有,编程时内存的使用又和什么有关呢?是和变量多少有关吗?还是和什么有关?

C++技术网解答:

    CPU是执行计算机指令的硬件,内存条是运行程序时存放数据的硬件。程序也就是指令的序列,每一条指令都是在CPU中执行,这样程序跑起来,才表现出所谓 的功能。而在CPU内部,每次都是一个简单的指令而已,在CPU内部,CPU自己并不知道这一条指令参与实现什么功能,反正只要执行就行了。

    而内存,因为读写速度非常快,与运行速度很快的CPU相比,比较相配,所以CPU就和内存配合起来工作。想想,一个做事很快的人和一个做事很慢的人配合, 做事快的,一下子就做完了,就只有等慢的人慢慢做好,才可以做下一件事。这样会严重做事快的人的才能的发挥,因为大量时间花在等待中。那么CPU也就是做 事很快的人,硬盘就是很慢的人,不是一个层次的。

    CPU只执行指令,不存储指令,所以指令需要在一个地方存储,既然硬盘这类设备速度跟不上,所以就找到内存,可以存储,而且速度很快,和CPU天生一对。 然而内存因为记忆力不好,断点就忘了一切,所以长久保存数据,还是要硬盘。所以写好的程序以文件形式永久存储在硬盘中,然后需要执行的时候,加载到内存。 程序要执行,也就是程序中的指令都要进入CPU执行。因为已经将程序加载到内存,所以内存在有电的时候,可以存储程序的数据和指令,就可以和CPU一起工 作了。

    这就是CPU、内存和硬盘三者的互相依赖的关系。

    在计算机整个体系中,所有的设备处理数据,存储数据都是以二进制存储的,也就是0101的序列形式存储。为什么是二进制呢?这是冯诺依曼的计算机体系。冯认为,世界上所有的东西都可以用01来表示,也就是我们现在用的计算机了。所以,硬盘中存储的数据、内存中读写数据、CPU中执行指令都是二进制。二进制是计算机的数据表示根基,如果一个计算机不是基于二进制的,那么他就不是现在的计算机,而属于一种新计算机。不过目前来看,二进制计算机可以满足绝大多数需求。不过,二进制计算机性能还是不够强,现在量子计算机就在一些领域开始发挥作用,不是基于二进制的。

    二进制在底层的表示,是硬件的两种状态来表示的。比如存储单元有电表示为1,没有电则表示为0,当然反过来也行,只要两种状态表示0或1就行了。在处理数据的时候,CPU利用时钟产生的电压脉冲来和内存保持通信,高压表示1,低压表示0,当然反过来定义也行,只要两者保持一致就行。反应在底层,就是电子电路的状态的变化,导致一系列状态的变化。这个可以去学习数字电路,你会有更加深入的认识的。

    所以,在硬件上实现了二进制的表示和操作。上层为了方便操作,然后将二进制转成十六进制、八进制、十进制来处理,毕竟这样我们人类好理解好接受,而且二进制表示的数字和我们人类常用的十进制差异太大了,也不直观。二进制数字,通常都很长哦。

    而代码长度和CPU所用的时间没有直接关系。这要看你的代码所产生的机器指令有多少。越高级的语言的语句,最后翻译为底层的指令,会得到好几句的机器指令,有的指令执行会很快,比如数值运算,直接在CPU中就可以执行完。有些指令需要到内存读写数据,这样就需要和内存打交道,通过脉冲信号来让内存的存储单元通信,实际上就是通过电子电路来让内存单元充电放电,来改变内存单元的电量的状态,这样就改变了对应的内存位置的电量状态组合,也就是改变了01序列组合,也就实现了数字的运算。因为涉及到内存的读写,所以比纯数字运算花的时间要长。还有时候,会涉及到硬盘的读写,因为硬盘读写速度比内存CPU慢的差的是数量级的关系,所以一条IO硬盘读写之类会花很长的时间,IO读写之类的指令也就是文件操作之类的。如果是网络操作的,那就更慢,网络传输速度不好,所以你懂的。

    所以说,代码的长度和CPU执行所用的时间没有直接关系,而是要看生成的指令的类型。一般来说,数值运算比内存读写快、内存读写比硬盘读写快,硬盘读写比网络操作快。数值预算也就是加减乘除之类的语句,内存读写也就是赋值之类的,硬盘读写也就是文件操作之类的,网络操作也就是Socket之类的。大致也就是这样的一个分类。

    内存的使用也就是内存占用大小问题。不同的数据类型编译器实现的内存大小不一样,内存越大,也就是可用的内存字节数越大,这样最后拥有的比特位越多,好比手指越多,能够表示的数字也就越多,所以内存大的数据类型能够表示更大的数值范围等。变量只是一种类型得到的一个具体化的实例。变量占用内存的大小是要看类型的。

    当然你也可以直接申请内存,也就是申请堆内存,内存越多,也就可以存储更多的数据,每一个变量占用一些字节,你得到的字节数越多,也就可以存储越多的变量,这样记录和处理的数据也就越多。比如你用一个字节可以表示一个人的信息,那么1KB就可以表示1024个人的信息。

    所以,大致上,整个关系也就是这样了。如果还有不清楚的,请在文章底部留言。