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模块,以便共用一份代码和数据。但这将使程序模块的划分变得非常复杂,并且难于管理,在实际的开发过程中很难行得通。
相关参考:什么是动态链接?
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模块,以便共用一份代码和数据。但这将使程序模块的划分变得非常复杂,并且难于管理,在实际的开发过程中很难行得通。
相关参考:什么是动态链接?