­

並發編程——基礎概念(一)

本文系作者 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 個交互用戶幾乎同時按下回車鍵,將發生什麼情況?假設所有其他進程都用足它們的時間片的話,最後一個不幸的進程不得不等待 5s 才獲得運行機會。多數用戶無法忍受一條簡短命令要 5 才能做出響應,同樣的問題在一台支持多道程序的個人計算機上也會發生。

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

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

時間片.jpg

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