程序 :是計(jì)算機(jī)指令的集合,它以文件的形式存儲(chǔ)在磁盤上。

進(jìn)程通常被定義為一個(gè)正在運(yùn)行的程序的實(shí)例,是一個(gè)程序在其自身的地址空間中的一次執(zhí)行活動(dòng)。

進(jìn)程是資源申請(qǐng)、調(diào)度和獨(dú)立運(yùn)行的單位,因此,它試用系統(tǒng)中的運(yùn)行資源;
而程序不能申請(qǐng)系統(tǒng)資源,不能被系統(tǒng)調(diào)度,也不能作為獨(dú)立運(yùn)行的單位,因此它不占用系統(tǒng)資源。

進(jìn)程由2部分組成:
1.內(nèi)核對(duì)象????????? 操作系統(tǒng)用來管理進(jìn)程的內(nèi)核對(duì)象。?? 內(nèi)核對(duì)象也就是系統(tǒng)用來存放有關(guān)進(jìn)程的統(tǒng)計(jì)信息的地方。
2.地址空間????????? 地址空間包含所有可執(zhí)行模塊或DLL模塊的代碼和數(shù)據(jù),還包含動(dòng)態(tài)內(nèi)存分配的空間。?
??????????????????????????????比如:線程堆棧和堆分配空間

進(jìn)程從來不執(zhí)行任何東西,它只是線程的容器。
若要使它完成某項(xiàng)操作,它必須擁有一個(gè)在它環(huán)境里運(yùn)行的線程,此線程負(fù)責(zé)執(zhí)行包含在進(jìn)程的地址空間中的代碼。

單個(gè)進(jìn)程可能包含若干線程,這些線程都是“同時(shí)”執(zhí)行進(jìn)程地址空間中的代碼。

每個(gè)進(jìn)程至少擁有一個(gè)線程,來執(zhí)行地址空間中的代碼。
當(dāng)創(chuàng)建一個(gè)進(jìn)程時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建這個(gè)進(jìn)程的第一個(gè)線程,此線程稱為主線程。
此后,主線程再創(chuàng)建其它線程。

進(jìn)程地址空間:

系統(tǒng)賦予每個(gè)進(jìn)程獨(dú)立的虛擬地址空間。
對(duì)于32位進(jìn)程來說,這個(gè)地址空間就是4GB。

每個(gè)進(jìn)程都有它的私有地址空間。
進(jìn)程A可能有一個(gè)存放在A的地址空間中的數(shù)據(jù)結(jié)構(gòu),地址是0x12345678;
進(jìn)程B有一個(gè)完全不同的數(shù)據(jù)結(jié)構(gòu)存放在B的地址空間,地址是0x12345678;
當(dāng)進(jìn)程A的線程訪問地址為0x12345678的內(nèi)存時(shí),這些線程訪問的是進(jìn)程A的數(shù)據(jù)結(jié)構(gòu);
當(dāng)進(jìn)程B的線程訪問地址為0x12345678的內(nèi)存時(shí),這些線程訪問的是進(jìn)程B的數(shù)據(jù)結(jié)構(gòu);
進(jìn)程A的線程不能訪問進(jìn)程B的地址空間中的數(shù)據(jù)結(jié)構(gòu),反之亦然。

4GB是虛擬內(nèi)存地址,只是內(nèi)存地址的一個(gè)范圍。
在你能成功訪問數(shù)據(jù)而不會(huì)出現(xiàn)非法訪問之前,必須賦予物理寄存器、或者將物理存儲(chǔ)器映射到各個(gè)部分的地址空間。

4GB虛擬空間地址中,2GB是內(nèi)核方式分區(qū),供內(nèi)核代碼、設(shè)備驅(qū)動(dòng)程序、設(shè)備I/O高速緩沖、非頁面內(nèi)存池的分配和進(jìn)程頁面表等使用;
而用戶方式分區(qū)使用的地址空間約為2GB,這個(gè)分區(qū)是進(jìn)程的私有地址空間所在的地方。
一個(gè)進(jìn)程不能讀取、寫入、或者以任何方式訪問駐留在該分區(qū)的另一個(gè)進(jìn)程的數(shù)據(jù)。
對(duì)于所有應(yīng)用程序來說,該分區(qū)是維護(hù)進(jìn)程的大部分?jǐn)?shù)據(jù)的地方。

線程:
線程由2部分組成:
1.線程的內(nèi)核對(duì)象:
操作系統(tǒng)用它來對(duì)線程實(shí)施管理。
內(nèi)核對(duì)象也是系統(tǒng)用來存放線程統(tǒng)計(jì)信息的地方。
2.線程堆棧:
它用來維護(hù)線程在執(zhí)行代碼時(shí)需要的所有參數(shù)和局部變量。

當(dāng)創(chuàng)建線程時(shí),系統(tǒng)創(chuàng)建一個(gè)線程內(nèi)核對(duì)象。
該線程內(nèi)核對(duì)象不是線程本身,而是操作系統(tǒng)用來管理線程的較小的數(shù)據(jù)結(jié)果。
可以將線程內(nèi)核對(duì)象視為由關(guān)于線程的統(tǒng)計(jì)信息組成的一個(gè)小型數(shù)據(jù)結(jié)構(gòu)。

線程總是在某個(gè)進(jìn)程環(huán)境中創(chuàng)建。系統(tǒng)從進(jìn)程的地址空間中分配內(nèi)存,供線程的堆棧使用。
新線程運(yùn)行的進(jìn)程環(huán)境與創(chuàng)建線程的環(huán)境相同。因此,新線程可以訪問進(jìn)程的內(nèi)核對(duì)象的所有句柄、
進(jìn)程中的所有內(nèi)存和在這個(gè)相同進(jìn)程中的所有其他線程的堆棧。
這使得單個(gè)進(jìn)程的多個(gè)線程能夠非常容易的相互通信。

線程只有一個(gè)內(nèi)核對(duì)象和堆棧,保留的記錄很少,所以所需的內(nèi)存也很小。

因?yàn)榫€程需要的開銷比進(jìn)程少,因此編程中經(jīng)常用多線程來解決問題,避免開啟新的線程。


線程運(yùn)行:
操作系統(tǒng)為每個(gè)運(yùn)行線程安排一定的CPU時(shí)間——時(shí)間片。
系統(tǒng)通過一種循環(huán)的方式為線程提供時(shí)間片,每個(gè)線程在自己的時(shí)間內(nèi)運(yùn)行,因時(shí)間片相當(dāng)短,
所以給用戶的感覺就好像多線程在同時(shí)運(yùn)行一樣。

如果一臺(tái)計(jì)算機(jī)有多個(gè)CPU,線程就能真正意義上的同時(shí)運(yùn)行了,也就是真正的多線程了。

互斥對(duì)象:
互斥對(duì)象屬于內(nèi)核對(duì)象,它能夠確保線程擁有對(duì)單個(gè)資源的互斥訪問權(quán)。

互斥對(duì)象包含一個(gè)使用數(shù)量,一個(gè)線程ID和一個(gè)計(jì)數(shù)器。

ID用于標(biāo)示系統(tǒng)中的哪個(gè)線程當(dāng)前擁有互斥對(duì)象,計(jì)數(shù)器用于指明該線程擁有互斥對(duì)象的次數(shù)。