程序运行原理

  介绍一个网站,http://c.biancheng.net/cpp/html/3450.html很好的介绍了C,适合对C的学习和深究用。。。(C编程网,现在也在收费了!)

  一些免费的学习资源 :https://cloud.tencent.com/developer/article/1184830

1、一个程序在计算机中到底是如何运行的?

  程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令;

  对于CPU来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算功能,为了了解具体的运算过程,先看一下CPU的结构:

  CPU是一个复杂的计算机部件,它内部又包含很多小零件,如下图:

  

 

  运算单元是CPU的大脑,负责加减乘除、比较、位移等运算工作,每种运算都有对应的电路支持,速度很快。

  寄存器是CPU内部非常小、非常快速的存储部件,它的容量有限,对于32的CPU,每个寄存器一般能存储32位(4个字节)的数据,对于64位的CPU,每个寄存器一般能存储64位(8个字节)的数据。为了完成各种复杂的功能,现代CPU都内置了几十个甚至上百个寄存器,嵌入式系统功能单一,寄存器数量较少;

  我们经常所说的多少位CPU,指的是寄存器的位数;寄存器在程序的执行过程中至关重要,不可或缺,它们可以用来完成数学运算、控制循环次数、控制程序的执行流程、标记CPU的运行状态等。

  CPU内部为什么又要设置缓存呢?

  虽然内存的读取速度已经很快了,但是和CPU相比,还是有很大差距的,不是一个数量级的,如果每次都从内存中读取数据,会严重拖慢CPU的运行速度,CPU经常处于等待状态,无事可做。在CPU内部设置一个缓存,可以将使用频繁的数据暂时读取到缓存,需要同一地址上的数据时,就不用大老远的再去访问内存,直接从缓存中读取即可。

  大家在购买CPU时也会经常关心缓存容量,例如:Intel Core i7 3770K 的三级缓存为8MB,二级缓存为256KB,一级缓存为32KB,容量越大,CPU越强悍。

  缓存的容量是有限的,CPU只能从缓存中读取到部分数据,对于使用不是很频繁的数据,会绕过缓存,直接到内存中读取。所以不是每次都能从缓存中得到数据,这就是缓存的命中率,能够从缓存中读取就命中,否则就没命中。关于缓存的命中率又是一门学问,哪些数据保留在缓存,哪些数据不保留,都有复杂的算法。

  要想让CPU工作,必须借助特定的指令,例如 add 用于加法运算,sub 用于除法运算,cmp 用于比较两个数的大小,这称为CPU的指令集(Instruction Set)。我们的C语言代码最终也会编译成一条一条的CPU指令。不同型号的CPU支持的指令集会有所差异,但绝大部分是相同的。

  实际上,上面的代码是汇编语言,不是CPU指令,汇编语言还要经过简单的转换才能成为CPU指令;为了更加容易地说明问题,这些语句也没有严格遵守汇编的语法。有兴趣的同学可以自行学习汇编语言,这里不再展开讲解。

2、载入内存,让程序运行起来

  如果你的电脑上安装了QQ,你希望和好友聊天,会双击QQ图标,打开QQ软件,输入账号和密码,然后登录就可以了。那么,QQ是怎么运行起来的呢?
  首先,有一点你要明确,你安装的QQ软件是保存在硬盘中的。双击QQ图标,操作系统就会知道你要运行这个软件,它会在硬盘中找到你安装的QQ软件,将数据(安装的软件本质上就是很多数据的集合)复制到内存。对!就是复制到内存!QQ不是在硬盘中运行的,而是在内存中运行的。为什么呢?因为内存的读写速度比硬盘快很多。对于读写速度,内存 > 固态硬盘 > 机械硬盘。机械硬盘是靠电机带动盘片转动来读写数据的,而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。所以,不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据复制到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)。CPU直接与内存打交道,它会读取内存中的数据进行处理,并将结果保存到内存。如果需要保存到硬盘,才会将内存中的数据复制到硬盘。例如,打开Word文档,输入一些文字,虽然我们看到的不一样了,但是硬盘中的文档没有改变,新增的文字暂时保存到了内存,Ctrl+S才会保存到硬盘。因为内存断电后会丢失数据,所以如果你编辑完Word文档忘记保存就关机了,那么你将永远无法找回这些内容。

虚拟内存

  如果我们运行的程序较多,占用的空间就会超过内存(内存条)容量。例如计算机的内存容量为2G,却运行着10个程序,这10个程序共占用3G的空间,也就意味着需要从硬盘复制 3G 的数据到内存,这显然是不可能的。操作系统(Operating System,简称 OS)为我们解决了这个问题:当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中就会有一部分空间用来存放内存中暂时不用的数据。这一部分空间就叫做虚拟内存(Virtual Memory)。3G - 2G = 1G,上面的情况需要在硬盘上分配 1G 的虚拟内存。硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象,即使CPU强劲,也不会有大的改观。如果经济条件允许,建议将内存升级为 4G,在 win7、win8、win10 下运行软件就会比较流畅了。

 参考:《C语言和内存》(收费)

 

posted @ 2019-08-27 20:17  thinking~  阅读(2397)  评论(0编辑  收藏  举报