程序是計算機指令的集合,它以文件的形式存儲在計算機磁盤上;而進程是一個正在運行的程序的一個實例,是程序在其自身的地址空間中的一次執行活動。
程序不占用系統的運行資源,程才可以申請資源、被系統調度、獨立運行。
一個程序可以對應多個進程,一個進程中也可以同時訪問多個程序。
進程由內核對象和地址空間兩部分組成。內核象是操作系統分配出的有特定數據結構的一內存塊,用于維護進程的各種信息,進程不能直接訪問該內存塊,只能通過系統給提供的一些函數來獲取一些信息。地址空間包含了所有可執行模塊或DLL模塊的代碼和數據,還包括動態內存分配的空間,比如運行中線程需要分配的堆棧和堆空間。
進程是線程的容器,是線程的運行環境,真正完成執行地址空間中代碼的是線程。
一個進程可以有多個線程,這些線程都執行該進程內的同一地址空間中的代碼。
一個進程至少得有一個線程來執行其地址空間中的代碼。創建進程時,操作系統就會自動創建該進程的第一個線程,也就是主線程,然后再由主線程來調用其它線程,我們常說的main或WinMain函數就是主線程的入口函數。
對于32位的進程來說,地址空間最大為4GB,這由進程指針的尋址能力所限,而且對于每個進程而言,該地址空間都是它私有的,其他的進程是不能訪問的,而且我們所說的地址空間是虛擬的地址空間,怎么理解虛擬二字呢?就是說將物理內存和頁面文件中的某部分拿出來映射為我們這里的地址空間,它只是內存地址的一個范圍。
線程也是由對應于它的內核對象以及線程堆棧組成,這里的內核對象也是一個有特定數據結構的內存塊,由于系統管理線程的統計信息。
由一個進程創建的多個線程之間的地位都是平等的,它們都可以隨意的訪問進程內核對象中的所有句柄等等屬于該進程的信息,而且各個線程之間是可以互相隨意的訪問彼此的線程堆棧的,因此線程間通信就很容易了,而且線程只有一個內核對象和堆棧,因此占用的內存少,所以提倡多線程編程,而不是創建多個進程。
對于一個CPU,在某時刻只能有一個線程在運行,多個線程的運行是通過時間片輪轉來實現的,并不是真正意義上的同時運行。