1. 程式人生 > 其它 >程序與執行緒的區別

程序與執行緒的區別

程序

  • 程式由指令和資料組成,但這些指令要執行,資料要讀寫,就必須將指令載入至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】的優化。