進程:百度百科說“進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。”,維基百科說“是計算機中已運行程序的實體。進程本身不會運行,是線程的容器。”
線程:百度百科說“線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元”,維基百科說“是操作系統能夠進行運算調度的最小單位。它被包涵在進程之中,是進程中的實際運作單位。”。
在弄清楚這些名詞前,我們先看看是如何產生的。
在計算機剛誕生時,計算機只能接受一些特定的指令並執行,當用戶輸入指令時,計算機只能等待,這樣效率很低,然後人們開始想,是不是可以把指令寫一個清單,交給計算機去執行,如此,有了批處理操作系統;但是這時人們又發現了一個問題,比如當一個程序需要耗時較長的I/O操作時,cpu只能等待其讀完數據,這樣效率無疑也是比較低的。再然後人們又開始想,是不是當一個程序等待資源時是不是可以讓另一個程序運行,待之前的程序資源准備完畢時再讓其運行,相當於是內存中不僅僅只運行一個程序?進程產生了,用進程來對應一個程序,每個進程對應一定的內存地址空間,且只能用自己的,各個進程不互相干擾,同時,進程保存了程序每個時刻的運行狀態,這樣進程間就可以切換了。這樣用戶用起來感覺像是計算機同一時間在執行多個任務,稱之為“並發”。說明:對於單核cpu來說,事實上一個時間只有一個進程占用cpu。
再然後,人們對計算機的實時性要求更高了,雖然可以執行多個進程了,但是執行一個進程時,一個進程一個時間段內只能做一件事情,那麼可不可以再把進程切分成多個子任務,並發執行呢?於是人們又發明了線程,通過線程之間的切換,讓用戶感覺系統同時在做很多件事情。
進程讓操作系統的並發性成為可能,線程讓進程內部並發成為可能。
現在再看上面的解釋,進程是系統資源分配和調度的基本單位,每個進程都獨享自己的資源;一個進程可以包括多個線程,而線程是系統運算調度的最小單位,所以進程內部的多個線程是共享進程的資源的。
當然,上面的解釋都要和物理設備相關,比如,cpu是單核的還是多核的等。
下面看一張資源監視器的圖:
通過這張圖可以很直觀的看出,一個eclipse進程包含多個線程。進程和線程不是一個量級的對象,所以個人認為沒有必要放在一起比較,和類和對象的關系比較類似。