1. 程式人生 > 其它 >slice和splice的區別

slice和splice的區別

老生常談的話題了,但是總是說不明白。
先來丟一段八股文:

  • 程序是資源分配的最小單位,有自己獨立的地址空間(address space)
    執行緒是程式執行的最小單位,沒有獨立的地址空間
  • 一個程序可以包含多個執行緒,至少一個執行緒。
  • 因為地址空間分配,導致不同的程序間通訊非常困難,但是一個程序中的不同執行緒通訊非常方便
  • 執行緒共享本程序的資源如記憶體、I/O、cpu等,而程序之間的資源是獨立的,能很好的進行資源管理和保護。
    是什麼
    程序和執行緒是不同概念,那麼這個概念是怎麼劃分出來的?
    從功能來說:執行緒是一組執行同一場景下的任務。程序是不場景所進行的任務。
    從執行來說:
  • 無論執行緒還是程序,CPU排程時都是要進行進行上下文(暫存器、相關變數、環境)的切換。但是執行緒是程序的子任務,執行緒的一部分上下文一定是基於程序的,這就是共享
    的概念來源。這就是八股文的第四點和第一點。
  • 這麼說來,可以理解為程序是虛的,沒有不存線上程的程序。因為一個程序必須至少有一個執行緒。那麼我們因為就理解了,就算是程序之間進行切換,也是把本執行緒的程序切換到其他程序的執行緒,本質還是執行緒的切換。這就是八股文的第一點。
  • 程序之間由於場景差異較大,因此上下文就差異較大,因此程序切換的開銷就會大於執行緒切換的開銷

為什麼
原本是單程序,很容易受到IO的限制,CPU空閒。那麼改進,變成多程序進行上下文切換。但是,顯然有一些程序之間的功能相似,環境相似,那麼就把他們組織起來,共享一部分相同的資源,這就是執行緒。這樣CPU在切換時,如果儘量在多執行緒之間切換,就會減少上下文切換開銷。而不是隨機挑選程序切換,導致上下文變化很大。

怎麼用
JAVA一個專案就可以理解為一個程序,那麼一個專案內的多個任務自然就叫做多執行緒。以前一直不理解JAVA多執行緒為什麼不叫多程序,現在想來,根本就沒有多程序這一東西。程序是對於作業系統排程而言的。對於程式本身,實際上沒有程序的概念,一組執行緒組合起來,那就是程序了。