第9章 进程、线程和DLL操作技巧
本章介绍了进程的相关概念和对进程的各种操作,以及进程间通信的方式。进程通常被定义为程序运行的实例,它一般包括两部分,即进程内核和进程地址空间。进程是不活泼的,若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进程的地址空间中的代码。线程的操作要注意线程对资源的同步和互斥的情况。最后阐述了动态链接库的创建及调用方式。
9.1 进程的操作技巧
在操作系统的教材中,都学习过程序和进程的概念:程序是一段代码,它是一个静态的概念,进程是程序的一次执行,它是一个动态的概念,进程具有生命周期,在其生命周期期间,具有不同的状态:新建、运行、阻塞、就绪和完成5个状态。在多任务操作系统中,可以同时运行多个进程,每个进程都有自己的虚拟地址空间。进程在自己的地址空间中修改数据不会影响其他的进程。操作系统为了识别不同的进程,为每个进程分配一个进程标识。我们如何去创建一个进程,如何在进程之间进行通信呢?下面将会解决这些疑问。
9.1.1 进程的概念
进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据,以及线程堆栈、堆分配空间等动态分配的空间。进程仅仅是一个存在,是不能独自完成任何操作的,必须拥有至少一个在其环境下运行的线程,并由其负责执行在进程地址空间内的代码。在进程启动的同时即同时启动了一个线程,该线程被称作主线程或执行线程,由此线程可以继续创建子线程。如果主线程退出,那么进程也就没有存在的可能了,系统将自动撤销该进程并完成对其地址空间的释放。
加载到进程地址空间的每一个可执行文件或动态链接库文件的映像都会被分配一个与之相关联的全局唯一的实例句柄(Hinstance),该实例句柄实际是一个记录有进程加载位置的基本内存地址。进程的实例句柄在程序入口函数WinMain()中通过第一个参数HINSTANCE hinstExe传递,其实际值即为进程所使用的基本地址空间的地址。对于VC++(www.cppentry.com)链接程序所链接产生的程序,其默认的基本地址空间地址为0x00400000,如没有必要不要修改该值。在程序中,可以通过GetModuleHandle()函数得到指定模块所使用的基本地址空间。
【责任编辑:
夏书 TEL:(010)68476606】