程序
:是計算機指令的集合,它以文件的形式存儲在磁盤上。
進程:通常被定義為一個正在運行的程序的實例,是一個程序在其自身的地址空間中的一次執行活動。
進程是資源申請、調度和獨立運行的單位,因此,它試用系統中的運行資源;
而程序不能申請系統資源,不能被系統調度,也不能作為獨立運行的單位,因此它不占用系統資源。
進程由2部分組成:
1.內核對象????????? 操作系統用來管理進程的內核對象。?? 內核對象也就是系統用來存放有關進程的統計信息的地方。
2.地址空間????????? 地址空間包含所有可執行模塊或DLL模塊的代碼和數據,還包含動態內存分配的空間。?
??????????????????????????????比如:線程堆棧和堆分配空間
進程從來不執行任何東西,它只是線程的容器。
若要使它完成某項操作,它必須擁有一個在它環境里運行的線程,此線程負責執行包含在進程的地址空間中的代碼。
單個進程可能包含若干線程,這些線程都是“同時”執行進程地址空間中的代碼。
每個進程至少擁有一個線程,來執行地址空間中的代碼。
當創建一個進程時,系統會自動創建這個進程的第一個線程,此線程稱為主線程。
此后,主線程再創建其它線程。
進程地址空間:
系統賦予每個進程獨立的虛擬地址空間。
對于32位進程來說,這個地址空間就是4GB。
每個進程都有它的私有地址空間。
進程A可能有一個存放在A的地址空間中的數據結構,地址是0x12345678;
進程B有一個完全不同的數據結構存放在B的地址空間,地址是0x12345678;
當進程A的線程訪問地址為0x12345678的內存時,這些線程訪問的是進程A的數據結構;
當進程B的線程訪問地址為0x12345678的內存時,這些線程訪問的是進程B的數據結構;
進程A的線程不能訪問進程B的地址空間中的數據結構,反之亦然。
4GB是虛擬內存地址,只是內存地址的一個范圍。
在你能成功訪問數據而不會出現非法訪問之前,必須賦予物理寄存器、或者將物理存儲器映射到各個部分的地址空間。
4GB虛擬空間地址中,2GB是內核方式分區,供內核代碼、設備驅動程序、設備I/O高速緩沖、非頁面內存池的分配和進程頁面表等使用;
而用戶方式分區使用的地址空間約為2GB,這個分區是進程的私有地址空間所在的地方。
一個進程不能讀取、寫入、或者以任何方式訪問駐留在該分區的另一個進程的數據。
對于所有應用程序來說,該分區是維護進程的大部分數據的地方。
線程:
線程由2部分組成:
1.線程的內核對象:
操作系統用它來對線程實施管理。
內核對象也是系統用來存放線程統計信息的地方。
2.線程堆棧:
它用來維護線程在執行代碼時需要的所有參數和局部變量。
當創建線程時,系統創建一個線程內核對象。
該線程內核對象不是線程本身,而是操作系統用來管理線程的較小的數據結果。
可以將線程內核對象視為由關于線程的統計信息組成的一個小型數據結構。
線程總是在某個進程環境中創建。系統從進程的地址空間中分配內存,供線程的堆棧使用。
新線程運行的進程環境與創建線程的環境相同。因此,新線程可以訪問進程的內核對象的所有句柄、
進程中的所有內存和在這個相同進程中的所有其他線程的堆棧。
這使得單個進程的多個線程能夠非常容易的相互通信。
線程只有一個內核對象和堆棧,保留的記錄很少,所以所需的內存也很小。
因為線程需要的開銷比進程少,因此編程中經常用多線程來解決問題,避免開啟新的線程。
線程運行:
操作系統為每個運行線程安排一定的CPU時間——時間片。
系統通過一種循環的方式為線程提供時間片,每個線程在自己的時間內運行,因時間片相當短,
所以給用戶的感覺就好像多線程在同時運行一樣。
如果一臺計算機有多個CPU,線程就能真正意義上的同時運行了,也就是真正的多線程了。
互斥對象:
互斥對象屬于內核對象,它能夠確保線程擁有對單個資源的互斥訪問權。
互斥對象包含一個使用數量,一個線程ID和一個計數器。
ID用于標示系統中的哪個線程當前擁有互斥對象,計數器用于指明該線程擁有互斥對象的次數。