1. 程式人生 > 其它 >一、程序與執行緒

一、程序與執行緒

一、程序和執行緒的定義

1. 程序

程序是執行程式的一次從建立到消亡的過程。程式本身只是指令和資料的有序集合,是一個靜態概念。而程序是一個動態的概念,是系統資源分配的單位。

注:一個程序只能對應一個程式,而一個程式可以對應多個程序

2. 執行緒

執行緒是一個比程序更小的執行單位,一個程序在執行過程中可以產生多個執行緒,當然也至少會存在一個執行緒,否則程序就沒有存在的意義。執行緒是CPU排程和執行的單位。

注:真正的多執行緒是指有多個CPU,即多核。很多多執行緒是模擬出來的,即在一個CPU的情況下,在同一個時間點,CPU只能執行一個程式碼,因為切換的很快,所以就有同時執行的錯覺。

二、Java中的程序與執行緒

1. 需要注意的點

  • 執行緒就是獨立的執行路徑
  • 在程式執行時,即使自己沒有建立執行緒,後臺也會有多個執行緒,如主執行緒、GC執行緒
  • main() 稱之為主執行緒,是系統的入口,用於執行整個程式
  • 在一個程序中,如果開闢了多個執行緒,執行緒的執行由排程器安排排程。排程器與作業系統密切相關,先後順序不能人為干預
  • 對同一份資源操作時,會存在資源搶奪問題,需要加入併發控制
  • 執行緒會帶來額外的開銷,如CPU排程時間、併發控制開銷
  • 每個執行緒在自己的工作記憶體互動,記憶體控制不當會造成資料不一致

2. 程序與執行緒的關係

由圖可以看出:

  • 一個程序可以有多個執行緒,多個執行緒共享程序的堆和方法區中的資源
  • 每個執行緒都有自己的程式計數器、Java虛擬機器棧和本地方法棧
  • 兩者最大的不同是各程序基本上都是獨立的,而各執行緒則不一定,因為同一程序中的執行緒極有可能互相影響
  • 執行緒執行開銷小,但不利於資源的管理和保護,而程序相反

三、小結

  • 程序的出現讓作業系統的併發成為了可能,而執行緒的出現則讓程序內部的併發成為了可能
  • 既然多程序可以實現併發,那麼使用多執行緒的好處在於:
    • 通常情況下會用到共享資源,而執行緒間通訊比程序間的通訊簡單
    • 執行緒比程序更輕量,開銷更小

四、擴充套件

  • 上下文切換是指從一個程序(或執行緒)切換到另一個程序(或執行緒)
  • 上下文是指某一時間點 CPU 暫存器和程式計數器的內容
    • 暫存器是 CPU 內部的快閃記憶體,通常儲存和訪問計算過程的中間值
    • 程式計數器是一個專用的暫存器,儲存正在執行的指令的位置或下一個將要被執行的指令的位置(在 Java 中的實現可參考 JVM 相關內容)
  • 上下文切換通常是計算密集型的,意味著會消耗大量時間,所以執行緒並不是越多越好。在實現多執行緒的同時減少上下文切換次數才是重點