這個問題是基礎面試必問,作爲非計算機專業的人,我今天在閱讀《CLR via C#》的第25.1節才瞭解到區別
簡單來講:
進程是應用程序的一個實例要使用的資源的集合。
線程是一個虛擬化的CPU,或者邏輯CPU。
從概念上來講,進程與線程差別巨大,甚至可以說毫無關係;但是因爲現在操作系統都是設計成一個進程默認有一個執行線程,且線程只能使用當前進程內的資源,所以容易把線程理解成輕量級的進程。
可以想象一下,如果操作系統有多個進程,但是隻有一個CPU,或者說只有一個線程,那必然是這一個CPU去依次順序切換不同的進程空間並去執行進程中的代碼,一旦代碼中有BUG,就會帶來整個系統的崩潰。以上所說的情景當然是不可能發生的,不過這樣的想象有助於幫助理解概念。
區別了兩個概念,也就知道了進程和線程的使命完全不同。
進程是爲了隔離:
1.隔離不同的應用程序實例。使得一個應用程序崩潰不會影響其它的應用程序
2.隔離應用程序和內核代碼/資源。使得應用程序不會影響內核的穩定性
線程是爲了執行和併發:
1.線程有自己的執行環境,因此爲創建這種環境,線程有自己的開銷
2.線程需要調度,因此有優先級,前臺後臺等概念
3.憋不出第三條了……