併發程式設計——基礎概念(一)

超Code發表於2021-08-05

本文系作者 chaoCode原創,轉載請私信並在文章開頭附帶作者和原文地址連結。

違者,作者保留追究權利。

前言

併發程式設計在我們日常開發中是時時刻刻都有在用的,只不過大部分的程式碼底層已經幫我們去做了一些併發程式設計的安全處理,但是還是有很多情況下需要我們自己去控制,所以我們需要去了解學習併發程式設計,那麼我們一步一步深入的開始學習。

本篇為概念性的東西,可能比較冗長,請耐心解讀,對於學習併發程式設計之前我們首先要知道這些基本的概念。

基礎概念

1.什麼是程式和執行緒

程式是程式執行資源分配的最小單位
程式是作業系統進行資源分配的最小單位,其中資源包括:CPU、記憶體空間、磁碟 IO 等,同一程式中的多條執行緒共享該程式中的全部系統資源,而程式和程式之間是相互獨立的。程式是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程式是系統進行資源分配和排程的一個獨立單位。
程式是程式在計算機上的一次執行活動。當你執行一個程式,你就啟動了一個程式。顯然,程式是死的、靜態的,程式是活的、動態的。程式可以分為系統進 程和使用者程式。凡是用於完成作業系統的各種功能的程式就是系統程式,它們就是處於執行狀態下的作業系統本身,使用者程式就是所有由你啟動的程式。

執行緒是 CPU 排程的最小單位,必須依賴於程式而存在
執行緒是程式的一個實體,是 CPU 排程和分派的基本單位,它是比程式更小的、能獨立執行的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程式的其他的執行緒共享程式所擁有的全部資源。

執行緒無處不在
任何一個程式都必須要建立執行緒,特別是 Java 不管任何程式都必須啟動一個 main 函式的主執行緒; Java Web 開發裡面的定時任務、定時器、JSP 和 Servlet、非同步訊息處理機制,遠端訪問介面RM等,任何一個監聽事件, onclick的觸發事件等都離不開執行緒和併發的知識。

x.png

2.CPU核心數和執行緒數的關係

多核心:也指單晶片多處理器( Chip Multiprocessors,簡稱 CMP),CMP 是由美國 史丹佛大學提出的,其思想是將大規模並行處理器中的 SMP(對稱多處理器)整合 到同一晶片內,各個處理器並行執行不同的程式。這種依靠多個 CPU 同時並行地執行程式是實現超高速計算的一個重要方向,稱為並行處理

多執行緒: Simultaneous Multithreading.簡稱 SMT.讓同一個處理器上的多個執行緒同步執行並共享處理器的執行資源。

核心數、執行緒數:目前主流 CPU 都是多核的。增加核心數目就是為了增加執行緒數,因為作業系統是通過執行緒來執行任務的,一般情況下它們是 1:1 對應關係,也 就是說四核 CPU 一般擁有四個執行緒。但 Intel 引入超執行緒技術後,使核心數與執行緒 數形成 1:2 的關係。

image.png

3.CPU 時間片輪轉機制

我們平時在開發的時候,感覺並沒有受 cpu 核心數的限制,想啟動執行緒就啟動執行緒,哪怕是在單核 CPU 上,為什麼?這是因為作業系統提供了一種 CPU 時間片輪轉機制。

時間片輪轉排程是一種最古老、最簡單、最公平且使用最廣的演算法,又稱 RR 排程。每個程式被分配一個時間段,稱作它的時間片,即該程式允許執行的時間。

切換.jpg
百度百科對 CPU 時間片輪轉機制原理解釋如下:

如果在時間片結束時程式還在執行,則 CPU 將被剝奪並分配給另一個程式。如果程式在時間片結束前阻塞或結來,則 CPU 當即進行切換。排程程式所要做的就是維護一張就緒程式列表,當程式用完它的時間片後,它被移到佇列的末尾

時間片輪轉排程中唯一有趣的一點是時間片的長度。從一個程式切換到另一個程式是需要定時間的,包括儲存和裝入暫存器值及記憶體映像,更新各種表格和佇列等。假如程式切(processwitch),有時稱為上下文切換( context switch),需要 5ms, 再假設時間片設為 20ms,則在做完 20ms 有用的工作之後,CPU 將花費 5ms 來進行程式切換。CPU 時間的 20% 被浪費在了管理開銷上了。

為了提高 CPU 效率,我們可以將時間片設為 5000ms。這時浪費的時間只有 0.1%。但考慮到在一個分時系統中,如果有 10 個互動使用者幾乎同時按下Enter鍵,將發生什麼情況?假設所有其他程式都用足它們的時間片的話,最後一個不幸的程式不得不等待 5s 才獲得執行機會。多數使用者無法忍受一條簡短命令要 5 才能做出響應,同樣的問題在一臺支援多道程式的個人計算機上也會發生。

結論可以歸結如下:時間片設得太短會導致過多的程式切換,降低了 CPU 效率: 而設得太長又可能引起對短的互動請求的響應變差。將時間片設為 100ms 通常是一個比較合理的折衷。

在 CPU 當機的情況下,其實大家不難發現當執行一個程式的時候把 CPU 給弄 到了 100%再不重啟電腦的情況下,其實我們還是有機會把它Kill掉的,我想也正是因為這種機制的緣故。

時間片.jpg

感謝諸君的觀看,文中如有紕漏,歡迎在評論區來交流。如果這篇文章幫助到了你,歡迎點贊?和關注。

相關文章