详细介绍windows系统下创建进程、线程的过程
进程(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来创建一个挂起的新线程它就是进程的主线程体。
4.通知Windows子系统新进程创建了(子系统是操作系统的一部分它是一个协助操作系统内核管理用户态/客户方的一个子系统具体的进程为Csrss.exe)。
接下来操作系统通过客户态(Kernel32.dll)给Windows子系统(Csrss)发送一个新进程线程创建的数据消息,让子系统建立自己的进程线程管理块。当Csrss接收到该消息时候执行下面的处理:
*复制一份该进程和线程句柄
*设置进程优先级
*分配Csrss进程块
*把新进程的异常处理端口绑定到Csrss中,这样当该进程发生异常时,Csrss将会接收到异常消息
*分配和初始化Csrss线程块
*把线程插到进程的线程列表中
*把进程插到Csrss的线程列表中
*显示进程启动光标
5.开始执行初始线程(如果创建时候指定了线程的CREATE_SUSPENDED状态则线程暂时挂起不执行)。到这里进程环境已经建立完毕进程中开始创建的主线程到这里获得执行权开始执行线程
6.在新进程和线程环境中完成地址空间的初始化(比如加载必须的DLL和库),然后开始到进程入口执行。到这步实质是调用ldrInitializeThunk来初始化加载器,堆管理器NLS表TLS数组以及临界区结构,并且加载任何必须要DLL并且用DLL_PROCESS_ATTACH功能代码来调用各DLL入口点,最后当加载器初始化例程返回到用户模式APC分发器时进程映像开始在用户模式下执行,然后它调用线程启动函数开始执行。
到这里操作系统完成了所有的创建工作,我们写的程序就这样调用运行起来了。
相关文章

电脑如何清除运行窗口历史记录? Windows系统清除运行窗口历史记录的技
winodws的命令行界面是一个不错的快捷方式,我们只需要通过"win+r"就可以调用运行命令,随着时间的累积,我们这里会积累下不少历史命令,有泄露隐私的风险,所以2025-04-17
电脑锁屏壁纸怎么固定不变? Windows系统锁定桌面背景图的方法
最近就有不少用户想要锁定电脑的桌面背景图,但不清楚具体如何操作,其实方法非常简单,详细请看下文介绍2025-04-17
怎么关闭windows索引器? Windows系统禁用索引器回退功能的技巧
使用Windows系统中的搜索功能都是在索引功能的基础上建立的,因此,若想要加快搜索索引速度,就要把系统中的索引器回退功能设置为禁用,详细请看下文介绍2025-04-17
微软应用商店无法打开怎么办? 0x80248014错误的原因分析与解决方案
近有不少小伙伴反映,Windows 10自带的微软商店怎么都打不开,显示0x80248014错误错误代码,下面我们就来看看详细解决方案2025-04-16
Windows系统如何关闭自动维护功能? 关闭自动维护轻松提升电脑性能
最近有不少用户想关闭其中的自动维护功能,但不清楚具体如何操作,下面我们就来看看Windows系统关闭自动维护功能的操作方法2025-04-15
微软发布多个 OOB 更新: 用于修复 Active Directory 组策略 Bug
微软发布多个 OOB 更新用于修复 Active Directory 组策略 Bug,该问题具体表现为:当设备已启用 "审核登录 / 注销事件" 功能且实际生效时,本地组策略编辑器或本2025-04-14
定期扫描病毒功能有什么用? Windows系统开启定期扫描病毒功能的技巧
定期扫描病毒功能可以很好的帮助我们电脑定义清理病毒,很多小伙伴都不知道在那里设置进行使用,该怎么开启这个功能呢?详细请看下文介绍2025-04-01
Windows如何设置麦克风增强? Windows系统麦克风权限开启全攻略
麦克风功能作为日常沟通和娱乐的重要工具,其表现尤为关键,然而,不少windows用户发现麦克风的声音偏小,影响了使用体验,下面我们就来看看Windows系统设置麦克风增强功能2025-04-01
关闭VBS功能可以释放部分系统资源,提高系统性能和游戏流畅度,windows系统该怎么关闭vbs功能呢?下面我们就来看看详细教程2025-04-01
Windows Server 2025安装 Hyper-V Docker 容器的图文教程
Hyper-V 容器是 Windows Server 2025 中的一项强大功能,今天我们就来介绍如何在 Windows Server 2025 上安装、配置和运行容器主机,并下载运行一个 IIS 容器2025-03-27



最新评论