1、什么是進(jìn)程?
::一般將進(jìn)程定義成一個(gè)正在運(yùn)行的程序的一個(gè)實(shí)例。進(jìn)程由兩部分組成:
①、一個(gè)內(nèi)核對(duì)象,操作系統(tǒng)用它來管理進(jìn)程。內(nèi)核對(duì)象也是系統(tǒng)保存進(jìn)程統(tǒng)計(jì)信息的地方。
②、一個(gè)地址空間,其中包含所有執(zhí)行體(executable)或DLL模塊的代碼和數(shù)據(jù)。此外,它還包含動(dòng)態(tài)內(nèi)存分配,比如線程堆棧和堆的分配。
進(jìn)程與線程的關(guān)系:
①、一個(gè)進(jìn)程創(chuàng)建的時(shí)候,系統(tǒng)會(huì)自動(dòng)創(chuàng)建它的第一個(gè)線程,這稱為主線程(primary thread)。
②、進(jìn)程要做任何事情,都必須讓一個(gè)線程在它的上下文中運(yùn)行。如果沒有線程要執(zhí)行進(jìn)程地址空間包含的代碼,進(jìn)程就失去了繼續(xù)存在的理由。所以,系統(tǒng)會(huì)自動(dòng)銷毀進(jìn)程及其地址空間。
③、一個(gè)進(jìn)程可以有多個(gè)線程,所有線程都在進(jìn)程的地址空間中“同時(shí)”執(zhí)行代碼。為此,每個(gè)線程都有它自己的一組CPU寄存器和它自己的堆棧。對(duì)于所有要運(yùn)行的線程,操作系統(tǒng)會(huì)輪流為每個(gè)線程調(diào)度一些CPU時(shí)間。它會(huì)采取round-robin(輪詢或輪流)方式,為每個(gè)線程都分配時(shí)間片,從而營造出所有線程都在“并發(fā)”運(yùn)行的假象。
2、系統(tǒng)如何創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象來管理每個(gè)進(jìn)程。
當(dāng)一個(gè)進(jìn)程被初始化時(shí),系統(tǒng)要為它分配一個(gè)句柄表(空的,也就是用來管理進(jìn)程的內(nèi)核對(duì)象)。該句柄表只用于內(nèi)核對(duì)象(而不用于用戶對(duì)象和gdi對(duì)象)。句柄表是一個(gè)數(shù)據(jù)結(jié)構(gòu)的數(shù)組,每個(gè)結(jié)構(gòu)都包含一個(gè)指向內(nèi)核對(duì)象的指針,一個(gè) 訪問屏蔽(DWORD)和一個(gè)標(biāo)志(DWORD)。
:::當(dāng)進(jìn)程中的線程調(diào)用創(chuàng)建內(nèi)核對(duì)象的函數(shù)(比如 CreatFileMapping)時(shí),內(nèi)核就為該對(duì)象分配一個(gè)內(nèi)存塊并對(duì)它初始化。同時(shí)對(duì)進(jìn)程的句柄表進(jìn)行掃描,找出一個(gè)空項(xiàng),填充內(nèi)核對(duì)象數(shù)據(jù)結(jié)構(gòu)的內(nèi)存地址到該頂?shù)闹羔槼蓡T,設(shè)置訪問屏蔽和標(biāo)志。
::: 用于創(chuàng)建內(nèi)核對(duì)象的所有函數(shù)均返回與進(jìn)程相關(guān)的句柄。該句柄實(shí)際上是放入進(jìn)程的句柄表中的索引 (由此可知,句柄是與進(jìn)程相關(guān)的,不能由其他進(jìn)程直接成功地使用)。但這只適用部分系統(tǒng),句柄的含義可能隨時(shí)變更。 應(yīng)用程序在運(yùn)行時(shí)有可能泄漏內(nèi)核對(duì)象,但是當(dāng)進(jìn)程終止時(shí)系統(tǒng)將能確保所有內(nèi)容均被正確地清除。這個(gè)情況也適用于所有對(duì)象,資源和內(nèi)存塊,也就是說當(dāng)進(jìn)程終止運(yùn)行時(shí),系統(tǒng)將保證進(jìn)程不會(huì)留 下任何對(duì)象。
3、如何利用與一個(gè)進(jìn)程關(guān)聯(lián)的內(nèi)核對(duì)象來操縱該進(jìn)程。
4、進(jìn)程的各種不同的屬性(或特性),以及用于查詢和更改這些屬性的幾個(gè)函數(shù)。
實(shí)例句柄、前一個(gè)實(shí)例句柄、進(jìn)程的命令行、進(jìn)程的環(huán)境變量、進(jìn)程當(dāng)前所在的驅(qū)動(dòng)器和目錄、還有版本問題等
5、如何利用一些函數(shù)在系統(tǒng)中創(chuàng)建或生成額外的進(jìn)程。
我們用CreateProcess函數(shù)來創(chuàng)建一個(gè)進(jìn)程,參考MSDN。當(dāng)一個(gè)線程調(diào)用CreateProcess時(shí),系統(tǒng)會(huì)做如下工作:
(1)、系統(tǒng)將創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象,其初始使用計(jì)數(shù)為1。進(jìn)程內(nèi)核對(duì)象不是進(jìn)程本身,而是操作系統(tǒng)用來管理這個(gè)進(jìn)程的一個(gè)小型數(shù)據(jù)結(jié)構(gòu)(該內(nèi)核對(duì)象是用來管理新進(jìn)程的)。
(2)、系統(tǒng)為新進(jìn)程創(chuàng)建一個(gè)虛擬地址空間,并將執(zhí)行體文件(和所有必要的DLL)的代碼及數(shù)據(jù)加載到進(jìn)程的地址空間。
(3)、系統(tǒng)為新進(jìn)程的主線程創(chuàng)建一個(gè)線程內(nèi)核對(duì)象(使用計(jì)數(shù)為1)。和進(jìn)程內(nèi)核對(duì)象一樣,線程內(nèi)核對(duì)象也是一個(gè)小型數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng)用它來管理這個(gè)線程。這個(gè)主線程一開始就會(huì)執(zhí)行由鏈接器設(shè)為應(yīng)用程序入口的C/C++運(yùn)行時(shí)啟動(dòng)例程,并最終調(diào)用你的WinMain,wWinMain,main或wmain函數(shù)。
(4)、如果系統(tǒng)成功創(chuàng)建了新進(jìn)程和主線程,CreateProcess將返回TRUE。
創(chuàng)建子進(jìn)程后:
創(chuàng)建一個(gè)進(jìn)程內(nèi)核對(duì)象時(shí),系統(tǒng)會(huì)為此對(duì)象分配一個(gè)獨(dú)一無二的標(biāo)識(shí)符,系統(tǒng)中沒有別的進(jìn)程內(nèi)核對(duì)象會(huì)有相同的ID編號(hào)
6、如何終止線程。
關(guān)閉到一個(gè)進(jìn)程或線程的句柄,不會(huì)強(qiáng)迫系統(tǒng)殺死此進(jìn)程或線程。關(guān)閉句柄只是告訴系統(tǒng)你對(duì)進(jìn)程或線程的統(tǒng)計(jì)數(shù)據(jù)
不再感興趣了。進(jìn)程或線程會(huì)繼續(xù)執(zhí)行,直至自行終止。(計(jì)數(shù),重點(diǎn)是計(jì)數(shù))
進(jìn)程可以通過以下4種方式終止:
(1)、主線程的入口函數(shù)返回(強(qiáng)烈推薦的方式)。
讓主線程的入口函數(shù)返回,可以保證發(fā)生以下幾件事情:
?? 該線程創(chuàng)建的任何C++對(duì)象都將由這些對(duì)象的析構(gòu)函數(shù)正確銷毀。
?? 操作系統(tǒng)將正確釋放線程堆棧使用的內(nèi)存。
?? 系統(tǒng)將進(jìn)程的退出代碼(在進(jìn)程內(nèi)核對(duì)象中維護(hù))設(shè)為你的入口函數(shù)的返回值。
?? 系統(tǒng)遞減進(jìn)程內(nèi)核對(duì)象的使用計(jì)數(shù)。
(2)、進(jìn)程中的一個(gè)線程調(diào)用ExitProcess函數(shù)(要避免這個(gè)方式)
進(jìn)程會(huì)在該進(jìn)程中的一個(gè)線程調(diào)用ExitProcess函數(shù)時(shí)終止:
VOID ExitProcess(UINT fuExitCode);
一旦你的應(yīng)用程序的主線程從它的入口函數(shù)返回,那么不管當(dāng)前在進(jìn)程中是否正在運(yùn)行其他線程,都會(huì)調(diào)用ExitProcess來終止進(jìn)程。不過,如果在入口函數(shù)中調(diào)用ExitThread,而不是調(diào)用ExitProcess或者簡單地返回,應(yīng)用程序的主線程將停止執(zhí)行,但只要進(jìn)程中還有其他線程正在運(yùn)行,進(jìn)程就不會(huì)終止。
(3)、另一個(gè)進(jìn)程中的線程調(diào)用TerminateProcess函數(shù)(要避免這個(gè)方式)
調(diào)用TerminateProcess也可以終止一個(gè)進(jìn)程,但是進(jìn)程無法將它在內(nèi)存中的任何信息轉(zhuǎn)儲(chǔ)到磁盤上。
(4)、進(jìn)程中的所有線程都“自然死亡”(這是很難發(fā)生的)
posted on 2011-10-07 11:19
Yu_ 閱讀(413)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Windows程序設(shè)計(jì)