一:什么是進程
進程是資源(CPU、內存等)分配的基本單位,它是程序執行時的一個實例。
程序運行時系統就會創建一個進程,並為它分配資源,然后把該進程放入進程就緒隊列,
進程調度器選中它的時候就會為它分配CPU時間,程序開始真正運行。
二:什么是線程
線程是程序執行時的最小單位,它是進程的一個執行流,是CPU調度和分派的基本單位。
一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。
線程由CPU獨立調度執行,在多CPU環境下就允許多個線程同時運行。同樣多線程也可以實現並發操作,每個請求分配一個線程來處理。
三:線程和進程各自有什么區別和優劣呢?
1):進程是資源分配的最小單位,線程是程序執行的最小單位。
2):進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。
線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。
3):線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據。
進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
4):但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,
而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
四:多線程五個狀態
新建----->就緒----->運行------>阻塞------->死亡
五:怎么實現多線程
1):繼承Thread類創建線程。
Thread類本質上是實現了Runnable接口的一個實例,代表一個線程的實例。啟動線程的唯一方法就是通過Thread類的start()實例方法。
2):實現Runnable接口創建線程。
3):如果自己的類已經extends另一個類,就無法直接extends Thread,此時,可以實現一個Runnable接口。
4):實現Callable接口通過FutureTask包裝器來創建Thread線程
六:多進程和多線程的區別,如下圖
七:什么時候用多進程,什么時候用多線程
1):需要頻繁創建銷毀的優先用線程。
2):需要進行大量計算的優先使用線程。
3):強相關的處理用線程,弱相關的處理用進程。
什么是強相關、弱相關呢?
舉例:
一般的Server需要完成如下任務:消息收發、消息處理。
“消息收發”和“消息處理”就是弱相關的任務,而“消息處理”里面可能又分為“消息解碼”、
“業務處理”,這兩個任務相對來說相關性就要強多了。
因此“消息收發”和“消息處理”可以分進程設計,“消息解碼”、“業務處理”可以分線程設計。
當然這種划分方式不是一成不變的,也可以根據實際情況進行調整。
4):可能要擴展到多機分布的用進程,多核分布的用線程。