Windows程序运行机理总结

  1。程序是一种静态的概念,指的是由exe或者dll组成的静态数据和代码。进程是程序的执行,相对的是一种动态的概念。

2。程序运行时,也就是一个进程被启动时,操作系统将程序代码加载到内存中,并且为程序提供4G连续的虚拟内存空间,但是实际上并没有这么多物理内存,所以需要进行代码和数据的重定位,最后CPU从内存中获取数据和指令并执行。至此,进程被动态的执行。

3。进程的地址空间被分配后,被划分为数据空间和代码空间,数据空间为静态数据空间,动态数据空间,堆栈空间。

4。操作系统对数据空间分配各自实际的内存,对代码空间是用共享手段,即相同程序的第二个进程共享第一个进程的代码空间(这样第二个进城就不需要再分配代码空间了)。

5。exe具备进程空间,dll 不具备进程空间,所以dll 如果不被exe调用并映射到内存中(即加载到进程空间和重定位过程),是不会被执行的。其中exe对dll调用,是通过引入表和引出表来实现的(包含在exe和dll文件的表头信息中),当需要调用dll的时候,才将dll加载到内存中,从而实现动态链接的过程。

6。内存区域各有各的用处。静态数据区域就是你定义的全局变量、常量、线程变量等生存的地方。动态数据区就是你动态分配的数据空间和动态创建的对象生存的地 方。堆栈区既为子程序调用提供保存返回地址的空间,又为局部变量、参数变量和返回值提供临时空间。代码区是存储程序指令的区域,CPU是从这里提取指令来 执行程序的。

7。
对于静态数据空间,每个进程都有自己的全局变量副本。对于线程的全局变量,当线程创建时,Windows系统会在进程空间中为这个线程开辟两块内存区域。一块是相对于该线程的全局静态数据区域,一块是线程运行所需的堆栈区域。其中,堆栈区是线程运行必须的基本设施,和线程密切相关不可分割。一个线程一定会有一个堆栈,而一个堆栈一定 对应一个线程。一个线程释放之后,其相关的静态数据区和堆栈也就消失。

8。对于动态数据空间,对象的实例都是存放在动态数据空间。

9。对堆栈空间,存储局部变量,参数变量,返回值,所以注意在递归调用的时候,每次调用都会在堆栈中开辟一批相似的局部变量,参数变量和返回值空间,这会使堆栈空间消耗得很快!

10。对代码空间,
通常,应用程序是由多个物理文件模块组成,典型地由一个EXE模块和若干DLL模块构成。在编写模块程序的时候,总有一 些单元是共用的。共用的单元既在一个模块的编译项目中被引用,又会在另一个模块的编译过程中被引用。令人遗憾的是,模块间共用单元中的代码和数据,将被编 译在每一个引用过该单元的模块中。应用程序的这些模块被加载到进程空间中时,该单元的代码指令和数据将存在多个副本。虽然,我们可以将共用的单元文件独立出来,再编译成为一个DLL模块,以便共用一份代码和数据。但这将使程序模块的划分变得非常复杂,并且难于管理,在实际的开发过程中很难行得通。



相关参考:什么是动态链接
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值