主頁 > 知識庫 > 詳細介紹windows系統(tǒng)下創(chuàng)建進程、線程的過程

詳細介紹windows系統(tǒng)下創(chuàng)建進程、線程的過程

熱門標簽:萬科 電銷機器人源碼 電銷機器人 呼叫中心案例 科大訊飛語音識別系統(tǒng) 電話機器人搭建 硅谷的囚徒呼叫中心 鐵路電話系統(tǒng)

進程(Process)是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。程序只是一組指令的有序集合,它本身沒有任何運行的含義,只是一個靜態(tài)實體。而進程則不同,它是程序在某個數(shù)據(jù)集上的執(zhí)行,是一個動態(tài)實體。它因創(chuàng)建而產(chǎn)生,因調(diào)度而運行,因等待資源或事件而被處于等待狀態(tài),因完成任務而被撤消,反映了一個程序在一定的數(shù)據(jù)集上運行的全部動態(tài)過程。

線程(Thread)是進程的一個實體,是CPU調(diào)度和分派的基本單位。線程不能夠獨立執(zhí)行,必須依存在進程中,由進程提供多個線程執(zhí)行控制。從內(nèi)核角度講線程是活動體對象,而進程只是一組靜態(tài)的對象集,進程必須至少擁有一個活動線程才能維持運轉(zhuǎn)。當某個應用程序調(diào)用一個創(chuàng)建進程的函數(shù)比如CreateProcess或者用戶執(zhí)行某一個程序(其實windows下用戶執(zhí)行一般普通程序是由explorer.exe調(diào)用CreateProcess來完成),操作系統(tǒng)把這個過程分成以下步驟來完成:

1.打開將要在該進程中執(zhí)行的映像文件。
2.創(chuàng)建Windows執(zhí)行體進程對象。
3.創(chuàng)建初始線程(棧、堆執(zhí)行環(huán)境初始化及執(zhí)行線程體對象)。
4.通知Windows子系統(tǒng)新進程創(chuàng)建了(子系統(tǒng)是操作系統(tǒng)的一部分它是一個協(xié)助操作系統(tǒng)內(nèi)核管理用戶態(tài)/客戶方的一個子系統(tǒng)具體的進程為Csrss.exe)。
5.開始執(zhí)行初始線程(如果創(chuàng)建時候指定了線程的CREATE_SUSPENDED狀態(tài)則線程暫時掛起不執(zhí)行)。
6.在新進程和線程環(huán)境中完成地址空間的初始化(比如加載必須的DLL和庫),然后開始到進程入口執(zhí)行。
到這里操作系統(tǒng)完成一個新進程的創(chuàng)建過程。

下面來看下具體每一步操作系統(tǒng)所做的工作:
1.打開將要在該進程中執(zhí)行的映像文件。
首先操作系統(tǒng)找到執(zhí)行的Windows映像然后創(chuàng)建一個內(nèi)存區(qū)對象,以便后面將它映射到新的進程地址空間中。

2.創(chuàng)建Windows執(zhí)行體進程對象。
接下來操作系統(tǒng)調(diào)用內(nèi)部的系統(tǒng)函數(shù)NtCreateProcess來創(chuàng)建一個Windwos執(zhí)行體進程對象。具體步驟是:
(1)建立EPROCESS
*分配并初始化EPROCESS結(jié)構(gòu)塊
*從父進程處繼承得到進程的親和性掩碼
*分配進程的最大最小工作集尺(由兩個參數(shù)決定PsMinimumWorkingSet PsMaximumWorkingSet)
*降新進程的配額塊設置為父進程配額塊地址,并遞增父進程配額塊的引用計數(shù)
*繼承Windows的設備名字空間
*將父進程進程ID保存在新進程對象的InheritedFormUniqueProcessId中
*創(chuàng)建該進程的主訪問令牌
*初始化進程句柄表
*將新進程的退出狀態(tài)設置為STATUS_PENDING

(2)創(chuàng)建初始的進程地址空間
*在適當?shù)捻摫碇袆?chuàng)建頁表項,以映射初始頁面
*從MmresidentAvailablePage算出進程工作集大小
*系統(tǒng)空間的非換頁部分和系統(tǒng)緩存的頁表被映射到進程

(3)初始化內(nèi)核進程塊KPROCESS
(4)結(jié)束進程地址空間的創(chuàng)建過程
(5)建立PEB
(6)完成執(zhí)行體進程對象的創(chuàng)建過程

3.創(chuàng)建初始線程(棧、堆執(zhí)行環(huán)境初始化及執(zhí)行線程體對象)。

這時候Windows執(zhí)行體進程對象已經(jīng)完全建立完成,但它還沒有線程所以無法執(zhí)行,

接下來系統(tǒng)調(diào)用NtCreateThread來創(chuàng)建一個掛起的新線程它就是進程的主線程體。  

4.通知Windows子系統(tǒng)新進程創(chuàng)建了(子系統(tǒng)是操作系統(tǒng)的一部分它是一個協(xié)助操作系統(tǒng)內(nèi)核管理用戶態(tài)/客戶方的一個子系統(tǒng)具體的進程為Csrss.exe)。

接下來操作系統(tǒng)通過客戶態(tài)(Kernel32.dll)給Windows子系統(tǒng)(Csrss)發(fā)送一個新進程線程創(chuàng)建的數(shù)據(jù)消息,讓子系統(tǒng)建立自己的進程線程管理塊。當Csrss接收到該消息時候執(zhí)行下面的處理:

*復制一份該進程和線程句柄
*設置進程優(yōu)先級
*分配Csrss進程塊
*把新進程的異常處理端口綁定到Csrss中,這樣當該進程發(fā)生異常時,Csrss將會接收到異常消息
*分配和初始化Csrss線程塊
*把線程插入到進程的線程列表中
*把進程插入到Csrss的線程列表中
*顯示進程啟動光標

5.開始執(zhí)行初始線程(如果創(chuàng)建時候指定了線程的CREATE_SUSPENDED狀態(tài)則線程暫時掛起不執(zhí)行)。到這里進程環(huán)境已經(jīng)建立完畢進程中開始創(chuàng)建的主線程到這里獲得執(zhí)行權(quán)開始執(zhí)行線程

6.在新進程和線程環(huán)境中完成地址空間的初始化(比如加載必須的DLL和庫),然后開始到進程入口執(zhí)行。到這步實質(zhì)是調(diào)用ldrInitializeThunk來初始化加載器,堆管理器NLS表TLS數(shù)組以及臨界區(qū)結(jié)構(gòu),并且加載任何必須要DLL并且用DLL_PROCESS_ATTACH功能代碼來調(diào)用各DLL入口點,最后當加載器初始化例程返回到用戶模式APC分發(fā)器時進程映像開始在用戶模式下執(zhí)行,然后它調(diào)用線程啟動函數(shù)開始執(zhí)行。

到這里操作系統(tǒng)完成了所有的創(chuàng)建工作,我們寫的程序就這樣被操作系統(tǒng)調(diào)用運行起來了。

標簽:呼和浩特 新余 黃石 六安 南通 株洲 黔東 天門

巨人網(wǎng)絡通訊聲明:本文標題《詳細介紹windows系統(tǒng)下創(chuàng)建進程、線程的過程》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266