详细介绍windows系统下创建进程、线程的过程 |
本文标签:windows,创建进程 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位 。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体 。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体 。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程 。 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位 。线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制 。从内核角度讲线程是活动体对象,而进程只是一组静态的对象集,进程必须至少拥有一个活动线程才能维持运转 。当某个应用程序调用一个创建进程的函数比如CreateProcess或者用户执行某一个程序(其实windows下用户执行一般普通程序是由explorer.exe调用CreateProcess来完成),操作系统把这个过程分成以下步骤来完成: 1.打开将要在该进程中执行的映像文件 。 下面来看下具体每一步操作系统所做的工作: 2.创建Windows执行体进程对象 。 (2)创建初始的进程地址空间 (3)初始化内核进程块KPROCESS 3.创建初始线程(栈、堆执行环境初始化及执行线程体对象) 。 这时候Windows执行体进程对象已经完全建立完成,但它还没有线程所以无法执行, 接下来系统调用NtCreateThread来创建一个挂起的新线程它就是进程的主线程体 。 4.通知Windows子系统新进程创建了(子系统是操作系统的一部分它是一个协助操作系统内核管理用户态/客户方的一个子系统具体的进程为Csrss.exe) 。 接下来操作系统通过客户态(Kernel32.dll)给Windows子系统(Csrss)发送一个新进程线程创建的数据消息,让子系统建立自己的进程线程管理块 。当Csrss接收到该消息时候执行下面的处理: *复制一份该进程和线程句柄 5.开始执行初始线程(如果创建时候指定了线程的CREATE_SUSPENDED状态则线程暂时挂起不执行) 。到这里进程环境已经建立完毕进程中开始创建的主线程到这里获得执行权开始执行线程 6.在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行 。到这步实质是调用ldrInitializeThunk来初始化加载器,堆管理器NLS表TLS数组以及临界区结构,并且加载任何必须要DLL并且用DLL_PROCESS_ATTACH功能代码来调用各DLL入口点,最后当加载器初始化例程返回到用户模式APC分发器时进程映像开始在用户模式下执行,然后它调用线程启动函数开始执行 。 到这里操作系统完成了所有的创建工作,我们写的程序就这样被操作系统调用运行起来了 。 |