详细介绍了windows系统中进程和线程的创建过程。
工艺(过程)是一个有独立功能的数据集上运行的程序,这是资源分配和调度的一个独立的单元。程序是一组有序的指令的集合,它没有本身的任何意义,但它只是一个静态的实体。过程是不同的,它是数据集上执行程序,它是一个动态的实体,它的产生是通过创建、运行调度、等待资源或事件,是由于完成任务撤销,这反映了一个程序在一个特定的数据集运行的整个动态过程。
线程(线程)是进程的实体,是CPU调度和调度的基本单元,线程不能独立执行,必须在进程存在的过程中由多线程控制,从内核的角度来看,线程是活动对象,进程只是一组静态对象集。过程中必须至少有一个活跃的线程继续运行。当一个应用程序调用一个过程来创建一个功能如CreateProcess或用户执行一个程序(事实上,Windows用户执行的一般程序是由explorer.exe CreateProcess调用来完成操作系统),其过程分为以下步骤:
1。打开将在流程中执行的映像文件。
2。创建windows执行器进程对象。
三.创建初始线程(堆栈,堆执行环境初始化和执行线程主体对象)。
4、通知Windows子系统已经创建了新进程。(子系统是操作系统的一部分,它是一个协助操作系统内核管理用户状态/客户端子系统的具体过程是Csrss。exe)。
5。启动初始线程(如果create_suspended状态的线程创建时指定的时间,那么线程暂停)。
6。在新进程和线程环境中初始化地址空间(例如加载所需的DLL和库),然后启动进程入口。
在这里,操作系统完成了创建一个新进程的过程。
接下来,看看每个操作系统所做的工作。
1。打开将在流程中执行的映像文件。
操作系统首先找到已执行的Windows映像,并创建一个内存区域对象,以便稍后将其映射到一个新的进程地址空间。
2。创建windows执行器进程对象。
操作系统然后调用系统内部函数NtCreateProcess,创建一个窗口执行过程对象。具体步骤:
(1)建立过程
*分配并初始化EPROCESS结构块
*从父进程继承的亲和掩码
*最大最小工作集的分配过程(的psminimumworkingset psmaximumworkingset是由两个参数确定)
*阻止新进程进程配额,设置配额父亲块,并增加父块配额的引用计数。
*继承windows的设备名称空间
*在新过程对象的inheritedformuniqueprocessid保存父进程的进程ID
*为流程创建主访问令牌
*初始化进程句柄表
*新进程的退出状态设置为status_pending
(2)创建初始进程地址空间
*在适当的页表中创建页表项以映射初始页
*计算过程的工作集的大小从mmresidentavailablepage
*非缓存系统和页面表的空间表单部分映射到进程中。
(3)初始化内核进程块kprocess
(4)结束创建进程地址空间的过程。
(5)建立PEB
(6)执行过程对象的完成
三.创建初始线程(堆栈,堆执行环境初始化和执行线程主体对象)。
此时Windows执行器进程对象已完全完成,但它没有线程,因此无法执行。
然后系统调用NtCreateThread创建新线程挂,这是过程的主线。
4、通知Windows子系统已经创建了新进程。(子系统是操作系统的一部分,它是一个协助操作系统内核管理用户状态/客户端子系统的具体过程是Csrss。exe)。
其次,操作系统会发出一个新的数据信息被新进程线程创建的Windows子系统(CSRSS)通过客户端状态(Kernel32. DLL),使系统可以建立自己的进程线程管理模块。当Csrss收到消息,进行以下处理:
*复制进程和线程句柄的副本
*设置进程优先级
*配置CSRSS进程块
*把异常处理新工艺的端口到CSRSS,这样在过程中发生的CSRSS会收到异常消息
*分配和初始化的csrss线程块
*将线程插入进程的线程列表中
*插入过程分为Csrss的线程列表
*显示进程启动游标
5。启动初始线程(如果create_suspended状态的线程创建时指定的时间,那么线程暂停)。通过这一过程,过程环境一直在创造主线程的线程的执行线程的过程开始了
6。的地址空间的新进程和线程环境初始化(如加载需要的DLL和库)然后启动过程的入口。这一步是调用LdrInitializeThunk初始化装载机,堆管理器NLS TLS数组和临界区结构和加载任何必须DLL和使用dll_process_attach代码打电话给DLL的入口点,最后,当装载机初始化例程返回到用户模式APC经销商在处理图像开始在用户模式下执行,并调用线程启动函数开始。
在这里,操作系统完成了所有的创建,我们编写的程序是通过操作系统调用来运行的。