執行緒和程序的基礎
一. 什麼叫程序和執行緒
(1)什麼叫程序
程序是系統資源分配和排程的基本單位。
(2)什麼叫執行緒
執行緒是程序的一個實體,執行緒本身不會獨立存在。執行緒是CPU分配的基本單位。
二. 程序間如何通訊?執行緒間如何通訊?
(1)程序間如何通訊?
程序和程序通訊(指不同程序之間進行傳播或交換資訊),是依靠IPC資源進行通訊的。例如:管道、Socket、訊息佇列、訊號量、共享儲存和Streams等。
(2)執行緒間如何通訊?
執行緒和執行緒通訊,是依靠JVM提供的API進行通訊。
例如:
(a)通過共享變數來實現通訊(通過wait、notify、notifyAll函式實現共享變數的通訊);
(b)通過佇列共享記憶體來實現消費者和生產者的模式來進行通訊。
三. 程序和執行緒的區別
除了上述(1)(2)的區別之外,還有:
執行緒上下文切換比程序上下文切換要快得多。主要以下兩點:
(a)程序切換時,涉及到當前程序的 CPU 環境的儲存和新被排程執行程序的 CPU 環境的設定。
(b)執行緒切換僅需要儲存和設定少量的暫存器內容,不涉及儲存管理方面的操作。
參考資料:https://www.cnblogs.com/feiyumo/p/9168264.html
備註:上下文切換的概念
上下文切換:為了讓使用者感覺多個執行緒是在同時執行,CPU資源的分配採用了時間片輪轉的策略,也就是給每一個執行緒分配一個時間片,執行緒在時間片內佔用執行任務。當執行緒使用完時間片之後,就會處於就緒狀態並讓出CPU讓其它執行緒使用,這就是上下文切換。
注意:上下文切換容易導致死鎖。
四.多執行緒
(1)多執行緒是如何工作?
執行緒是佔用CPU執行的基本單位,而CPU一般是使用時間片輪轉方式讓執行緒輪詢佔用的,所以當前執行緒CPU時間片佔用完之後,要讓出CPU,等待下次輪到自己的時候再執行。
**引出問題:**執行緒如何知道之前的程式執行到哪裡了,自己如何接著執行程式?
**解決方案:**每個執行緒都有自己的一個程式計數器和棧區域。
(a)程式計數器是一塊記憶體區域,用來記錄執行緒讓出CPU時的執行地址,因此,當該執行緒再次被分配到時間片的時候,它會從自己私有的計數器取出上次讓出CPU時的地址,繼續執行。
(b)棧區域:每個執行緒都有自己的棧資源,用來存放該執行緒私有的區域性變數,此外,還存放該執行緒的呼叫棧幀。
五.多執行緒和單執行緒的區別和聯絡
(1)在單核CPU中,將CPU分為很小的時間片,在每一時間片內只能有一個執行緒在執行。
(2)由於多執行緒存在上下文切換,因此,多行執行緒執行的速度會變慢。