• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 34,comments - 2,trackbacks - 0
            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ì)
            91久久九九无码成人网站 | 国产成人精品久久一区二区三区 | 亚洲综合精品香蕉久久网| 国产亚洲美女精品久久久2020| 久久综合久久自在自线精品自| 亚洲国产精品无码久久久蜜芽| 久久大香香蕉国产| 国产农村妇女毛片精品久久| 青青热久久国产久精品 | 99久久国产宗和精品1上映| 久久水蜜桃亚洲av无码精品麻豆| 精品午夜久久福利大片| 中文字幕无码久久人妻| 99麻豆久久久国产精品免费| 欧美大战日韩91综合一区婷婷久久青草| 久久久久se色偷偷亚洲精品av| 久久91亚洲人成电影网站| 国产精品久久新婚兰兰| 精品免费tv久久久久久久| 伊人久久精品无码av一区| 欧美伊人久久大香线蕉综合69 | 午夜精品久久久久久久久| 色综合久久精品中文字幕首页| 亚洲人AV永久一区二区三区久久| 99久久超碰中文字幕伊人| 久久久国产99久久国产一| 国内精品免费久久影院| 国产精品久久久久国产A级| 久久久这里有精品| 久久久久亚洲爆乳少妇无| 国产成人久久777777| 91性高湖久久久久| 国产综合精品久久亚洲| 亚洲欧美精品伊人久久| 国产精品无码久久综合| 国产一久久香蕉国产线看观看| 亚洲午夜久久久久妓女影院| 久久精品综合一区二区三区| 久久se精品一区二区| 欧美久久精品一级c片片| 久久伊人精品青青草原高清|