Windows作業系統下建立進程的過程

來源:互聯網
上載者:User

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分發器時進程映像開始在使用者模式下執行,然後它調用線程啟動函數開始執行。

到這裡作業系統完成了所有的建立工作,我們寫的程式就這樣被作業系統調用運行起來了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.