天天看點

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

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

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

前言

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

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

基礎概念

1.什麼是程序和線程

程序是程式運作資源配置設定的最小機關

程序是作業系統進行資源配置設定的最小機關,其中資源包括:CPU、記憶體空間、磁盤 IO 等,同一程序中的多條線程共享該程序中的全部系統資源,而程序和程序之間是互相獨立的。程序是具有一定獨立功能的程式關于某個資料集合上的一次運作活動,程序是系統進行資源配置設定和排程的一個獨立機關。

程序是程式在計算機上的一次執行活動。當你運作一個程式,你就啟動了一個程序。顯然,程式是死的、靜态的,程序是活的、動态的。程序可以分為系統進 程和使用者程序。凡是用于完成作業系統的各種功能的程序就是系統程序,它們就是處于運作狀态下的作業系統本身,使用者程序就是所有由你啟動的程序。

線程是 CPU 排程的最小機關,必須依賴于程序而存在

線程是程序的一個實體,是 CPU 排程和分派的基本機關,它是比程序更小的、能獨立運作的基本機關。線程自己基本上不擁有系統資源,隻擁有一點在運作中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個程序的其他的線程共享程序所擁有的全部資源。

線程無處不在

任何一個程式都必須要建立線程,特别是 Java 不管任何程式都必須啟動一個 main 函數的主線程; Java Web 開發裡面的定時任務、定時器、JSP 和 Servlet、異步消息處理機制,遠端通路接口RM等,任何一個監聽事件, onclick的觸發事件等都離不開線程和并發的知識。

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

2.CPU核心數和線程數的關系

多核心:也指單晶片多處理器( Chip Multiprocessors,簡稱 CMP),CMP 是由美國 斯坦福大學提出的,其思想是将大規模并行處理器中的 SMP(對稱多處理器)內建 到同一晶片内,各個處理器并行執行不同的程序。這種依靠多個 CPU 同時并行地運作程式是實作超高速計算的一個重要方向,稱為并行處理

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

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

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

3.CPU 時間片輪轉機制

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

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

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

百度百科對 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掉的,我想也正是因為這種機制的緣故。

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

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