Java併發(一)----進程、線程、並行、併發

一、進程與線程

進程

  • 程序由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令加載至 CPU,數據加載至內存。在指令運行過程中還需要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理 IO 的

  • 當一個程序被運行,從磁盤加載這個程序的代碼至內存,這時就開啓了一個進程。

  • 進程就可以視爲程序的一個實例。大部分程序可以同時運行多個實例進程(例如記事本、畫圖、瀏覽器等),也有的程序只能啓動一個實例進程(例如網易雲音樂、360 安全衛士等)

線程

  • 一個進程之內可以分爲一到多個線程。

  • 一個線程就是一個指令流,將指令流中的一條條指令以一定的順序交給 CPU 執行

  • Java 中,線程作爲最小調度單位,進程作爲資源分配的最小單位。 在 windows 中進程是不活動的,只是作爲線程的容器

二者對比

  • 進程基本上相互獨立的,而線程存在於進程內,是進程的一個子集

  • 進程擁有共享的資源,如內存空間等,供其內部的線程共享

  • 進程間通信較爲複雜

    • 同一臺計算機的進程通信稱爲 IPC(Inter-process communication)

    • 不同計算機之間的進程通信,需要通過網絡,並遵守共同的協議,例如 HTTP

  • 線程通信相對簡單,因爲它們共享進程內的內存,一個例子是多個線程可以訪問同一個共享變量

  • 線程更輕量,線程上下文切換成本一般上要比進程上下文切換低

二、並行與併發

單核 cpu 下,線程實際還是 串行執行 的。操作系統中有一個組件叫做任務調度器,將 cpu 的時間片(windows 下時間片最小約爲 15 毫秒)分給不同的線程使用,只是由於 cpu 在線程間(時間片很短)的切換非常快,人類感覺是 同時運行的 。總結爲一句話就是:微觀串行,宏觀並行

一般會將這種 線程輪流使用 CPU 的做法稱爲併發,對應的英文單詞爲 concurrent

CPU 時間片 1 時間片 2 時間片 3 時間片 4
core 線程 1 線程 2 線程 3 線程 4

多核 cpu下,每個 核(core)都可以調度運行線程,這時候線程可以是並行的。對應的英文爲parallel。在時間片1中,線程1與線程2可以同一時間執行。

CPU 時間片 1 時間片 2 時間片 3 時間片 4
core 1 線程 1 線程 1 線程 3 線程 3
core 2 線程 2 線程 4 線程 2 線程 4

引用 Rob Pike 的一段描述:

  • 併發(concurrent)是同一時間應對(dealing with)多件事情的能力

  • 並行(parallel)是同一時間動手做(doing)多件事情的能力

例子

  • 家庭主婦做飯、打掃衛生、給孩子餵奶,她一個人輪流交替做這多件事,這時就是併發

  • 家庭主婦僱了個保姆,她們一起這些事,這時既有併發,也有並行

    • 保姆做飯,主婦餵奶,並行

    • 保姆做飯、打掃衛生,併發

  • 僱了3個保姆,一個專做飯、一個專打掃衛生、一個專餵奶,互不干擾,這時是並行

  • 在實際的應用過程中一般既有併發也有並行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章