程序與執行緒的區別
阿新 • • 發佈:2022-03-03
程序
- 程式由指令和資料組成,但這些指令要執行,資料要讀寫,就必須將指令載入至CPU,資料載入至記憶體。在指令執行過程中還需要用到磁碟、網路等裝置。程序就是用來載入指令、管理記憶體、管理IO的。
- 當一個程式被執行,從磁碟載入這個程式的程式碼至記憶體,這時就開啟了一個程序。
- 程序就可以視為程式的一個例項,大部分程式可以同時執行多個例項程序(例如記事本,畫圖,瀏覽器等),也有的程式只能啟動一個例項程序(例如 360安全衛士)
執行緒
- 一個程序之內可以分為1到多個執行緒
- 一個執行緒就是一個指令流,將指令流的一條條指令以一定的順序交給CPU執行。
- Java中,執行緒作為最小排程單位,程序作為最小資源分配單位。在windows中程序是不活動的,只是作為執行緒的容器。
二者對比
- 程序基本上相互獨立的,而執行緒存在於程序內,是程序的一個子集。
- 程序擁有共享的資源,如記憶體空間等,供其內部的執行緒共享。
- 程序間通訊較為複雜
- 同一臺計算機的程序通訊稱為IPC(Inter-process communication)
- 不同計算機之間的程序通訊,需要通過網路,並遵守共同的協議,例如http
- 執行緒通訊相對簡單,因為它們共享程序內的記憶體,一個例子是多個執行緒可以訪問同一個共享變數
- 執行緒更輕量,執行緒上下文切換成本一般上要比程序上下文切換低。
並行與併發
單核cpu下,執行緒實際還是序列執行的。作業系統中有一個元件叫做任務排程器,將cpu的時間片(windows下時間片最小約為15毫秒)分給不同的執行緒使用,只是由於cpu線上程間(時間片很短)的切換非常快,人類感覺就是同時執行的,總結為一句話:微觀序列,巨集觀並行。
一般會將這種執行緒輪流使用CPU的做法稱為併發,concurrent
多核CPU下,每個核都可以排程執行執行緒,真正同一時刻執行 稱為並行。
應用
非同步呼叫:
從方法呼叫的角度來講,如果
- 需要等待結果返回,才能繼續執行就是同步
- 不需要等待結果返回,就能繼續執行就是非同步
注意:同步在多執行緒中還有另外一層意思,是讓多個執行緒步調一致。
專案中,視訊檔案需要轉換格式等操作比較費時,這時開一個新執行緒處理視訊轉換,避免阻塞主執行緒。
tomcat的非同步servlet,讓使用者執行緒處理耗時較長的操作,避免阻塞tomcat的工作執行緒
ui程式中,開執行緒進行其他操作,避免ui阻塞。
多核CPU才能提高效率,單核仍然是輪流執行。
測試工具:JMH 它會執行程式預熱,執行多次測試並平均
IO操作不佔用cpu,只是我們一般拷貝檔案使用的是【阻塞IO】,這時相當於執行緒雖然不用CPU,但需要一直等待IO結束,沒能充分利用執行緒。所以才有後面的【非阻塞IO】和【非同步IO】的優化。