详细介绍windows系统下创建进程、线程的过程
发布时间:2023-02-08 03:14:10
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位,下面为大家介绍下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分发器时进程映像开始在用户模式下执行,然后它调用线程启动函数开始执行。
到这里操作系统完成了所有的创建工作,我们写的程序就这样 * 作系统调用运行起来了。


猜你喜欢
- 现如今,电脑的使用越来越普及,许多人上班或者生活中都需要用到word文档办公软件,但其中一些小知识,比如word文档两端对齐如何实现?小编在
- 日常办公时,我们经常通过插入Word批注的方法做记号,今天小编就给大家一一说说Word2013中新建、答复、隐藏/显示和删除批注的方法步骤,
- Linux菱形乱码的解决方案:执行命令:vim /var/lib/locales/supported.d/local将里面的原有类容删除,添
- 将电脑添加到同一局域网下,可以更加方便地进行资源共享、传输等工作,那就有用户问了自己是win10的电脑,要怎么加入到已有的工作组中呢?下面,
- 今天小编为大家带来了Win8设置鼠标单击打开文件夹图文教程,感兴趣的朋友们可以跟着小编去下文了解一下哦在Win8系统中想要打开一个文件夹就要
- 声卡驱动安装不上怎么办?有的朋友最近遇到了因为声卡驱动安装不上造成的系统无法播放声音问题,不知道怎么解决。其实这可能是因为我们使用的声音设备
- 在excel表格的使用中,abs函数的作用就是绝对值,但是应该怎么使用该函数呢?下面随小编一起来看看吧。excel使用abs函数求绝对值的步
- 相信很多电脑用户都遇到过,不小心把重要的文件删除了,并且还把回收站给清空,这该怎么办?怎么找回被删除的文件呢?相信这是不少用户头疼的事,不用
- 现在5G一键开始普及了,有些使用Win11 22H2版本系统的电脑用户想用5G频段热点分享网络,但是不知道在哪设置,这里小编和大家分一下Wi
- 刚刚,爆料大神WZor在Twitter上宣布,我们等待已久的Win10 RTM版非常有可能在下次Windows10公开版本推送时到来,可能性
- Win10总是自动勾选自动检测设置怎么解决?win10系统中已经手动把浏览器的自动检测设置前的勾选已去掉了,但是下次又自动勾选了,该怎么解决
- 日常工作学习中,许多尤其是快捷键用的好的用户,经常会手快误删除一些电脑文件和数据,并且是永久删除掉,以致于丢失了许多重要的内容,极光数据恢复
- 如何利用支付宝查询发票真伪?小伙伴们会发现支付宝中的便民服务功能真是越来越多了。下面,小编就为大家介绍下利用支付宝查询发票真伪方法。打开手机
- 云文档的功能使我们随时随地查看和编辑文档,不必担心文件丢失,甚至都不需要携带U盘保存,今天我们来学习如何将文件保存到云文档内。第一步,打开一
- 在制作PPT时,经常遇到一段并列关系很强的文字描述时,这个时候就可以考虑采用表格的方式将这段文字展现出来。通过以下四步,能够将PPT中文字很
- 在使用电脑的过程中会因各种原因重装电脑,而一般我们重装电脑的时候只会格式化C盘,但是有一些小伙伴打算全盘格式化重装系统,那么全盘格式化要如何
- 如何用ps自定义形状工具帮助我们作图?自定义形状工具是Photoshop软件中重要的工具之一,学会此功能可以帮助我们更快的入门Photosh
- 随着电脑的越来越普及,我们使用win10的次数也越来越多,那么就会遇到一些问题,例如win10桌面显示不了任何程序,我们该怎么解决呢,一起来
- UUSee网络电视怎么使用? UUSee网络电视 海量大片影视剧,体育比赛直播,高清免费观看。用户可以免费收看CCTV在内的各大电视台的节目
- DaVinci Resolve Studio 16 Mac是目前最新版本的达芬奇调色软件,DaVinci Resolve 16功能非常强大,