併發要理解的程式、執行緒、協程,附併發程式設計72道面試題答案

Java架構解析發表於2019-02-28

一、程式

1.什麼是程式?

程式是作業系統進行資源分配和排程的基本概念,可以說程式是執行緒的容器,一個程式裡包括資料區域和堆疊儲存著活動過程呼叫的指令和本地的變數,程式沒執行時候處於沒有生命的一個實體的狀態,執行時依賴處理器給他活體狀,一個程式至少有一個執行緒,如果沒有的話那麼這個執行緒就是它本身。

文末領取併發程式設計72道面試題及答案

一、多程式的概念

理論上一個CPU只能給一個程式,如果想一個CPU執行多個程式的話,那就是多程式,就要使用併發技術,實現併發技術非常複雜,說一下簡單的併發技術 "時間片輪轉程式排程演算法" 在作業系統的管理下,所有正在執行的程式輪流使用CPU,每個程式允許佔用CPU的時間非常短(比如10ms),這樣使用者根本感覺不出來 CPU是在輪流為多個程式服務,但實際上在任何一個時間內有且僅有一個程式佔有CPU。 如果一臺計算機有多個CPU,情況就不同了,如果程式數大於CPU數的時候,使用這種併發技術。目前都是幾核的CPU都能夠處理。

同時,這兩種上下文切換的處理都是通過作業系統核心來完成的。核心的這種切換過程伴隨的最顯著的效能損耗是將暫存器中的內容切換出。

2.什麼是執行緒?

執行緒是程式執行流的最小單元,一個執行緒的資訊包括(執行緒ID,指令集合,堆疊組)組成的執行緒這種單位,上面程式提到程式是執行緒的一個容器,說明執行緒執行在程式裡面的,那就是執行在程式裡面的一個實體,它不擁有系統資源,但它擁有程式的資源。

一、執行緒的三種狀態

1.就緒狀態:

是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機的過程。

2.阻塞狀態:

是指執行緒在等待某一個事件(訊號量)。

3.執行狀態:

是指執行緒佔有處理機正在執行。

二、多執行緒

同時執行多個執行緒完成不同的工作,就叫做多執行緒,使用多執行緒的好處有:

1.資源利用率更好: 想象一下,一個應用程式需要從本地檔案系統中讀取和處理檔案的情景。比方說,從磁碟讀取一個檔案需要5秒,處理一個檔案需要2秒。處理兩個檔案則需要14s,在這段時間裡,CPU非常的空閒,它可以做一些別的事情,那麼我們使用多個執行緒的話,是不是可以處理檔案的同時去讀取新的檔案,這樣就提高了時間效率,

2.程式響應更快:假設做某一個服務的時候,它在某一個埠監聽進來的請求,當一個請求到來時,它去處理這個請求,然後再返回去監聽。

3.程式設計簡單

做多執行緒的時候運用多執行緒的技術設計非常簡單易用,遵循好一些規則,避免造成阻塞等操作,基本可以很快設計程式的需求。

4.使用場景:

多執行緒:密集I/O任務(網路I/O,磁碟I/O,資料庫I/O)使用多執行緒合適。

三、執行緒與執行緒主要依靠什麼通訊

執行緒間通訊主要通過共享記憶體

3.什麼是協程?

一個程式可以包含多個協程,執行緒相對獨立有自己的上下文,協程也是,但是協程由自己控制,不受作業系統控制,可以不加鎖的訪問全域性變數,所以上下文的切換非常快,可以說是輕量級的執行緒,也可以說稱之為使用者級別的執行緒就叫協程,一個執行緒可以多個協程,一個程式也可以單獨擁有多個協程,執行緒程式都是同步機制,而協程則是非同步。

1.使用場景:

又稱微執行緒,在單執行緒上執行多個任務,用函式切換,開銷極小。不通過作業系統排程,沒有程式、執行緒的切換開銷。genventmonkey.patchall

多執行緒請求返回是無序的,那個執行緒有資料返回就處理那個執行緒,而協程返回的資料是有序的,處理磁碟的I/O比較慢,處理網路I/O效能還是比較高。

4.程式執行緒上下文切換

順便說一下上下文切換上下文切換就是從當前執行任務切換到另一個任務執行的過程。但是,為了確保下次能從正確的位置繼續執行,在切換之前,會儲存上一個任務的狀態。程式上下文切換與執行緒上下文切換最主要的區別就是執行緒的切換虛擬空間記憶體是相同的(因為都是屬於自己的程式),但是,程式切換的虛擬空間記憶體則是不同的。同時,這兩種上下文切換的處理都是通過作業系統核心來完成的。

併發要理解的程式、執行緒、協程,附併發程式設計72道面試題答案


上面畫了一個程式,執行緒,協程的呼叫關係圖。

最後送福利了,加群即可獲取併發程式設計72題及答案 群號:923116658

點選連結加入群聊【Java架構解析】:https://jq.qq.com/?_wv=1027&k=5e1QsXb

還有Java工程化、高效能及分散式、高效能、高架構、效能調優、Spring、MyBatis、Netty原始碼分析等多個知識點高階進階乾貨的相關視訊資料,還有spring和虛擬機器等書籍掃描版,還有更多面試題等你來拿。


相關文章