雖然這是一個小問題,但很多人并沒有說清楚。要了解這個就要明白它們出現(xiàn)的歷史。
如果操作系統(tǒng)同一時間只執(zhí)行一個程序,那么當這個程序進行IO操作等耗時事件時,CPU是空閑的,所以引入了進程,操作系統(tǒng)讓CPU可以同時處理多個程序,當一個進程阻塞,可以切換去執(zhí)行另外的進程,從而充分利用。
這個時候一個進程代表一部分資源和一個任務(wù)。在任務(wù)切換的時候,資源就要跟隨切換,包括cpu的狀態(tài)、寄存器的數(shù)據(jù)、地址空間等,當進程東西越來越多,這樣的資源切換就會耗費巨大。
這個時候引入了線程,就是依然按進程分配資源,但是按線程分配任務(wù)。這就是所謂的“進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。這時任務(wù)切換,如果還在一個進程里,那么資源就不需要切換,消耗就減少了。而且很多時候都是在一段時間內(nèi)一直用一個進程,有這樣的“局部性”的特性在。
這就是它們的主要區(qū)別:它們出現(xiàn)的原因不同,解決的問題不同。進程是為了并發(fā)執(zhí)行任務(wù)而來,線程是為了更輕量的、更高效的執(zhí)行多任務(wù)而來。
多說一句:虛擬內(nèi)存機制的設(shè)計,使得在進程的世界里,它擁有所有的內(nèi)存,它的眼里是沒有其他進程的。每個進程之間就像是平行世界,他們各自獨立存在。而線程是共享內(nèi)存的,在A線程里的地址0x12345678跟B線程的0x12345678是同一個東西,這樣才有了合作和資源競爭。