進程和線程的區別


進程:

進程是資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。程序運行時系統就會創建一個進程,並為它分配資源,然后把該進程放入進程就緒隊列,進程調度器選中它的時候就會為它分配CPU時間,程序開始真正運行。

線程:

線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現並發操作,每個請求分配一個線程來處理。

二者的區別:

1、進程是資源分配的最小單位,線程是程序執行的最小單位

2、進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。

3、線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。

4、多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。

 

線程掛了,是否會影響進程?

1.進程(主線程)創建了多個線程,多個子線程均擁有自己獨立的棧空間(存儲函數參數、局部變量等),但是多個子線程和主線程共享堆、全局變量等非棧內存。
2.如果子線程的崩潰是由於自己的一畝三分地引起的,那就不會對主線程和其他子線程產生影響,但是如果子線程的崩潰是因為對共享區域造成了破壞,那么大家就一起崩潰了。3.舉個栗子:主線程是一節車廂的乘務員,諸多乘客(也就是子線程)就是經過乘務員(主線程)檢票確定可以進入車廂的,也就是主線程創建了諸多子線程,每個子線程有自己獨立的區域(座位啊啥的),但是諸多乘客和乘務員共享走廊啊衛生間啊等等,如果其中一名乘客座位壞了,摔了(可以認為奔潰了),那么其他乘客和乘務員都不受影響,但是如果乘客將衛生間給破壞了,他也無法使用衛生間(崩潰了),其他乘客和乘務員也不能用衛生間,好吧,那么大家一起憋着吧(崩潰了)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM