一,一般将进程定义成一个正在运行的程序的一个实例,有以下两部分构成:
(1)一个内核对象,操作系统用它来管理进程。
(2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据,还包含动态内存分配,(比如线程堆栈和堆的分配)
二,进程是有惰性的。进程要做任何事情,都必须让一个线程在它的上下文中运行。该线程负责执行进程地址空间中包含的代码。一个进程可以有多个线程,所有线程都在进程的地址空间中“同时”执行代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。对于所有要运行的线程,操作系统会轮流为每个线程调度一些CPU时间,它会采取循环方式,为每个线程都分配时间片,营造出所有线程都在并发运行的假象。
三,Windows应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。有以下连个入口点函数:
Int WINAPI _tWinMain()
int _tmain()
四,进程实例句柄
加载到进程地址空间的每一个可执行文件或者DLL文件都被赋予了一个独一无二的实例句柄,可执行文件的实例被当作WinMain函数的第一个参数hInstance传入。WinMain的hInstance参数的实际值是一个内存基地址,系统将可执行文件的映像加载到进程地址空间中的这个位置。
五,进程的命令行
系统在创建一个新进程时,会传一个命令行给它。用于创建新进程的可执行文件的名称是命令行上的第一个标记。
六,进程的环境变量
每个进程都有一个与它相关的宦静块,是在进程地址空间内分配的一块内存。
VarName1=VarValue1\0
获取环境变量的方式:
调用GEtEnvironmentString函数获取完整地环境块。子进程会继承一组环境变量,这些环境变量和父进程的环境变量相同,子进程和父进程并不共享同一个环境块。
七,进程当前所在的驱动器和目录
不提供完整地路径名,各种Windows函数会在当前驱动器的当前目录查找文件和目录,系统在内部跟踪记录着一个进程的当前驱动器和目录,由于这种信息是以进程为单位来维护的,所以若进程中的一个线程更改了当前驱动器或目录,则对于该进程中的所有线程来说,此信息被更改了。
八,CreateProcess函数
一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构—可以把进程内核对象想象成由进程统计信息构成的一个小型数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件的代码及数据加载到进程的地址空间。
然后,系统为新进程的主线程创建一个线程内核对象,线程内核对象也是一个小型数据结构,用它来管理这个线程。
ID为0的进程是“ 系统空闲进程”
九,终止进程的方式:
(1)主线程的入口点函数返回
(2)进程中的一个线程调用ExitProcess
(3)另一个进程中的线程调用TerminateProcess
(4)进程中的所有线程都“自然死亡”
进程在终止后不会泄露任何东西