从代码上看程序生死周期(生死循环,生命周期)(转)

要]从你双击exe文件到系统又去调度其他进程运行,这个过程经历了加载器加载程序,系统创建进程线程,然后启动运行时库执行,运行时库引导执行到main函数,然后执行你写的代码逻辑,然后退回运行时库执行,再退回加载器执行,加载器执行完毕。最后又回到了系统的调度程序执行。这个过程,就是一个程序的生死周期,也就是程序的生死过程。当你在双击exe文件,又会开始一轮循环。如此就是程序的生死周期了。
文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。
前面的几节课中,我们已经简单的介绍了第一个程序的基本知识框架。这些东西是我们在后面代码中经常使用的,我想你应该清楚了吧。
循环周期动态图
好的,那么我们现在来看看这个程序的生命周期。生命周期这个词,看上去很高大上,通俗点说就是一个程序的生死。那什么叫做程序生,什么叫做程序死呢?
这里在代码方面来阐述一下程序的生和死。程序运行于CPU中存储于内存中时,才表示程序是活的。当程序执行完毕退出后,就从CPU撤出执行,也从内存中撤出存储的东西,这样程序就死了。
在系统使用方面来看,我们双击exe启动一个程序,然后操作exe完成一些工作,然后关闭退出程序,然后就找不到这个程序的进程了。这样程序就经历了一个生死周期。exe文件是程序的物质基础,exe里存储了程序运行时需要的代码和数据,但是这个文件本身并不代表程序,只能说是程序文件。只有这个文件被系统载入内存,被执行了,exe文件里的数据就在内存和CPU中活跃起来,这样就产生了一个程序活体。我们看到的程序,都是活体,否则我们根本就不知道程序的样子。
我们写代码,生成程序文件时,编译器等就根据我们的代码,根据设定的生成规则,将代码编译链接创建了一个exe文件。而exe文件里的代码数据都是可以给计算机执行的格式。所以,以前的病毒经常在exe文件中嵌入一段代码,这样在exe文件被执行后,病毒代码就被当做正常代码执行,结果电脑中毒了。
exe只是一个扩展名,和txt扩展名类似的。一般的文件,叫做数据文件,比如1.txt、1.doc,这些文件用来存储数据。而exe文件也可以说是一种特殊的数据文件,它的数据就是计算机执行的指令和执行需要的程序数据。不过,系统把exe这类文件当做可执行文件,有特别的对待。我们双击txt这类文件,系统根据扩展名来启动关联好的程序,从而来打开这个数据文件,显示数据内容。而双击exe文件,则默认启动系统的程序加载器来打开exe文件,不过,exe文件的数据并不是给我们人看的,而是加载进内存,给CPU执行的。所以,我们双击exe文件叫做执行程序,而不叫打开文件。系统给exe文件默认的行为就是执行。如果你将txt这类数据文件设定执行权限,那必然是有问题的,基本就是病毒等不良公民,系统是不会让它运行的。
我们在双击exe文件之后,系统启动程序加载器,将exe文件的内容加载到内存,有的小exe文件数据会一次性加载到内存,而很大的exe程序,则会根据情况先只加载需要的一部分,然后根据情况再加载。
在加载到内存后,要为它创建一个进程。进程是程序文件数据在内存中的存在空间,这个进程空间就是内存中分配给这个程序的一段空间。这一段空间可以存储这个程序文件的数据和代码。
更准确的说,加载器会先分析exe文件的合法性和需求,如果满足要求,则会启动对应的运行时库。运行时库就是系统执行一个程序代码的中介。
加载器创建进程和启动运行时库,而具体引导代码执行到入口函数则由运行时库来完成。因为一个系统的程序可以由很多工具编写,不同的工具,格式有所不同,C、C++、C#等,都是不一样的。所以,系统设计者不会傻到去在系统级别将自己固定为一种开发工具生成的格式的,这样会极大限制了系统的可扩展性。如果限制了开发工具,那么系统中的软件数量就会很少,从而系统竞争力就不强了。扩展性也不好,对系统发展不利。而系统给运行时库提供标准的接口,需要的话,系统就可以顺利执行对应的运行时库,不同的运行时库都很清楚他们自己的程序格式。C++运行时库

C语言程序的C运行时库,C++语言程序的C++运行时库(如上图所示)等,这些运行时库需要提前安装在系统中,系统才会在分析到一个对应的程序时去启动这个运行时库,否则就无法执行这个程序。比如说你的系统没有安装C++运行时库,而你的程序又没有自己带上这个库,那么系统执行时就无法启动运行程序。相信这个很多人都遇见过,只是不知道怎么回事罢了。
运行时库执行时,系统已经创建好了程序的进程和主线程。这一部分的内容可以参开《Windows零基础入门:1.7 程序如何执行和程序入口知识》。然后程序执行到了main函数。然后就是执行我们写的代码逻辑了。当我们的代码逻辑执行完毕后,main函数执行完毕,这样,执行流程退回到了运行时库的执行,然后运行时库做好清理工作,最后再退回系统的加载器程序执行,这样一次程序从加载到最后加载器执行的结束,就表示了程序的最终结束。系统的调度程序再根据调度算法,安排其他进程运行。
那么从你双击exe文件到系统又去调度其他进程运行,这个过程经历了加载器加载程序,系统创建进程线程,然后启动运行时库执行,运行时库引导执行到main函数,然后执行你写的代码逻辑,然后退回运行时库执行,再退回加载器执行,加载器执行完毕。最后又回到了系统的调度程序执行。这个过程,就是一个程序的生死周期,也就是程序的生死过程。当你在双击exe文件,又会开始一轮循环。如此就是程序的生死周期了。
循环周期
这部分内容,比较抽象,如果你有问题,一定要提出来,我再根据个人情况再回答。不过,这一节就是了解一个基本流程,明白我们写的代码在哪个流程执行,知道自己所处的位置,而不会陷入盲目之中。如果发现讲述不准确或者有问题的地方,请一定要告诉我哦。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值