当前位置:C++技术网 > 资讯 > 如何深刻理解内存相关概念

如何深刻理解内存相关概念

更新时间:2017-04-07 19:27:32浏览次数:1+次

1、程序和数据在计算中内存中的存储形式一样吗?

 - 我们写的程序代码最后被翻译成一段机器指令,在内存中也是0和1吗?

 - 比如我在记事本中输入文字,它是暂时存在内存的,点保存才保存到本地硬盘。这两者的本质区别再哪里?仅仅是多一步操作,然后操作系统就把内存的复制到硬盘吗?


2、关于一个应用程序的详细过程是什么?这样理解对吗?

 - 以QQ软件举例,下载好的安装包(我理解为一个数据集合)是都存在本地硬盘吗,这个过程是不是跟内存没有关系;

 - 运行安装包会产生什么?程序包(程序基本需要的文件)、可能的dll文件(供操作系统调用)、注册表文件..这样理解对吗,还有别的吗?这个过程中所有产生的数据都是保存在硬盘中吗?

 - 启动qq时的过程是怎么样?将硬盘中的数据复制到内存,CPU调用(这些过程是操作系统指挥的吗)、CPU处理机器指令反馈给操作系统、操作系统发消息给应用程序窗口、显示出来。主要想知道双击图标到窗口显示这中间发生了什么?


首次提问,想法有点杂乱,望有空时帮忙解答一下,十分感谢!


C++技术网会员解答:

    您好,感谢您对C++技术网的信任和支持。

    我们就根据你提的问题,一个个的详细解答吧。

1.程序和数据在计算机的内存中的存储形式一样吗?

    不管是在内存,还是CPU,还是在硬盘,还是在网络上,还是在U盘里,所有处理和存储数据的地方,不管是数据还是指令或者我们说的文件还是程序,都是二进制的。为什么呢?因为我们现在的计算机都是冯.诺依曼体系的计算机。冯.诺依曼体系的计算机也就是基于二进制的计算机。不管是存储还是计算,在硬件上都是以二进制的方式来表示的,否则计算机将无法识别。而内存是临时存储数据的,CPU是计算数据的,硬盘U盘等磁盘是永久存储数据的。它们的设计都是基于二进制的设计。那么二进制到底是什么样的体验?二进制也就是两种状态,正或者反,有或者无,多或者少,阴或者阳等等。只要是这样的,都可以当做二进制,可以用来设计冯诺依曼计算机和配件。我们的内存的存储单元,是基于电容的电量的容量是否有电荷或者说电荷是否超过一半来得到两种状态。这两种状态就可以作为二进制。因为电容电荷在有电的情况下可以保持状态,在没有电的时候,电荷全部丢失,所以内存中的数据就会因为掉电后全部归于一种状态,即没电。既然所有状态都是一样了,不就等于没有数据了。这也就是内存只能临时保存数据的原因。但是如果内存永久有电,当然也可以永久存储,不考虑寿命问题,理想的假设。

    有了上述的基础理论解释,我相信你的问题你也就迎刃而解了。不过我还是针对性的解释下。不管是数据还是指令,在计算机底层中,都是01二进制的形式。计算机的系统就是基于二进制构建起来的,一层层的抽象,最终得到我们看到的计算机。如果你说的是底层内存的表示,那么都是01形式。如果高一些层面,那么机器指令在内存中和数据是一样的,都是一堆01组成的数据而已。指令只要没有被执行之前,和数据没有两样。数据和指令的差别在于如何去对待他们,如何去解释他们。如果大家都将你当做将军,你就是将军了。如果大家都当你是平民,你就是平民了。你的本质其实都是一样的。就是这个道理。

    记事本运行的时候,输入的文字是暂时留在内存的。如果保存了就写入了硬盘。将存储在内存中的内容转入到硬盘,对我们而言的内容是没有变化的,变化的是存储形式发生了变化。硬盘是磁性介质存储数据,所以在存储形式和内存的电荷形式不一样。磁性介质的状态可以长期保存,所以硬盘之类的设备也就被当做了永久存储数据的装置了。而磁性的介质,自然也可以有两种状态,磁极方向等,具体如何都无所谓,只要能够达到两种相对的状态都行。我们复制的是对人来讲的逻辑的数据,也就是这段我们能够认识的文字,用不同的形式保存了而已。从而将临时存储的变成了长期存储。


2.关于一个应用程序的详细过程是什么?这样理解对吗?

   只要是在电脑显示操作的东西,都和内存脱不了干系。计算机的CPU要处理数据,没有内存CPU就没有数据可以处理了。这里不考虑CPU缓存。我们下载安装包的时候,CPU要处理接收到的数据,自然需要内存来存储临时数据。然后将数据存储到硬盘。

    安装包其实本身就是一个程序,运行安装包就是安装程序。只不过这个程序会释放自身携带的各种数据,会将这些数据释放为各种文件,存放在硬盘中。而这些释放的文件也就是被安装的程序以及这个程序需要的文件。比如QQ安装包,运行后,就是QQ这个主程序,以及和QQ相关的各种程序、动态库、配置文件和数据文件等,然后操作注册表注册程序。这些都是安装包程序执行的动作而已,不同的安装包不一样。当然,所有的文件都是存储在硬盘的。

    而启动QQ的时候,就是运行QQ软件。QQ程序本身就是要给文件,系统的程序加载器(加载程序到内存运行的程序)会先将程序映射加载到内存里,程序不就是一堆指令嘛。然后CPU去执行QQ程序的指令,也就是QQ程序在运行了。然后QQ程序的指令还会去加载更多的程序和数据等。不同的代码功能也就是不同的指令,产生不同的效果。对于界面程序,会调用系统的GDI系统来绘制界面,然后系统会将绘制后的界面显示在屏幕上。

    双击图标是系统给我们用户的一种交互方式,当我们双击图标的时候,系统就知道我们要启动这个程序。就会将程序加载到内存,然后CPU会执行程序里的被编译后形成的机器指令。这个只能大概这么说,不是一句两句能够说的清楚的。不够这样解释之后,你会有点印象。

    能够看得出来,你对计算机挺感兴趣的。这些都是计算机核心的理论知识。推荐你去学习相关的理论课程,这样你就可以全面的理解所有的过程。

    对于内存、CPU、主板、硬盘等工作机制的了解,请学习“电子电路”和“计算机组成原理”。如果要对程序的工作机制进行深入学习,请学习“计算机操作系统”。这些是计算机专业核心的课程,所以不是我一两句能够介绍的清楚的。

    以上的解答,已经尽可能的浅显易懂了,解释也非常的全面了,至于深度,那需要自己去看书,深入学习了。如果有其他问题,可以放心提问。