天下网吧 >> 网吧天地 >> 网吧技术 >> 网吧系统 >> 正文

详解Windows操作系统下创建进程的过程

2013-12-3不详佚名
69972">

  进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。

  线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在进程中,由进程提供多个线程执行控制。从内核角度讲线程是活动体对象,而进程只是一组静态的对象集,进程必须至少拥有一个活动线程才能维持运转。

  当某个应用程序调用一个创建进程的函数比如CreateProcess或者用户执行某一个程序(其实windows下用户执行一般普通程序是由explorer、exe调用CreateProcess来完成),操作系统把这个过程分成以下步骤来完成:

  1、打开将要在该进程中执行的映像文件。

  2、创建Windows执行体进程对象。

  3、创建初始线程(栈、堆执行环境初始化及执行线程体对象)。

  4、通知Windows子系统新进程创建了(子系统是操作系统的一部分它是一个协助操作系统内核管理用户态/客户方的一个子系统具体的进程为Csrss、exe)。

  5、开始执行初始线程(如果创建时候指定了线程的CREATE_SUSPENDED状态则线程暂时挂起不执行)。

  6、在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行。

  到这里操作系统完成一个新进程的创建过程。下面来看下具体每一步操作系统所做的工作:

  1、打开将要在该进程中执行的映像文件。

  首先操作系统找到执行的Windows映像然后创建一个内存区对象,以便后面将它映射到新的进程地址空间中。

  2、创建Windows执行体进程对象。

  接下来操作系统调用内部的系统函数NtCreateProcess来创建一个Windwos执行体进程对象。具体步骤是:

  (1)建立EPROCESS

  *分配并初始化EPROCESS结构块

  *从父进程处继承得到进程的亲和性掩码

  *分配进程的最大最小工作集尺(由两个参数决定PsMinimumWorkingSet PsMaximumWorkingSet)

  *降新进程的配额块设置为父进程配额块地址,并递增父进程配额块的引用计数

  *继承Windows的设备名字空间

  *将父进程进程ID保存在新进程对象的InheritedFormUniqueProcessId中

  *创建该进程的主访问令牌

  *初始化进程句柄表

  *将新进程的退出状态设置为STATUS_PENDING

  (2)创建初始的进程地址空间

  *在适当的页表中创建页表项,以映射初始页面

  *从MmresidentAvailablePage算出进程工作集大小

  *系统空间的非换页部分和系统缓存的页表被映射到进程

  (3)初始化内核进程块KPROCESS

  (4)结束进程地址空间的创建过程

  (5)建立PEB

  (6)完成执行体进程对象的创建过程

  3、创建初始线程(栈、堆执行环境初始化及执行线程体对象)。

  这时候Windows执行体进程对象已经完全建立完成,但它还没有线程所以无法执行,接下来系统调用NtCreateThread来创建一个挂起的新线程它就是进程的主线程体。


本文来源:不详 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系email:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧·网吧天下
  • 本周热门
  • 本月热门
  • 阅读排行